Lewy Blue 7 years ago
parent
commit
2336516328
1 changed files with 128 additions and 121 deletions
  1. 128 121
      examples/js/loaders/FBXLoader.js

+ 128 - 121
examples/js/loaders/FBXLoader.js

@@ -667,9 +667,10 @@
 
 
 		var subNodes = geometryNode.subNodes;
 		var subNodes = geometryNode.subNodes;
 
 
-		var vertexBuffer = subNodes.Vertices.properties.a;
-		var indexBuffer = subNodes.PolygonVertexIndex.properties.a;
+		var vertexPositions = subNodes.Vertices.properties.a;
+		var vertexIndices = subNodes.PolygonVertexIndex.properties.a;
 
 
+		// create arrays to hold the final data used to build the buffergeometry
 		var vertexB = [];
 		var vertexB = [];
 		var normalB = [];
 		var normalB = [];
 		var colorsB = [];
 		var colorsB = [];
@@ -678,12 +679,21 @@
 		var weightsB = [];
 		var weightsB = [];
 		var weightsIndicesB = [];
 		var weightsIndicesB = [];
 
 
+		if ( subNodes.LayerElementColor ) {
+
+			var colorInfo = getColors( subNodes.LayerElementColor[ 0 ] );
+
+		}
+
+		if ( subNodes.LayerElementMaterial ) {
+
+			var materialInfo = getMaterials( subNodes.LayerElementMaterial[ 0 ] );
+
+		}
+
 		if ( subNodes.LayerElementNormal ) {
 		if ( subNodes.LayerElementNormal ) {
 
 
 			var normalInfo = getNormals( subNodes.LayerElementNormal[ 0 ] );
 			var normalInfo = getNormals( subNodes.LayerElementNormal[ 0 ] );
-			var normalBuffer = normalInfo.buffer;
-
-			// console.log( normalInfo )
 
 
 		}
 		}
 
 
@@ -700,18 +710,6 @@
 
 
 		}
 		}
 
 
-		if ( subNodes.LayerElementColor ) {
-
-			var colorInfo = getColors( subNodes.LayerElementColor[ 0 ] );
-			var colorBuffer = colorInfo.buffer;
-
-		}
-
-		if ( subNodes.LayerElementMaterial ) {
-
-			var materialInfo = getMaterials( subNodes.LayerElementMaterial[ 0 ] );
-
-		}
 
 
 		var weightTable = {};
 		var weightTable = {};
 
 
@@ -742,22 +740,21 @@
 
 
 		}
 		}
 
 
-		var faceVertexBuffer = [];
 		var polygonIndex = 0;
 		var polygonIndex = 0;
 		var faceLength = 0;
 		var faceLength = 0;
 		var displayedWeightsWarning = false;
 		var displayedWeightsWarning = false;
 
 
+		// these will hold data for a single face
 		var vertexPositionIndexes = [];
 		var vertexPositionIndexes = [];
 		var faceNormals = [];
 		var faceNormals = [];
 		var faceColors = [];
 		var faceColors = [];
 		var faceUVs = [];
 		var faceUVs = [];
