Skip to content

Keyframer Classes

widberg edited this page Mar 26, 2023 · 46 revisions

Interpolation Techniques

Keyframer classes with Linear in the class name use Linear interpolation to interpolate values between keyframes. Classes without Linear in the name use Quadratic Bézier interpolation to interpolate values between keyframes.

Compressed

Classes with Comp (Compressed) in the name use std::int16_t values in place of float values to minimize the size of keyframes. To decompress the compressed Keyframer values, for quaternions divide the signed 16-bit integers by 2000, and for vectors divide by 4096. This yields normalized quaternions in the case of KeyframerRot_Z. For some reason, KeyframerVec4fLinearComp_Z is identical to KeyframerVec4fLinear_Z despite the former having Comp in its name.

Extended

Classes with Ext (Extended?) in the name... The only class that fits this description is KeyframerExtVec3f_Z.

Classes

The class names on this page were taken from the WALL-E Mac debug symbols.

Float Keyframers

struct KeyframerFloat_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        float value;
        float tangentIn;
        float tangentOut;
     }> keyframes;
};

struct KeyframerFloatComp_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        std::int16_t value;
        std::int16_t tangentIn;
        std::int16_t tangentOut;
        std::uint16_t padding;
    }> keyframes;
};

struct KeyframerFloatLinearComp_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        std::int16_t value;
        std::uint16_t padding;
    }> keyframes;
};

Vec2f Keyframers

struct KeyframerVec2fLinear_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        Vec2f data;
    }> keyframes;
};

struct KeyframerVec2fLinearComp_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        Vec2i16 value;
    }> keyframes;
};

Vec3f Keyframers

struct KeyframerVec3fComp_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        Vec3i16 value;
        Vec3i16 tangentIn;
        Vec3i16 tangentOut;
        std::uint16_t padding;
            // Always 0xFF
    }> keyframes;
};

struct KeyframerVec3fLinear_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        Vec3f value;
    }> keyframes;
};

struct KeyframerExtVec3f_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        Vec3f value;
        Vec3f tangentIn;
        Vec3f tangentOut;
    }> keyframes;
};

Vec4f Keyframers

struct KeyframerVec4fLinear_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        Vec4f value;
    }> keyframes;
};

struct KeyframerVec4fLinearComp_Z {
    std::uint16_t flags;
    PascalArray<struct {
        float time;
        Vec4f value;
            // Even though this struct has Comp in the name
            // The value is not compressed. Strange.
    }> keyframes;
};

Rotation Keyframer

struct KeyframerRot_Z {
    PascalArray<struct {
        float time;
        Quati16 rotation;
    }> keyframes;
};

Beszier Rotation Keyframer

struct KeyframerBezierRot_Z {
    PascalArray<struct {
        float time;
        Vec3f a;
        Vec3f b;
        Vec3f c;
    }> keyframes;
};

Handle Keyframer

struct KeyframerHdl_Z // KeyframerHandle
{
    PascalArray<struct {
        float time;
        crc32_t crc32;
    }> keyframes;
};

Flag Keyframer

struct KeyframerFlag_Z {
    PascalArray<struct {
        float time;
        std::uint32_t flag;
    }> keyframes;
};

Message Keyframer

Sends Message_Zs

struct KeyframerMessage_Z {
    PascalArray<struct {
        float time;
        PascalArray<struct {
            std::uint32_t messageClass;
                // Observed values:
                //   * 12
                //   * 13
                //   * 32
                //   * 36 - Sound_Z related
            crc32_t recieverCRC32;
                // 0
                // Sound_Z crc32s
            std::uint32_t c;
                // Observed values:
                //   * 0
                //   * 15
                //   * 792146210
                //   * 1162695237
                //   * 10295924
            float parameter;
            crc32_t messageID;
        }> messages;
    }> keyframes;
};

Home
FAQ

For FMTK Users and Mod Developers

Read the Docs

For FMTK Developers

Asobo BigFile Format Specification
Asobo Classes
      Animation_Z
      Binary_Z
      Bitmap_Z
      Camera_Z
      CollisionVol_Z
      Fonts_Z
      GameObj_Z
      GenWorld_Z
      GwRoad_Z
      Keyframer*_Z
      Light_Z
      LightData_Z
      Lod_Z
      LodData_Z
      Material_Z
      MaterialAnim_Z
      MaterialObj_Z
      Mesh_Z
      MeshData_Z
      Node_Z
      Omni_Z
      Particles_Z
      ParticlesData_Z
      RotShape_Z
      RotShapeData_Z
      Rtc_Z
      Skel_Z
      Skin_Z
      Sound_Z
      Spline_Z
      SplineGraph_Z
      Surface_Z
      SurfaceDatas_Z
      UserDefine_Z
      Warp_Z
      World_Z
      WorldRef_Z
Asobo File Format Idioms
Asobo CRC32
Asobo LZ Compression
Asobo Arithmetic Coding Compression
Asobo Save Game File Format Specification
Asobo Audio Formats
TotemTech/ToonTech/Zouna/ACE/BSSTech/Opal Timeline
Zouna Modding Resources
Miscellaneous

Clone this wiki locally