parseAnimationCurves method

dynamic parseAnimationCurves(
  1. 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;
      }
    }
  }
}