-    var faceMaterials = [];
-    var faceWeights = [];
-    var faceWeightIndices = [];
+		var faceWeights = [];
+		var faceWeightIndices = [];
 
 
-		for ( var polygonVertexIndex = 0; polygonVertexIndex < indexBuffer.length; polygonVertexIndex ++ ) {
+		for ( var polygonVertexIndex = 0; polygonVertexIndex < vertexIndices.length; polygonVertexIndex ++ ) {
 
 
-			var vertexIndex = indexBuffer[ polygonVertexIndex ];
+			var vertexIndex = vertexIndices[ polygonVertexIndex ];
 
 
 			var endOfFace = false;
 			var endOfFace = false;
 
 
@@ -771,7 +768,7 @@
 			if ( vertexIndex < 0 ) {
 			if ( vertexIndex < 0 ) {
 
 
 				vertexIndex = vertexIndex ^ - 1; // equivalent to ( x * -1 ) - 1
 				vertexIndex = vertexIndex ^ - 1; // equivalent to ( x * -1 ) - 1
-				indexBuffer[ polygonVertexIndex ] = vertexIndex;
+				vertexIndices[ polygonVertexIndex ] = vertexIndex;
 				endOfFace = true;
 				endOfFace = true;
 
 
 			}
 			}
@@ -781,6 +778,14 @@
 
 
 			vertexPositionIndexes.push( vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2 );
 			vertexPositionIndexes.push( vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2 );
 
 
+			if ( colorInfo ) {
+
+				var data = getData( polygonVertexIndex, polygonIndex, vertexIndex, colorInfo );
+
+				faceColors.push( data[ 0 ], data[ 1 ], data[ 2 ] );
+
+			}
+
 			if ( deformer ) {
 			if ( deformer ) {
 
 
 				if ( weightTable[ vertexIndex ] !== undefined ) {
 				if ( weightTable[ vertexIndex ] !== undefined ) {
@@ -846,8 +851,8 @@
 
 
 				for ( var i = 0; i < 4; ++ i ) {
 				for ( var i = 0; i < 4; ++ i ) {
 
 
-					faceWeights.push( weights[ i ] )
-					faceWeightIndices.push(weightIndices[ i ] )
+					faceWeights.push( weights[ i ] );
+					faceWeightIndices.push( weightIndices[ i ] );
 
 
 				}
 				}
 
 
@@ -867,89 +872,82 @@
 
 
 					var data = getData( polygonVertexIndex, polygonIndex, vertexIndex, uvInfo[ i ] );
 					var data = getData( polygonVertexIndex, polygonIndex, vertexIndex, uvInfo[ i ] );
 
 
-					if( faceUVs[i] === undefined ) faceUVs[ i ] = [];
+					if ( faceUVs[ i ] === undefined ) faceUVs[ i ] = [];
 
 
 					faceUVs[ i ].push(
 					faceUVs[ i ].push(
-						data[ 0 ],
-						data[ 1 ],
-					);
+              data[ 0 ],
+              data[ 1 ]
+            );
 
 
 				}
 				}
 
 
 			}
 			}
 
 
-			if ( colorInfo ) {
-
-				var data = getData( polygonVertexIndex, polygonIndex, vertexIndex, colorInfo );
-
-				vertex.color.fromArray( data );
-
-				faceColors.push( data[ 0 ], data[ 1 ], data[ 2 ] );
-
-			}
-
-
 			faceLength ++;
 			faceLength ++;
 
 
+			// we have reached the end of a face - it may have 4 sides though
+			// in which case the data is split into to represent 3 sides faces
 			if ( endOfFace ) {
 			if ( endOfFace ) {
 
 
 				for ( var i = 2; i < faceLength; i ++ ) {
 				for ( var i = 2; i < faceLength; i ++ ) {
 
 
 					vertexB.push(
 					vertexB.push(
-						vertexBuffer[ vertexPositionIndexes[ 0 ] ],
-						vertexBuffer[ vertexPositionIndexes[ 1 ] ],
-						vertexBuffer[ vertexPositionIndexes[ 2 ] ],
+						vertexPositions[ vertexPositionIndexes[ 0 ] ],
+						vertexPositions[ vertexPositionIndexes[ 1 ] ],
+						vertexPositions[ vertexPositionIndexes[ 2 ] ],
 
 
-						vertexBuffer[ vertexPositionIndexes[ ( i - 1 ) * 3 ] ],
-						vertexBuffer[ vertexPositionIndexes[ ( i - 1 ) * 3 + 1 ] ],
-						vertexBuffer[ vertexPositionIndexes[ ( i - 1 ) * 3 + 2 ] ],
+						vertexPositions[ vertexPositionIndexes[ ( i - 1 ) * 3 ] ],
+						vertexPositions[ vertexPositionIndexes[ ( i - 1 ) * 3 + 1 ] ],
+						vertexPositions[ vertexPositionIndexes[ ( i - 1 ) * 3 + 2 ] ],
 
 
-						vertexBuffer[ vertexPositionIndexes[ i * 3 ] ],
-						vertexBuffer[ vertexPositionIndexes[ i * 3 + 1 ] ],
-						vertexBuffer[ vertexPositionIndexes[ i * 3 + 2 ] ]
+						vertexPositions[ vertexPositionIndexes[ i * 3 ] ],
+						vertexPositions[ vertexPositionIndexes[ i * 3 + 1 ] ],
+						vertexPositions[ vertexPositionIndexes[ i * 3 + 2 ] ]
           );
           );
 
 
-        }
-
-        if ( deformer ) {
+				}
 
 
-          for (var i = 2; i < faceLength; i++) {
-            weightsB.push(
-              faceWeights[0],
-              faceWeights[1],
-              faceWeights[2],
-              faceWeights[3],
+				if ( deformer ) {
 
 
-              faceWeights[(i - 1) * 4],
-              faceWeights[(i - 1) * 4 + 1],
-              faceWeights[(i - 1) * 4 + 2],
-              faceWeights[(i - 1) * 4 + 3],
+					for ( var i = 2; i < faceLength; i ++ ) {
 
 
-              faceWeights[i * 4],
-              faceWeights[i * 4 + 1],
-              faceWeights[i * 4 + 2],
-              faceWeights[i * 4 + 3]
+						weightsB.push(
+              faceWeights[ 0 ],
+              faceWeights[ 1 ],
+              faceWeights[ 2 ],
+              faceWeights[ 3 ],
+
+              faceWeights[ ( i - 1 ) * 4 ],
+              faceWeights[ ( i - 1 ) * 4 + 1 ],
+              faceWeights[ ( i - 1 ) * 4 + 2 ],
+              faceWeights[ ( i - 1 ) * 4 + 3 ],
+
+              faceWeights[ i * 4 ],
+              faceWeights[ i * 4 + 1 ],
+              faceWeights[ i * 4 + 2 ],
+              faceWeights[ i * 4 + 3 ]
             );
             );
 
 
-            weightsIndicesB.push(
-              faceWeightIndices[0],
-              faceWeightIndices[1],
-              faceWeightIndices[2],
-              faceWeightIndices[3],
-
-              faceWeightIndices[(i - 1) * 4],
-              faceWeightIndices[(i - 1) * 4 + 1],
-              faceWeightIndices[(i - 1) * 4 + 2],
-              faceWeightIndices[(i - 1) * 4 + 3],
-
-              faceWeightIndices[i * 4],
-              faceWeightIndices[i * 4 + 1],
-              faceWeightIndices[i * 4 + 2],
-              faceWeightIndices[i * 4 + 3]
+						weightsIndicesB.push(
+              faceWeightIndices[ 0 ],
+              faceWeightIndices[ 1 ],
+              faceWeightIndices[ 2 ],
+              faceWeightIndices[ 3 ],
+
+              faceWeightIndices[ ( i - 1 ) * 4 ],
+              faceWeightIndices[ ( i - 1 ) * 4 + 1 ],
+              faceWeightIndices[ ( i - 1 ) * 4 + 2 ],
+              faceWeightIndices[ ( i - 1 ) * 4 + 3 ],
+
+              faceWeightIndices[ i * 4 ],
+              faceWeightIndices[ i * 4 + 1 ],
+              faceWeightIndices[ i * 4 + 2 ],
+              faceWeightIndices[ i * 4 + 3 ]
             );
             );
-          }
 
 
-        }
+					}
+
+				}
 
 
 				if ( normalInfo ) {
 				if ( normalInfo ) {
 
 
@@ -975,22 +973,22 @@
 
 
 				if ( uvInfo ) {
 				if ( uvInfo ) {
 
 
-					for (var j = 0; j < uvInfo.length; j++) {
+					for ( var j = 0; j < uvInfo.length; j ++ ) {
 
 
-						if ( uvsB[ j ] === undefined) uvsB[ j ] = [];
+						if ( uvsB[ j ] === undefined ) uvsB[ j ] = [];
 
 
-						for ( var i = 2; i < faceLength; i++ ) {
+						for ( var i = 2; i < faceLength; i ++ ) {
 
 
-							uvsB[j].push(
+							uvsB[ j ].push(
 
 
-								faceUVs[j][ 0],
-								faceUVs[j][ 1],
+								faceUVs[ j ][ 0 ],
+								faceUVs[ j ][ 1 ],
 
 
-								faceUVs[j][ ( i - 1 ) * 2 ],
-								faceUVs[j][ ( i - 1 ) * 2 + 1 ],
+								faceUVs[ j ][ ( i - 1 ) * 2 ],
+								faceUVs[ j ][ ( i - 1 ) * 2 + 1 ],
 
 
-								faceUVs[j][ i * 2 ],
-								faceUVs[j][ i * 2 + 1 ],
+								faceUVs[ j ][ i * 2 ],
+								faceUVs[ j ][ i * 2 + 1 ]
 
 
 							);
 							);
 
 
@@ -1022,29 +1020,34 @@
 
 
 				}
 				}
 
 
-        if( materialInfo && materialInfo.mappingType !== 'AllSame' ) {
+				if ( materialInfo && materialInfo.mappingType !== 'AllSame' ) {
 
 
-          var materialIndex = getData(polygonVertexIndex, polygonIndex, vertexIndex, materialInfo)[0];
+					var materialIndex = getData( polygonVertexIndex, polygonIndex, vertexIndex, materialInfo )[ 0 ];
 
 
-          for (var i = 2; i < faceLength; i++) {
+					for ( var i = 2; i < faceLength; i ++ ) {
 
 
-            materialsB.push(materialIndex, materialIndex, materialIndex);
+						materialsB.push(
+							materialIndex,
+							materialIndex,
+							materialIndex
+						);
+
+					}
 
 
-          }
 				}
 				}
 
 
-				faceVertexBuffer = [];
 				polygonIndex ++;
 				polygonIndex ++;
 
 
 				endOfFace = false;
 				endOfFace = false;
+				faceLength = 0;
+
+				// reset arrays for the next face
 				vertexPositionIndexes = [];
 				vertexPositionIndexes = [];
 				faceNormals = [];
 				faceNormals = [];
 				faceColors = [];
 				faceColors = [];
 				faceUVs = [];
 				faceUVs = [];
-        faceMaterials = [];
-        faceWeights = [];
-        faceWeightIndices = [];
-				faceLength = 0;
+    		faceWeights = [];
+    		faceWeightIndices = [];
 
 
 			}
 			}
 
 
@@ -1052,8 +1055,25 @@
 
 
 		var geo = new THREE.BufferGeometry();
 		var geo = new THREE.BufferGeometry();
 		geo.name = geometryNode.name;
 		geo.name = geometryNode.name;
+
 		geo.addAttribute( 'position', new THREE.Float32BufferAttribute( vertexB, 3 ) );
 		geo.addAttribute( 'position', new THREE.Float32BufferAttribute( vertexB, 3 ) );
 
 
+		if ( colorsB.length > 0 ) {
+
+			geo.addAttribute( 'color', new THREE.Float32BufferAttribute( colorsB, 3 ) );
+
+		}
+
+		if ( deformer ) {
+
+			geo.addAttribute( 'skinIndex', new THREE.Float32BufferAttribute( weightsIndicesB, 4 ) );
+
+			geo.addAttribute( 'skinWeight', new THREE.Float32BufferAttribute( weightsB, 4 ) );
+
+			geo.FBX_Deformer = deformer;
+
+		}
+
 		if ( normalB.length > 0 ) {
 		if ( normalB.length > 0 ) {
 
 
 			geo.addAttribute( 'normal', new THREE.Float32BufferAttribute( normalB, 3 ) );
 			geo.addAttribute( 'normal', new THREE.Float32BufferAttribute( normalB, 3 ) );
@@ -1076,26 +1096,10 @@
 
 
 		}
 		}
 
 
-		if ( colorsB.length > 0 ) {
-
-			geo.addAttribute( 'color', new THREE.Float32BufferAttribute( colorB, 3 ) );
-
-		}
-
-		if ( deformer ) {
-
-			geo.addAttribute( 'skinIndex', new THREE.Float32BufferAttribute( weightsIndicesB, 4 ) );
-
-			geo.addAttribute( 'skinWeight', new THREE.Float32BufferAttribute( weightsB, 4 ) );
-
-			geo.FBX_Deformer = deformer;
-
-		}
-
 		if ( materialInfo && materialInfo.mappingType !== 'AllSame' ) {
 		if ( materialInfo && materialInfo.mappingType !== 'AllSame' ) {
 
 
 			// Convert the material indices of each vertex into rendering groups on the geometry.
 			// Convert the material indices of each vertex into rendering groups on the geometry.
-      var materialIndexBuffer = materialsB;
+			var materialIndexBuffer = materialsB;
 			var prevMaterialIndex = materialIndexBuffer[ 0 ];
 			var prevMaterialIndex = materialIndexBuffer[ 0 ];
 			var startIndex = 0;
 			var startIndex = 0;
 
 
@@ -3516,7 +3520,10 @@
 			// The first three data sizes depends on version.
 			// The first three data sizes depends on version.
 			var endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
 			var endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
 			var numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
 			var numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
+
+			// note: do not remove this even if you get a linter warning as it moves the buffer forward
 			var propertyListLen = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
 			var propertyListLen = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
+
 			var nameLen = reader.getUint8();
 			var nameLen = reader.getUint8();
 			var name = reader.getString( nameLen );
 			var name = reader.getString( nameLen );