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;
}
}
}
}