code: function ( parentGeo, parentGeoNode, morphGeoNode, preTransform ) {
  
  			var morphGeo = new THREE.BufferGeometry();
  			if ( morphGeoNode.attrName ) morphGeo.name = morphGeoNode.attrName;
  
  			var vertexIndices = ( parentGeoNode.PolygonVertexIndex !== undefined ) ? parentGeoNode.PolygonVertexIndex.a : [];
  
  			// make a copy of the parent's vertex positions
  			var vertexPositions = ( parentGeoNode.Vertices !== undefined ) ? parentGeoNode.Vertices.a.slice() : [];
  
  			var morphPositions = ( morphGeoNode.Vertices !== undefined ) ? morphGeoNode.Vertices.a : [];
  			var indices = ( morphGeoNode.Indexes !== undefined ) ? morphGeoNode.Indexes.a : [];
  
  			for ( var i = 0; i < indices.length; i ++ ) {
  
  				var morphIndex = indices[ i ] * 3;
  
  				// FBX format uses blend shapes rather than morph targets. This can be converted
  				// by additively combining the blend shape positions with the original geometry's positions
  				vertexPositions[ morphIndex ] += morphPositions[ i * 3 ];
  				vertexPositions[ morphIndex + 1 ] += morphPositions[ i * 3 + 1 ];
  				vertexPositions[ morphIndex + 2 ] += morphPositions[ i * 3 + 2 ];
  
  			}
  
  			// TODO: add morph normal support
  			var morphGeoInfo = {
  				vertexIndices: vertexIndices,
  				vertexPositions: vertexPositions,
  			};
  
  			var morphBuffers = this.genBuffers( morphGeoInfo );
  
  			var positionAttribute = new THREE.Float32BufferAttribute( morphBuffers.vertex, 3 );
  			positionAttribute.name = morphGeoNode.attrName;
  
  			preTransform.applyToBufferAttribute( positionAttribute );
  
  			parentGeo.morphAttributes.position.push( positionAttribute );
  
  		}
docs: a morph geometry node is similar to a standard  node, and the node is also contained in FBXTree.Objects.Geometry, however it can only have attributes for position, normal and a special attribute Index defining which vertices of the original geometry are affected Normal and position attributes only have data for the vertices that are affected by the morph