ImportAnimationFromAssimp2Json function

SkeletalAnimation ImportAnimationFromAssimp2Json(
  1. Map<String, dynamic> json,
  2. List<Bone> skeleton
)

Implementation

SkeletalAnimation ImportAnimationFromAssimp2Json(
    Map<String, dynamic> json, List<Bone> skeleton) {
  Map<String, Bone> name2bone = <String, Bone>{};
  skeleton.forEach((b) => name2bone[b.boneName] = b);

  String name = json["name"];
  double tickspersecond = json["tickspersecond"].toDouble();
  double duration = json["duration"];
  List channels = json["channels"];
  SkeletalAnimation anim = SkeletalAnimation(name, duration, skeleton.length);
  print("animated bones: ${channels.length}");
  for (Map<String, dynamic> c in channels) {
    assert(name2bone.containsKey(c["name"]));
    final Bone bone = name2bone[c["name"]] as Bone;

    List<double> positionTimes = [];
    List<VM.Vector3> positionValues = [];
    for (List pos in c["positionkeys"]) {
      positionTimes.add(pos[0] / tickspersecond);
      positionValues.add(MakeVector3(pos[1]));
    }

    List<double> rotationTimes = [];
    List<VM.Quaternion> rotationValues = [];
    for (List rot in c["rotationkeys"]) {
      rotationTimes.add(rot[0] / tickspersecond);
      List<double> q = _Floatify(rot[1]);
      rotationValues.add(VM.Quaternion(q[1], q[2], q[3], q[0]));
    }

    List<double> scaleTimes = [];
    List<VM.Vector3> scaleValues = [];
    for (List sca in c["scalingkeys"]) {
      scaleTimes.add(sca[0] / tickspersecond);
      scaleValues.add(MakeVector3(sca[1]));
    }

    anim.InsertBone(BoneAnimation(bone, positionTimes, positionValues,
        rotationTimes, rotationValues, scaleTimes, scaleValues));
  }

  return anim;
}