浏览代码

added vertex color picking from fbxloader2

jonobr1 8 年之前
父节点
当前提交
51528e26aa
共有 1 个文件被更改,包括 66 次插入3 次删除
  1. 66 3
      examples/js/loaders/FBXLoader2.js

+ 66 - 3
examples/js/loaders/FBXLoader2.js

@@ -599,6 +599,12 @@
 
 
 							}
 							}
 
 
+							if ( 'LayerElementColor' in geometryNode.subNodes ) {
+
+								var colorInfo = getColors( geometryNode );
+
+							}
+
 							if ( 'LayerElementMaterial' in geometryNode.subNodes ) {
 							if ( 'LayerElementMaterial' in geometryNode.subNodes ) {
 
 
 								var materialInfo = getMaterials( geometryNode );
 								var materialInfo = getMaterials( geometryNode );
@@ -698,6 +704,12 @@
 
 
 								}
 								}
 
 
+								if ( colorInfo ) {
+
+									vertex.color.fromArray( getData( polygonVertexIndex, polygonIndex, vertexIndex, colorInfo ) );
+
+								}
+
 								faceVertexBuffer.push( vertex );
 								faceVertexBuffer.push( vertex );
 
 
 								if ( endOfFace ) {
 								if ( endOfFace ) {
@@ -733,6 +745,11 @@
 
 
 								geo.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( bufferInfo.uvBuffer ), 2 ) );
 								geo.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( bufferInfo.uvBuffer ), 2 ) );
 
 
+							}
+							if ( bufferInfo.colorsBuffer.length > 0 ) {
+
+								geo.addAttribute( 'color', new THREE.BufferAttribute( new Float32Array( bufferInfo.colorsBuffer ), 4 ) );
+
 							}
 							}
 
 
 							if ( deformer ) {
 							if ( deformer ) {
@@ -828,6 +845,35 @@
 
 
 							}
 							}
 
 
+							/**
+							 * Parses Vertex Color information for geometry.
+							 * @param {FBXGeometryNode} geometryNode
+							 * @returns {{dataSize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}}
+							 */
+							function getColors( geometryNode ) {
+
+								var ColorNode = geometryNode.subNodes.LayerElementColor[ 0 ];
+
+								var mappingType = ColorNode.properties.MappingInformationType;
+								var referenceType = ColorNode.properties.ReferenceInformationType;
+								var buffer = parseFloatArray( ColorNode.subNodes.Colors.properties.a );
+								var indexBuffer = [];
+								if ( referenceType === 'IndexToDirect' ) {
+
+									indexBuffer = parseFloatArray( ColorNode.subNodes.ColorIndex.properties.a );
+
+								}
+
+								return {
+									dataSize: 4,
+									buffer: buffer,
+									indices: indexBuffer,
+									mappingType: mappingType,
+									referenceType: referenceType
+								};
+
+							}
+
 							/**
 							/**
 							 * Parses material application information for geometry.
 							 * Parses material application information for geometry.
 							 * @param {FBXGeometryNode}
 							 * @param {FBXGeometryNode}
@@ -1399,7 +1445,7 @@
 
 
 				/**
 				/**
 				 * @type {{
 				 * @type {{
-				     curves: Map<number, {
+						 curves: Map<number, {
 						 T: {
 						 T: {
 							id: number;
 							id: number;
 							attr: string;
 							attr: string;
@@ -1519,7 +1565,7 @@
 						}
 						}
 					 }>,
 					 }>,
 					 layers: Map<number, {
 					 layers: Map<number, {
-					 	T: {
+						T: {
 							id: number;
 							id: number;
 							attr: string;
 							attr: string;
 							internalID: number;
 							internalID: number;
@@ -1943,7 +1989,7 @@
 
 
 					/**
 					/**
 					 * @type {{
 					 * @type {{
-					 	T: {
+						T: {
 							id: number;
 							id: number;
 							attr: string;
 							attr: string;
 							internalID: number;
 							internalID: number;
@@ -3084,6 +3130,12 @@
 		 */
 		 */
 		this.uv = new THREE.Vector2( );
 		this.uv = new THREE.Vector2( );
 
 
