def traverse_animation_curves(fbx_scene, fbx_node, fbx_layer, egg_parent):
    for i in range(fbx_node.GetChildCount()):
        fbx_child = fbx_node.GetChild(i)

        if fbx_child.GetSkeleton() is None:
            continue

        xform_new = EggXfmSAnim("xform")
        xform_new.setOrder(EggXfmSAnim.getStandardOrder())
        # xform_new.setOrder("shprt")
        xform_new.setFps(30)

        for transform in get_transforms(fbx_child, fbx_layer):
            xform_new.addData(transform)

        egg_table = EggTable(fbx_child.GetName())
        egg_table.addChild(xform_new)

        egg_parent.addChild(egg_table)

        traverse_animation_curves(fbx_scene, fbx_child, fbx_layer, egg_table)
def get_transforms(fbx_node, fbx_layer):
    rotation_order = fbx_node.GetRotationOrder(fbx.FbxNode.eSourcePivot)

    translation_curve = fbx_node.LclTranslation.GetCurve(fbx_layer, True)
    rotation_curve = fbx_node.LclRotation.GetCurve(fbx_layer, True)
    scaling_curve = fbx_node.LclScaling.GetCurve(fbx_layer, True)

    translation_count = translation_curve.KeyGetCount()
    rotation_count = rotation_curve.KeyGetCount()
    scaling_count = scaling_curve.KeyGetCount()

    key_count = max(translation_count, rotation_count, scaling_count)

    # order = convert_fbx_rotation_order[rotation_order]
    order = EggXfmSAnim.getStandardOrder() # srpht
    # order = "shprt"

    for key_index in range(key_count):
        key_time = fbx.FbxTime()
        key_time.SetFrame(key_index)

        translation = convert_fbx_vector4(fbx_node.EvaluateLocalTranslation(key_time))
        rotation = convert_fbx_vector4(fbx_node.EvaluateLocalRotation(key_time))
        scaling = convert_fbx_vector4(fbx_node.EvaluateLocalScaling(key_time))

        rotation = normalize_rotation_order(rotation_order, rotation)

        # transform = fbx_node.EvaluateLocalTransform(key_time)
        # translation = convert_fbx_vector4(transform.GetT())
        # rotation = convert_fbx_vector4(transform.GetR())
        # scaling = convert_fbx_vector4(transform.GetS())

        shear = VBase3D(0, 0, 0)

        mat = Mat4D()
        EggXfmSAnim.composeWithOrder(mat, scaling, shear, rotation, translation, order, CSYupRight) # TODO: read coordinate system from fbx
        yield mat