parseAnimationLayers method

Map parseAnimationLayers(
  1. dynamic curveNodesMap
)

Implementation

Map parseAnimationLayers( curveNodesMap ) {

	var rawLayers = fbxTree.Objects["AnimationLayer"];
	Map layersMap = {};

	for ( var nodeID in rawLayers.keys ) {

		var layerCurveNodes = [];

		var connection = connections[ int.parse( nodeID.toString() ) ];


		if ( connection != null ) {

			// all the animationCurveNodes used in the layer
			var children = connection["children"];

			children.asMap().forEach( ( i, child ) {

				if ( curveNodesMap.containsKey( child["ID"] ) ) {
					var curveNode = curveNodesMap[ child["ID"] ];

					// check that the curves are defined for at least one axis, otherwise ignore the curveNode
					if ( curveNode["curves"]["x"] != null || curveNode["curves"]["y"] != null || curveNode["curves"]["z"] != null ) {

              var modelID = connections[ child["ID"] ]["parents"].where( ( parent ) {

                return parent["relationship"] != null;

              } ).toList()[ 0 ]["ID"];

              if ( modelID != null ) {

                var rawModel = fbxTree.Objects["Model"][ modelID ];

                if ( rawModel == null ) {

                  print( 'THREE.FBXLoader: Encountered a unused curve. ${child}' );
                  return;

                }

                var node = {

                  "modelName": rawModel["attrName"] != null ? PropertyBinding.sanitizeNodeName( rawModel["attrName"] ) : '',
                  "ID": rawModel["id"],
                  "initialPosition": [ 0, 0, 0 ],
                  "initialRotation": [ 0, 0, 0 ],
                  "initialScale": [ 1, 1, 1 ],

                };

                sceneGraph.traverse( ( child ) {

                  if ( child.id == rawModel["id"] ) {

                    node["transform"] = child.matrix;

                    if ( child.userData["transformData"] != null ) node["eulerOrder"] = child.userData["transformData"]["eulerOrder"];

                  }

                } );

                if ( node["transform"] == null ) node["transform"] = new Matrix4();

                // if the animated model is pre rotated, we'll have to apply the pre rotations to every
                // animation value as well
                if ( rawModel.keys.contains('PreRotation') ) node["preRotation"] = rawModel["PreRotation"]["value"];
                if ( rawModel.keys.contains('PostRotation') ) node["postRotation"] = rawModel["PostRotation"]["value"];

                layerCurveNodes.add( node );

              }



						if ( layerCurveNodes[ i ] != null ) layerCurveNodes[ i ][ curveNode["attr"] ] = curveNode;

					} else if ( curveNode.curves.morph != null ) {

						if ( layerCurveNodes[ i ] == null ) {

							var deformerID = connections[ child["ID"] ].parents.filter( ( parent ) {

								return parent.relationship != null;

							} )[ 0 ].ID;

							var morpherID = connections[deformerID].parents[ 0 ].ID;
							var geoID = connections[ morpherID ].parents[ 0 ].ID;

							// assuming geometry is not used in more than one model
							var modelID = connections[ geoID ].parents[ 0 ].ID;

							var rawModel = fbxTree.Objects["Model"][ modelID ];

							var node = {

								"modelName": rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',
								"morphName": fbxTree.Objects["Deformer"][ deformerID ].attrName,

							};

							layerCurveNodes[ i ] = node;

						}

						layerCurveNodes[ i ][ curveNode.attr ] = curveNode;

					}

				}

			} );

			layersMap[ int.parse( nodeID.toString() ) ] = layerCurveNodes;

		}

	}

	return layersMap;

}