parseAnimationCurves method
dynamic
parseAnimationCurves(
- dynamic curveNodesMap
Implementation
parseAnimationCurves( curveNodesMap ) {
var rawCurves = fbxTree.Objects["AnimationCurve"];
// TODO: Many values are identical up to roundoff error, but won't be optimised
// e.g. position times: [0, 0.4, 0. 8]
// position values: [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.235384487103147e-7, 93.67520904541016, -0.9982695579528809]
// clearly, this should be optimised to
// times: [0], positions [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809]
// this shows up in nearly every FBX file, and generally time array is length > 100
for ( var nodeID in rawCurves.keys ) {
var animationCurve = {
"id": rawCurves[ nodeID ]["id"],
"times": rawCurves[ nodeID ]["KeyTime"]["a"].map( convertFBXTimeToSeconds ).toList(),
"values": rawCurves[ nodeID ]["KeyValueFloat"]["a"],
};
var relationships = connections[ animationCurve["id"] ];
if ( relationships != null ) {
var animationCurveID = relationships["parents"][ 0 ]["ID"];
var animationCurveRelationship = relationships["parents"][ 0 ]["relationship"];
if ( RegExp(r'X').hasMatch(animationCurveRelationship) ) {
curveNodesMap[animationCurveID]["curves"][ 'x' ] = animationCurve;
} else if ( RegExp(r'Y').hasMatch(animationCurveRelationship) ) {
curveNodesMap[animationCurveID]["curves"][ 'y' ] = animationCurve;
} else if ( RegExp(r'Z').hasMatch(animationCurveRelationship) ) {
curveNodesMap[animationCurveID]["curves"][ 'z' ] = animationCurve;
} else if ( RegExp(r'd|DeformPercent').hasMatch(animationCurveRelationship) && curveNodesMap.has( animationCurveID ) ) {
curveNodesMap[animationCurveID]["curves"][ 'morph' ] = animationCurve;
}
}
}
}