+		/**
+		 * Color of the vertex
+		 * @type {THREE.Vector4}
+		 */
+		this.color = new THREE.Vector4();
+
 		/**
 		/**
 		 * Indices of the bones vertex is influenced by.
 		 * Indices of the bones vertex is influenced by.
 		 * @type {THREE.Vector4}
 		 * @type {THREE.Vector4}
@@ -3119,6 +3171,7 @@
 			var vertexBuffer = this.position.toArray();
 			var vertexBuffer = this.position.toArray();
 			var normalBuffer = this.normal.toArray();
 			var normalBuffer = this.normal.toArray();
 			var uvBuffer = this.uv.toArray();
 			var uvBuffer = this.uv.toArray();
+			var colorBuffer = this.color.toArray();
 			var skinIndexBuffer = this.skinIndices.toArray();
 			var skinIndexBuffer = this.skinIndices.toArray();
 			var skinWeightBuffer = this.skinWeights.toArray();
 			var skinWeightBuffer = this.skinWeights.toArray();
 
 
@@ -3126,6 +3179,7 @@
 				vertexBuffer: vertexBuffer,
 				vertexBuffer: vertexBuffer,
 				normalBuffer: normalBuffer,
 				normalBuffer: normalBuffer,
 				uvBuffer: uvBuffer,
 				uvBuffer: uvBuffer,
+				colorBuffer: colorBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 			};
 			};
@@ -3167,6 +3221,7 @@
 			var vertexBuffer = [];
 			var vertexBuffer = [];
 			var normalBuffer = [];
 			var normalBuffer = [];
 			var uvBuffer = [];
 			var uvBuffer = [];
+			var colorsBuffer = [];
 			var skinIndexBuffer = [];
 			var skinIndexBuffer = [];
 			var skinWeightBuffer = [];
 			var skinWeightBuffer = [];
 
 
@@ -3178,6 +3233,7 @@
 				vertexBuffer = vertexBuffer.concat( flatVertex.vertexBuffer );
 				vertexBuffer = vertexBuffer.concat( flatVertex.vertexBuffer );
 				normalBuffer = normalBuffer.concat( flatVertex.normalBuffer );
 				normalBuffer = normalBuffer.concat( flatVertex.normalBuffer );
 				uvBuffer = uvBuffer.concat( flatVertex.uvBuffer );
 				uvBuffer = uvBuffer.concat( flatVertex.uvBuffer );
+				colorsBuffer = colorsBuffer.concat( flatVertex.colorBuffer );
 				skinIndexBuffer = skinIndexBuffer.concat( flatVertex.skinIndexBuffer );
 				skinIndexBuffer = skinIndexBuffer.concat( flatVertex.skinIndexBuffer );
 				skinWeightBuffer = skinWeightBuffer.concat( flatVertex.skinWeightBuffer );
 				skinWeightBuffer = skinWeightBuffer.concat( flatVertex.skinWeightBuffer );
 
 
@@ -3187,6 +3243,7 @@
 				vertexBuffer: vertexBuffer,
 				vertexBuffer: vertexBuffer,
 				normalBuffer: normalBuffer,
 				normalBuffer: normalBuffer,
 				uvBuffer: uvBuffer,
 				uvBuffer: uvBuffer,
+				colorsBuffer: colorsBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 			};
 			};
@@ -3245,6 +3302,7 @@
 			var vertexBuffer = [];
 			var vertexBuffer = [];
 			var normalBuffer = [];
 			var normalBuffer = [];
 			var uvBuffer = [];
 			var uvBuffer = [];
+			var colorsBuffer = [];
 			var skinIndexBuffer = [];
 			var skinIndexBuffer = [];
 			var skinWeightBuffer = [];
 			var skinWeightBuffer = [];
 
 
@@ -3259,6 +3317,7 @@
 				vertexBuffer = vertexBuffer.concat( flatTriangle.vertexBuffer );
 				vertexBuffer = vertexBuffer.concat( flatTriangle.vertexBuffer );
 				normalBuffer = normalBuffer.concat( flatTriangle.normalBuffer );
 				normalBuffer = normalBuffer.concat( flatTriangle.normalBuffer );
 				uvBuffer = uvBuffer.concat( flatTriangle.uvBuffer );
 				uvBuffer = uvBuffer.concat( flatTriangle.uvBuffer );
+				colorsBuffer = colorsBuffer.concat( flatTriangle.colorsBuffer );
 				skinIndexBuffer = skinIndexBuffer.concat( flatTriangle.skinIndexBuffer );
 				skinIndexBuffer = skinIndexBuffer.concat( flatTriangle.skinIndexBuffer );
 				skinWeightBuffer = skinWeightBuffer.concat( flatTriangle.skinWeightBuffer );
 				skinWeightBuffer = skinWeightBuffer.concat( flatTriangle.skinWeightBuffer );
 				materialIndexBuffer = materialIndexBuffer.concat( [ materialIndex, materialIndex, materialIndex ] );
 				materialIndexBuffer = materialIndexBuffer.concat( [ materialIndex, materialIndex, materialIndex ] );
@@ -3269,6 +3328,7 @@
 				vertexBuffer: vertexBuffer,
 				vertexBuffer: vertexBuffer,
 				normalBuffer: normalBuffer,
 				normalBuffer: normalBuffer,
 				uvBuffer: uvBuffer,
 				uvBuffer: uvBuffer,
+				colorsBuffer: colorsBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 				materialIndexBuffer: materialIndexBuffer
 				materialIndexBuffer: materialIndexBuffer
@@ -3305,6 +3365,7 @@
 			var vertexBuffer = [];
 			var vertexBuffer = [];
 			var normalBuffer = [];
 			var normalBuffer = [];
 			var uvBuffer = [];
 			var uvBuffer = [];
+			var colorsBuffer = [];
 			var skinIndexBuffer = [];
 			var skinIndexBuffer = [];
 			var skinWeightBuffer = [];
 			var skinWeightBuffer = [];
 
 
@@ -3317,6 +3378,7 @@
 				vertexBuffer = vertexBuffer.concat( flatFace.vertexBuffer );
 				vertexBuffer = vertexBuffer.concat( flatFace.vertexBuffer );
 				normalBuffer = normalBuffer.concat( flatFace.normalBuffer );
 				normalBuffer = normalBuffer.concat( flatFace.normalBuffer );
 				uvBuffer = uvBuffer.concat( flatFace.uvBuffer );
 				uvBuffer = uvBuffer.concat( flatFace.uvBuffer );
+				colorsBuffer = colorsBuffer.concat( flatFace.colorsBuffer );
 				skinIndexBuffer = skinIndexBuffer.concat( flatFace.skinIndexBuffer );
 				skinIndexBuffer = skinIndexBuffer.concat( flatFace.skinIndexBuffer );
 				skinWeightBuffer = skinWeightBuffer.concat( flatFace.skinWeightBuffer );
 				skinWeightBuffer = skinWeightBuffer.concat( flatFace.skinWeightBuffer );
 				materialIndexBuffer = materialIndexBuffer.concat( flatFace.materialIndexBuffer );
 				materialIndexBuffer = materialIndexBuffer.concat( flatFace.materialIndexBuffer );
@@ -3327,6 +3389,7 @@
 				vertexBuffer: vertexBuffer,
 				vertexBuffer: vertexBuffer,
 				normalBuffer: normalBuffer,
 				normalBuffer: normalBuffer,
 				uvBuffer: uvBuffer,
 				uvBuffer: uvBuffer,
+				colorsBuffer: colorsBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinIndexBuffer: skinIndexBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 				skinWeightBuffer: skinWeightBuffer,
 				materialIndexBuffer: materialIndexBuffer
 				materialIndexBuffer: materialIndexBuffer