EBO

From FIFA Manager Modding Wiki

EBO is a file extension in EA Sports games which is used for model and animation files.

In FIFA and FIFA Manager games, EBO files are used to store animations. In other games (NHL, NBA Libe) they are also used to store models/meshes.

Games[edit | edit source]

EBO files are used in following games:

Game Platform Year Version Content type
FIFA 2005 - FIFA 10 PC 2004 - 2009 17 Animations
UEFA Champions League 2004/2005, 2006/2007 PC 2004, 2006 17 Animations
FIFA World Cup 2006 PC 2006 17 Animations
UEFA Euro 2008 PC 2008 17 Animations
FIFA Manager 06 - FIFA Manager 14 PC 2005 - 2013 17 Animations
NHL 2005, 06 - 09 PC 2004 - 2008 17 Models
NBA Live 2005, 06 - 08 PC 2004 - 2007 17 Models
NCAA March Madness 06 PS2, XBOX 2005 17 Models
FIFA 07 XBOX360 2006 19 Animations
Madden NFL 07 XBOX360 2006 19 Animations

General file format[edit | edit source]

010 Editor template[edit | edit source]

//------------------------------------------------
//--- 010 Editor v9.0.2 Binary Template
//
//      File: Ebo File
//   Authors: Dmitri
//   Version: 0.2
//   Purpose: -
//  Category: -
// File Mask: *.ebo
//  ID Bytes: EBO\0
//   History: -
//------------------------------------------------
local int VERSION;

typedef char i8;
typedef short i16;
typedef int i32;
typedef float f32;

struct ptr {
    if (VERSION >= 19)
        unsigned __int64 value;
    else
        unsigned int value;
};

struct String {
    unsigned int offset;
    local int pos1 = FTell();
    FSeek(32);
    local int stringsOffset = ReadInt();
    FSeek(stringsOffset + offset);
    string value;
    FSeek(pos1);
};

typedef String AssetName;

struct Indices_0 {
    i16 mNumIndices;
    i16 mIndices[mNumIndices];
};

struct TimeData_0 {
    i8 mCycle;
    i8 mFlag;
    i16 mNumKeysMinus1;
    i16 mKeyTimes[mNumKeysMinus1];
};

struct AnimObject_0 {
    String mType;
    ptr mObjectInfo;
};

struct Animation_0 {
    AnimObject_0 Base;
    i16 mSignature;
    i16 mEndFrame;
};

struct SkelAnim_0 {
    Animation_0 Base;
    ptr mTimeData;
    ptr mQData;
    ptr mTData;
    ptr mSData;
    ptr mQConstData;
    ptr mTConstData;
    ptr mSConstData;
};

struct PosCompressed_0 {
    i16 mX;
    i16 mZ;
};

struct FacingCompressed_0 {
    i16 mValue;
};

struct RootAnim_0 {
    Animation_0 Base;
    f32 mInvertStep;
    f32 mPosScale;
    i16 mNumCompressedFrames;
    i8 mPad[2];
    PosCompressed_0 mPositions[mNumCompressedFrames];
    FacingCompressed_0 mFacings[mNumCompressedFrames];
};

struct DataObject {
    String mType;
    ptr mUserData;
    i32 mNumExternalVariables;
    i32 mGetExternalVariableHandler;
};

struct DoubleLinkedListPtrNode {
    i32 mPrior; /* These are really pointers, but should NEVER be output in pipeline */
    i32 mNext;  /* These are really pointers, but should NEVER be output in pipeline */
};

struct ManagedPointer {
    DoubleLinkedListPtrNode mInheritedData; /* This is really inherited and not a member */
    ptr mData;
    i16 mOffsetToAuxData;
    i16 mCallbackStructIndex;
};

struct GeometryFlags {
    i8 mType;        // see GeometryTypeFlags
    i8 mIsDirty;    // 1 if SetStream or ApplyMorph was called
    i8 mPad1;        // pad to 32bit
    i8 mPad2;        // pad to 32bit
};

struct Vector3 {
    f32 x;
    f32 y;
    f32 z;
};

struct BoundingInfo {
    Vector3 min;
    Vector3 max;
    Vector3 center;
    f32 radius;
};

struct Geometry {
    DataObject mDataObject;
    AssetName mName;
    i32 mNumMaterials;
    ptr mMaterials; // Material*
    i32 mNumExternalVariables;
    ptr mExternalVariables; // ExternalVariable*
    ManagedPointer mManagedPointerToBaseGeometry;
    GeometryFlags mFlags;
    i8 mMonth; // This data is a union with mpToEboFileAllocation.
    i8 mDay; // Since mpToEboFileAllocation is never written out
    i8 mHour; // by the pipeline, and this data IS written out by
    i8 mMinutes; // the pipeline, this works better for endian conversion.
    ptr mBoundingInfo; // BoundingInfo*
    i32 mModelMatrixExtVarIndex;
    ptr mExportedStreamList; // StringArray*
};

struct Material {
    ptr mRenderMethod;
    ptr mExternalVariables;
    ptr mVars;
    ptr mPerMaterialVars;
    Vector3 mCompressScale; /* TODO: remove*/
    Vector3 mCompressOffset; /* TODO: remove*/
    i32 mNumStreams;
    ptr mStreamHeaderArray;
};

struct PCVertexBuffer {
    i32 mSizeInBytes;
    i32 mStride;
    ptr mpData;
    ptr mpVertexBuffer;
    i32 mFVF;
    i32 mUsage;
    i32 mDirty;
};

struct PCIndexBuffer {
    i32 mSizeInBytes;
    i32 mStride;
    ptr mpData;
    ptr mpIndexBuffer;
    i32 mUsage;
    i32 mVertexShaderID;
};

struct PCDataBuffers {
    ptr mpIndexBufferMemImage;
    i32 mBufferOffset;
    i32 mNumElem;
    i32 mNumVertexBuffers;
    ptr mpBatch;
    ptr mpVertexBufferMemImages[mNumVertexBuffers] <optimize=false>;
};

struct XBOXD3DVertexBufferMemImage {
    i32 mCommon;
    ptr mData;
    i32 mLock;
};

struct XBOXVertexBuffer {
    XBOXD3DVertexBufferMemImage    mBaseTypeInfo;
    i32 mByteSize;
    i32 mStride;
    i32 mRegistered;
    ptr mData;
};

struct EboChunkTOC {
    local int tocStart = FTell();
    unsigned short flags;
    unsigned short USDIdx; // index to usedTypeNames
    local int retPos = FTell();
    FSeek(20);
    local int typeNamesOffset = ReadInt();
    FSeek(typeNamesOffset + USDIdx * 4);
    local int nameOffset = ReadInt();
    FSeek(32);
    local int stringsOffset = ReadInt();
    FSeek(stringsOffset + nameOffset);
    string typeName;
    FSeek(retPos);
    unsigned int nStructs;
    unsigned int alignedSize;
    unsigned int oData; // ptr struct data
    local int tocEnd = FTell();
    FSeek(tocStart + oData);
    if (typeName == "EaglAnim::Indices_0")
        Indices_0 data[nStructs] <optimize=false>;
    else if (typeName == "EaglAnim::TimeData_0")
        TimeData_0 data[nStructs] <optimize=false>;
    else if (typeName == "EaglAnim::RootAnim_0")
        RootAnim_0 data[nStructs] <optimize=false>;
    else if (typeName == "EaglAnim::SkelAnim_0")
        SkelAnim_0 data[nStructs] <optimize=false>;
    else if (typeName == "Geometry")
        Geometry data[nStructs] <optimize=false>;
    else if (typeName == "Material")
        Material data[nStructs] <optimize=false>;
    else if (typeName == "i8")
        i8 data[nStructs] <optimize=false>;
    else if (typeName == "ptr")
        ptr data[nStructs] <optimize=false>;
    else if (typeName == "AssetName")
        AssetName data[nStructs] <optimize=false>;
    else if (typeName == "PCVertexBuffer")
        PCVertexBuffer data[nStructs] <optimize=false>;
    else if (typeName == "PCIndexBuffer")
        PCIndexBuffer data[nStructs] <optimize=false>;
    else if (typeName == "PCDataBuffers")
        PCDataBuffers data[nStructs] <optimize=false>;
    else if (typeName == "XBOXVertexBuffer")
        XBOXVertexBuffer data[nStructs] <optimize=false>;
    else // any other data
        unsigned char data[4];
    FSeek(tocEnd);
};

struct EboChunk {
    local int chunkStart = FTell();
    unsigned short flags;
    unsigned short nTOCs;
    unsigned int oTOCs; // ptr to ObjectInfo array
    int type; // 0
    int version; // 0
    unsigned int size;
    if (nTOCs > 0)
        EboChunkTOC TOCs[nTOCs] <optimize=false>;
    local int chunkEnd = FTell();
    local int otherDataSize = size + chunkStart - chunkEnd;
    if (otherDataSize > 4)
        unsigned char otherData[otherDataSize];
};

struct EboImport {
    ptr next; // runtime, 0
    ptr prev; // runtime, 0
    unsigned int oTypeName;
    local int pos1 = FTell();
    FSeek(32);
    local int stringsOffset = ReadInt();
    FSeek(stringsOffset + oTypeName);
    string typeName;
    FSeek(pos1);
    unsigned int oName;
    local int pos2 = FTell();
    FSeek(stringsOffset + oName);
    string name;
    FSeek(pos2);
    unsigned int oIAT;
    unsigned int nIATEntries;
};

struct EboExport {
    unsigned int oTypeName;
    local int pos1 = FTell();
    FSeek(32);
    local int stringsOffset = ReadInt();
    FSeek(stringsOffset + oTypeName);
    string typeName;
    FSeek(pos1);
    unsigned int oName;
    local int pos2 = FTell();
    FSeek(stringsOffset + oName);
    string name;
    FSeek(pos2);
    int oExportedData;
};

struct AlignedString2b {
    string str;
    local int pos1 = FTell();
    if (pos1 % 2)
        char pad;
};

struct EboUSD {
    unsigned int oTypeName;
    if (VERSION >= 19)
        unsigned int checksum;
    local int endPos = FTell();
    FSeek(32);
    local int stringsOffset = ReadInt();
    FSeek(stringsOffset + oTypeName);
    string name;
    FSeek(endPos);
};

struct EboFile {
    unsigned int signature; // EBO\0
    unsigned int version; // known versions are 17 and 19
    VERSION = version;
    unsigned int size; // size of the file
    if (VERSION >= 19) {
        //unsigned int tocSize; only in Madden NFL?
        unsigned char endianOrig;
        unsigned char eboRulesConfig;
        unsigned char endianCurr;
        unsigned char dummy;
    } else {
        unsigned short endianOrig; // 0
        unsigned short endianCurr; // 0
    }
    unsigned int oChunks;
    unsigned int oUSDs;
    unsigned int oImports;
    unsigned int oExports;
    unsigned int oStrings;
    unsigned short nChunks;
    unsigned short nUSDs;
    unsigned short nImports;
    unsigned short nExports;
    unsigned short nStrings;
    unsigned short pad1; // 0
    ptr manager; // runtime, 0
    ptr next; // runtime, 0
    ptr prev; // runtime, 0
    ptr nextClone; // runtime, 0
    ptr prevClone; // runtime, 0
    ptr baseEboFile; // runtime, 0
    unsigned int cloneStartOffset; // runtime, usually 0
    unsigned int pFindType; // runtime, usually 0
    unsigned int pFoundType; // runtime, usually 0
    unsigned int foundChunk; // runtime, usually 0
    unsigned int foundTOC; // runtime, usually 0
    unsigned int foundCount; // runtime, usually 0
    EboChunk chunks[nChunks] <optimize=false>;
    EboUSD USDs[nUSDs] <optimize=false>;
    EboImport imports[nImports] <optimize=false>;
    if (nImports != 0) {
        if (VERSION >= 19)
            unsigned char importsData[oExports - oImports - nImports * 32];
        else
            unsigned char importsData[oExports - oImports - nImports * 24];
    }
    EboExport exports[nExports] <optimize=false>;
    unsigned int pad2; // usually 0
    AlignedString2b strings[nStrings] <optimize=false>;
};

EboFile file;

Structures[edit | edit source]

anmstruc.txt[edit | edit source]

There's a text file in motion.big which contains information about animation structures.

EA::Math::Matrix44, 16
{
	f32 m[16];
}

EA::Math::Vector3, 16
{
	f32 v[3];
}

EA::Math::Vector4, 16
{
	f32 v[4];
}

EA::Math::Quaternion, 16
{
	f32 v[4];
}

EaglAnim::ConstructInfo_0
{
	void *mDataImage;
	String mHeaderType;
	i32 mTotalSize;
	i16 mDataSize;
	i16 mHeaderSize;
	i16 mPatternSize;
	i16 mPatternNumRepeats;
	i16 mNumStrings;
	i16 mNumInternalPtrs;
	i16 mNumExternalPtrs;
	i16 mNumChildPtrs;
	i16 StringOffsets[mNumStrings];
	i16 InternalPtrOffsets[mNumInternalPtrs];
	i16 ExternalPtrOffsets[mNumExternalPtrs];
	i16 ChildPtrOffsets[mNumChildPtrs];
}

EaglAnim::ObjectInfo_0
{
	i16 mFlags;
	i16 mNumChildren;
}

EaglAnim::AnimObject_0, 16
{
	String mType;
	ObjectInfo *mObjectInfo;
}

EaglAnim::Skeleton_0, 64
{
	EaglAnim::AnimObject_0 Base;
	i16 mSignature;
	i16 mNumBones;
	i16 *mParentBoneIds;
	i8 mPad[48];
	EA::Math::Matrix44 InvBaseMatrices[mNumBones];
	i16 ParentBoneIds[mNumBones];
}

EaglAnim::DofRange_0
{
	i16 mStartIdx;
	i16 mNumValues;
}

EaglAnim::DofMask_0
{
	i16 mNumTypes;
	i16 mTotalNumRanges;
	i16 RangeIdxs[mNumTypes];
	EaglAnim::DofRange_0 Ranges[mTotalNumRanges];
}

EaglAnim::BoneDofMap_0
{
	i16 mType;
	i16 mSIdx;
	i16 mQIdx;
	i16 mTIdx;
}

EaglAnim::PoseDofMap_0, 16
{
	i16 mNumBones;
	i16 mNumDofs;
	i16 mNumRanges;
	i16 mStaticPoseSize;
	float *mStaticPoseBuffer;
	BoneDofMap *mBoneDofMap;
	i16 *mMirrorDofMap;
	PoseBufferRange *mPoseBufferRanges;
	DofMask *mDofMask;
	i32 mPad;
	EA::Math::Vector4 StaticPoseBuffer[mStaticPoseSize];
	EaglAnim::BoneDofMap_0 BoneDofMap[mNumBones];
	i16 MirrorDofMap[mNumDofs];
	i16 PoseBufferRanges[mNumRanges];
	EaglAnim::DofMask_0 DofMask;
}

EaglAnim::Pose_0, 16
{
	EaglAnim::AnimObject_0 Base;
	i16 mSignature;
	i16 mPoseBufferSize;
	PoseDofMap *mPoseDofMap;
	EA::Math::Vector4 PoseBuffer[mPoseBufferSize];
}

EaglAnim::MatricesObjectHeader_0, 64
{
	EaglAnim::AnimObject_0	Base;
	i32						mNumMatrices;
	i32						mPad[13];
}

EaglAnim::MatricesObject_0, 64
{
	EaglAnim::MatricesObjectHeader_0 Header;
	EA::Math::Matrix44 Matrices[Header.mNumMatrices];
}

EaglAnim::DictEntry_0
{
	String mName;
	i32 mId;
}

EaglAnim::Dictionary_0, 16
{
	EaglAnim::AnimObject_0 Base;
	i32 mNumEntries;
	EaglAnim::DictEntry_0 Entries[mNumEntries];
}

EaglAnim::Animation_0, 16
{
	EaglAnim::AnimObject_0 Base;
	i16 mSignature;
	i16 mEndFrame;
}

EaglAnim::RawAnim_0, 16
{
	EaglAnim::Animation_0 Base;
	i16 *mTimes;
	i16 *mDofIndices;
	i16 mNumKeys;
	i16 mNumQs;
	i16 mNumT3s;
	i16 mNumS3s;
	i16 mNumT1s;
	i16 mNumS1s;
	i32 mNumFloatData;
	i8 mCycle;
	i8 mPadding[11];
	f32 FloatData[mNumFloatData];
}

// We never write a plugin out to an EBO file but we need an chunk definition
// to be able to add an import of this type.
EaglAnim::EvalPlugin_0
{
	String mEvalType;
	ptr mInitHandler;
	ptr mUninitHandler;
	ptr mEvaluateHandler;
	ptr mFieldChangedHandler;
	i32 mNumFields;
	FieldInfo *mFieldInfo;
}

EaglAnim::ExternalVariable_0
{
	String mType;
	String mName;
	AssetName mAssetName;
	i32 mData;
	i32 mVariable;
}

// Evaluator inherits from EaglCore::DataObject, but since we don't have a
// definition for it we repeat the inherited fields here.
EaglAnim::Evaluator_0, 16
{
	String mType;
	void *mUserData;
	i32 mNumExternalVariables;
	ptr mGetExternalVariableHandler;
	ptr mEvaluateHandler;
	i32 mFlags;
}

EaglAnim::BlendPosesEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

EaglAnim::BlendAnimsEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

EaglAnim::SkelAnimCacheEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
	i32 mCacheSize;
	i8 Cache[mCacheSize];
}

EaglAnim::PoseToMatricesEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

EaglAnim::SkelMatricesEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

EaglAnim::BonePosEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
	ptr mPose;
	ptr mMatrices;
	ptr mCacheAnim;
	ptr mCacheQuery;
	ptr mSkelAnimEval;
	ptr mPoseToMatricesEval;
	EA::Math::Matrix44 mCacheInvRefMatrix;
	f32 mCacheRefTime;
	i32 mPTMMode;
	i8  mCacheMirror;
}

EaglAnim::Event_0, 4
{
	i16	mEventId;
	i16	mCsisCrc;
	i16	mTriggerFrame;
	i16	mNumParams;
	i32	mParams[6];	
}

EaglAnim::EventBitPackAnimEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
	i16					mSearchKey;			
	EaglAnim::Event_0	mEvent;				
}

EaglAnim::BonePosQuery_0
{
	i16 mRefBone;
	i16 mNumQueryBones;
	i16 *mQueryBones;
	i16 *mQueryDofs;
	EaglAnim::DofMask_0 *mRefBoneMask;
	EaglAnim::DofMask_0 *mRootToRefBoneMask;
	EaglAnim::DofMask_0 *mAllBonesMask;
	EaglAnim::DofMask_0 *mRootToAllBonesMask;
	EaglAnim::DofMask_0 *mRootToAllQueryBonesMask;
	EaglAnim::DofMask_0 *mRefBoneToAllQueryBonesMask;
}

EaglAnim::Indices_0
{
	i16 mNumIndices;
	i16 mIndices[mNumIndices];
}

EaglAnim::TimeData_0
{
	i8 mCycle;
	i8 mFlag;
	i16 mNumKeysMinus1;
	i16 mKeyTimes[mNumKeysMinus1];
}

EaglAnim::AnimData_0
{
	EaglAnim::Indices *mIndices;
}

EaglAnim::DeltaQAnimData::RangeDecompressed_0
{
	f32 mMin;
	f32 mMultiplier;
	f32	mPad[2];	
}

EaglAnim::DeltaQAnimData::Range_0
{
	i8 mMin;
	i8 mMultiplier;
}

EaglAnim::DeltaQAnimData::PhysicalValue_0
{
	i16 mValue[3];
}

EaglAnim::DeltaQAnimData::DeltaValue6_0
{
	i8 mValue[3];
}

EaglAnim::DeltaQAnimData::DeltaValue4_0
{
	i16 mValue;
}

EaglAnim::DeltaQAnimData_0
{
	EaglAnim::AnimData_0 Base;
	i16 mNumRanges;
	i16 mNumPhysicalValues;
	i16 mNumDeltaValues6;
	i16 mBinLengthPower;
	i16 mNumRanges4;			
	i16 mNumDeltaValues4;	
	EaglAnim::DeltaQAnimData::Range_0 mRanges[mNumRanges];
	EaglAnim::DeltaQAnimData::PhysicalValue_0 mPhysicalValues[mNumPhysicalValues];
	EaglAnim::DeltaQAnimData::DeltaValue4_0 mDeltaValues4[mNumDeltaValues4];
	EaglAnim::DeltaQAnimData::DeltaValue6_0 mDeltaValues6[mNumDeltaValues6];
}

EaglAnim::EventBitPackAnimData::EventMetaData_0
{
	i16	mCsisCrc;
	i16	mEvendIdAndNumParams;
	i32	mParamNumBits;	
}

EaglAnim::EventBitPackAnimData_0
{
	i16	mNumEvents;
	i16	mEventIdNumBits;	
	i16	mNumKeysPlusOne;
	i16	mBitPackBufferSize;	
	EaglAnim::EventBitPackAnimData::EventMetaData_0	mEventMetaData[mNumEvents];
	i16	mKeyBitIndices[mNumKeysPlusOne];	
	i8	mBitPackBuffer[mBitPackBufferSize];
}

EaglAnim::DeltaQConstData_0
{
	EaglAnim::AnimData_0 Base;
	i16 mNumRanges;
	i16 mPad;
	EaglAnim::DeltaQAnimData::PhysicalValue_0 mPhysicalValues[mNumRanges];
}

EaglAnim::DeltaF1AnimData::RangeDecompressed_0
{
	f32 mMin;
	f32 mMultiplier;
}

EaglAnim::DeltaF1AnimData::Range_0
{
	i16 mMin;
	i16 mMultiplier;
}

EaglAnim::DeltaF1AnimData::PhysicalValue_0
{
	i16 mValue;
}

EaglAnim::DeltaF1AnimData::DeltaValue_0
{
	i8 mValue;
}

EaglAnim::DeltaF1AnimData_0
{
	EaglAnim::AnimData_0 Base;
	i16 mNumRanges;
	i16 mNumPhysicalValues;
	i16 mNumDeltaValues;
	i16 mBinLengthPower;
	EaglAnim::DeltaF1AnimData::RangeDecompressed_0 mPhysicalRanges[mNumRanges];
	EaglAnim::DeltaF1AnimData::Range_0 mDeltaRanges[mNumRanges];
	EaglAnim::DeltaF1AnimData::PhysicalValue_0 mPhysicalValues[mNumPhysicalValues];
	EaglAnim::DeltaF1AnimData::DeltaValue_0 mDeltaValues[mNumDeltaValues];
}

EaglAnim::DeltaF1ConstData_0
{
	EaglAnim::AnimData_0 Base;
	i16 mNumRanges;
	i16 mPad;
	f32 mPhysicalValues[mNumRanges];
}

EaglAnim::SkelAnim_0, 16
{
	EaglAnim::Animation_0 Base;
	EaglAnim::TimeData_0 *mTimeData;
	void *mQData;
	void *mTData;
	void *mSData;
	void *mQConstData;
	void *mTConstData;
	void *mSConstData;
}

EaglAnim::EventAnim_0, 16
{
	EaglAnim::Animation_0 Base;
	EaglAnim::TimeData_0 *mTimeData;
	void *mEventData;
}

EaglAnim::EvalInitData_0
{
	String mType;
	EvalPlugin *mPlugin;
}

EaglAnim::EvalSwitchTableEntry_0
{
	String mEvalId;
	EvalInitData *mInitData;		
}

EaglAnim::EvalSwitchData_0
{
	i32 mNumEvals;
	EaglAnim::EvalSwitchTableEntry_0 EntryTable[mNumEvals];
}

EaglAnim::SkelDeltaAnimEvalInitData_0
{
	EaglAnim::EvalInitData_0 Base;
	i16 mMaxChannels;
	i16 mNumMaxAnimQs;
	i16 mNumMaxAnimTs;
	i16 mNumMaxAnimSs;
	i32 mPoseCheckSum;
}

EaglAnim::RawAnimEvalInitData_0
{
	EaglAnim::EvalInitData_0 Base;
	i32	mPoseCheckSum;
	i16	mMaxChannels;
}

EaglAnim::UserObject_0, 16
{
	EaglAnim::AnimObject_0 Base;
	i16 mCheckSum;
	i16 mSubclassSize;
	i32 mFieldFlags;
	i8 SubclassData[mSubclassSize];
}

EaglAnim::UserAnim_0, 16
{
	EaglAnim::Animation_0 Base;
	EaglAnim::TimeData_0 *mTimeData;
	void *mQData;
	void *mF1Data;
	void *mQConstData;
	void *mF1ConstData;
	i32 mFlag;
}

EaglAnim::UserDeltaAnimEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
	
	i16 mCurrentKeyBefore;
	i16	mCurrentKeyAfter;
	i16	mPrevKeyBefore;
	i16	mPrevKeyAfter;

	i16	mNumMaxAnimQs;
	i16	mNumMaxAnimF1s;

	ptr mPrevAnim;

	ptr mQCache[2];
	ptr mF1Cache[2];
	
	i32 mCacheSize;
	i8	mPadding[8];
	i8 Cache[mCacheSize];
}

EaglAnim::UserDeltaAnimEvalInitData_0
{
	EaglAnim::EvalInitData_0 Base;
	i16 mNumMaxAnimQs;
	i16 mNumMaxAnimF1s;
	i16 mUserStructCheckSum;
	i8	mPadding[2];
}

EaglAnim::MorphAnim_0, 16
{
	EaglAnim::Animation_0 Base;
	EaglAnim::TimeData_0 *mTimeData;
	void *mWeightData;
}

EaglAnim::MorphAnimCacheEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
	i32 mCacheSize;
	i8 Cache[mCacheSize];
}

EaglAnim::UserAttribute_0, 16
{
	EaglAnim::AnimObject_0 Base;
	i16	mCheckSum;
	i16	mNumFloats;
	i16	mNumInts;
	i16	mNumStrings;
	i16	mNumIndices;
	i8	mPadding[2];
	i32	mFlag;

	f32	float_data[mNumFloats];
	i32	int_data[mNumInts];
	String strings[mNumStrings];
	i16 indices[mNumIndices];
}

EaglAnim::UserAttributeEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

EaglAnim::IkEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

EaglAnim::IkChain_0, 16
{	
	i16	mType;
}

EaglAnim::OneBoneBallIkChain_0, 16
{
	EaglAnim::IkChain_0	Base;
	i16					mBone;
	f32					mB;
	f32					mOriginLen2;
	i32					mPad;
	EA::Math::Vector4	mDir;
	EA::Math::Vector4	mOrigin;
}

EaglAnim::TwoBoneBallHangeIkChain_0, 16
{
	EaglAnim::IkChain_0	Base;
	i16					mBeginBone;
	i16					mHingeBone;
	i16					mEndBone;
	f32					mABC2;	
	f32					m2AB;	
	EA::Math::Vector4	mHinge;	
	EA::Math::Vector4	mPoleVector;	
	EA::Math::Quaternion mPreRotateQ;	
	EA::Math::Vector4	mRotateAxis;	
	EA::Math::Vector4	mContact;	
}

EaglAnim::Ik_0, 16
{
	i16			mSkeletonSignature;
	i16			mNumIkChains;
	i16			mNumTwoBoneBallHangeIkChains;
	i16			mNumOneBoneBallIkChains;
	i8			*mPriorityIndices;
	i32			mPad;		
	EaglAnim::TwoBoneBallHangeIkChain_0	mTwoBoneBallHangeIkChains[mNumTwoBoneBallHangeIkChains];
	EaglAnim::OneBoneBallIkChain_0		mOneBoneBallIkChains[mNumOneBoneBallIkChains];	
	i8			mPriorityIndices[mNumIkChains];
}

EaglAnim::RootAnim::PosCompressed_0
{
	i16			mX;
	i16			mZ;
}

EaglAnim::RootAnim::FacingCompressed_0
{
	i16			mValue;
}

EaglAnim::RootAnim_0, 16
{
	EaglAnim::Animation_0					Base;
	f32										mInvertStep;
	f32										mPosScale;
	i16										mNumCompressedFrames;
	i8										mPad[2];
	EaglAnim::RootAnim::PosCompressed_0		mPositions[mNumCompressedFrames];
	EaglAnim::RootAnim::FacingCompressed_0	mFacings[mNumCompressedFrames];
}

EaglAnim::RootPosEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

EaglAnim::RootFacingEval_0, 16
{
	EaglAnim::Evaluator_0 Base;
	EaglAnim::ExternalVariable_0 mExternalVariables[Base.mNumExternalVariables];
}

effectStructsCustomTypes.txt[edit | edit source]

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//                    GENERATED FILE!!  DO NOT MODIFY!!                   //
//                                                                        //
//    (changes should be made to effectStructsCustomTypes.txt instead)    //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

// Alignment structures.
// Use these in front of variables within a structure that needs to be aligned.
Align4,4
{
}
Align8,8
{
}
Align16,16
{
}
Align32,32
{
}
Align64,64
{
}
Align128,128
{
}

DoubleLinkedListPtrNode
{
	i32 mPrior; /* These are really pointers, but should NEVER be output in pipeline */
	i32 mNext;  /* These are really pointers, but should NEVER be output in pipeline */
}
ManagedPointer
{
	DoubleLinkedListPtrNode mInheritedData; /* This is really inherited and not a member */
	ptr mData;
	i16 mOffsetToAuxData;
	i16 mCallbackStructIndex;
}
ExternalVariable
{
	String mType;
	String mName;
	AssetName mAssetName;
	i32 mData;     /* THIS IS A HORRIBLE CHEAT!, These pointers should be into data that is added  */
	i32 mVariable; /* THIS IS A HORRIBLE CHEAT!, These pointers should be into data that is added  */
}
ExternalVariableArray
{
	i32 mLength;
	ExternalVariable mData[mLength];
}
DataObject
{
	String mType;
	ptr mUserData;
	i32 mNumExternalVariables;
	i32 mGetExternalVariableHandler;
}
// Create the struct definitions for the geometries and indices
// Add the struct definitions
ByteArray
{
	i32 mLength;
	i8	mData[mLength];
}
IntArray
{
	i32 mLength;
	i32 mData[mLength];
}
PointerArray
{
	i32 mLength;
	ptr	mData[mLength];
}
Vector3
{
	f32 x;
	f32 y;
	f32 z;
}
Vector3Array
{
	i32 mLength;
	Vector3 mData[mLength];
}
Vector2
{
	f32 x;
	f32 y;
}
Vector2Array
{
	i32 mLength;
	Vector2 mData[mLength];
}
StringArray
{
	i32		mLength;
	String	mData[mLength];
}
PacketStreamHeader
{
	i32		mLength;
	void	*mpData;
	i16		*mpBackMapping;
	void	*mpVertexHeader;
}
StreamHeader
{
	String				mName;
	StreamHeader		*mpNext;
	i32					mSourceStride;		// Stride, in bytes, for the raw uncompiled data.
	i32					mCompiledStride;	// Stride, in bytes, for the compiled data.
	i32					mCompiledSize;		// Size of a compiled element in the stream in bytes.  Normally the same as mCompiledStride unless the destination stream is interleaved.
	i32					mCompressFunction;
	i32					mDecompressFunction;
	i32					mSourceLength;		// Number of elements in the source stream.
	i32					mNumPackets;
	PacketStreamHeader	mPacketData[mNumPackets];
}
StreamHeaderArray
{
	i32				mNumStreamHeaders;
	StreamHeader	mData[mNumStreamHeaders];
}
MorphTargetInfo
{
	f32				mScale;
	f32				mOffset;
	i32				mMorphTargetNum;
}
MorphData
{
	i32				mNum4Byte;
	i32				mNum2Byte;
	i32				mNum1Byte;
	i32				m4Bytes[mNum4Byte];	// could be floats or ints -- this is just for endian-conversion
	i16				m2Bytes[mNum2Byte];
	i8				m1Bytes[mNum1Byte];
}
MorphStreamHeader
{
	AssetName		mName;
	i8				mStreamDescription[7];
	i8				mFixedPointType;
	i32				mLength;
	void			*mpData;
	i8				*mpRunLengthData;
	i32				mNumMorphTargets;
	MorphTargetInfo	mMorphTargetList[mNumMorphTargets];
}
MorphTargetNameArray
{
	i32				mNumMorphTargets;
	AssetName		mTargetNames[mNumMorphTargets];
}
Morph
{
	AssetName				mName;
	i32						mMorphTypeFlag;
	
	i8						mMonth;		// This data is a union with mpToEboFileAllocation.
	i8						mDay;		// Since mpToEboFileAllocation is never written out
	i8						mHour;		// by the pipeline, and this data IS written out by
	i8						mMinutes;	// the pipeline, this works better for endian conversion.
	
	MorphTargetNameArray	*mMorphTargets;
	i32						mNumStreams;
	MorphStreamHeader		*mpMorphStreamHeaders[mNumStreams];
}
WeightBoneQuad
{
	f32 weight0;
	f32 weight1;
	f32 weight2;
	f32 weight3;
	i32 boneIndex0;
	i32 boneIndex1;
	i32 boneIndex2;
	i32 boneIndex3;
}
WeightBoneQuadArray
{
	i32 mLength;
	WeightBoneQuad mData[mLength];
}
GeoPrim
{
	i32 mNumVerts;
	i32 mIndicesMask;
	ptr mpMatrix;
	ptr mpCamera;
	ptr mpPoseMatrices;
	ptr mpTexture;
	ptr mCoordinateStream;
	ptr mUVStream;
	ptr mColourStream;
	ptr mWeightStream;
	ptr mCoordinateIndices;
	ptr mUVIndices;
	ptr mColourIndices;
	ptr mWeightIndices;
}
GeoPrimArray
{
	i32 mLength;
	GeoPrim mData[mLength];
}
OldGeometry
{
	DataObject mDataObject; // Inherited data object
	AssetName mName;
	ptr mpExternalVariableArray;
	i32 mNumStreams;
	ptr mStreamHeaderArray;
	i32 mNumGeoPrims;
	ptr mGeoPrimArray;
	i32 mGeometryTypeFlags;
	ManagedPointer mManagedPointerToBaseGeometry;
	i32 mpToEboFileAllocation; /* Only non null in runtime compiled version from GetResult */
}

Material
{
	ptr mRenderMethod;
	ptr mExternalVariables;
    ptr mVars;
	ptr mPerMaterialVars;
	Vector3 mCompressScale; /* TODO: remove*/
	Vector3 mCompressOffset; /* TODO: remove*/
    i32 mNumStreams;
    StreamHeader *mStreamHeaderArray;
}

BoundingInfo
{
	Vector3	min;
	Vector3	max;
	Vector3	center;
	f32		radius;
}

GeometryFlags
{
	i8 mType;		// see GeometryTypeFlags
	i8 mIsDirty;	// 1 if SetStream or ApplyMorph was called
	i8 mPad1;		// pad to 32bit
	i8 mPad2;		// pad to 32bit
}

Geometry
{
	DataObject			mDataObject;
	AssetName			mName;
	i32					mNumMaterials;
    Material			*mMaterials;
    i32					mNumExternalVariables;
	ExternalVariable	*mExternalVariables;
	ManagedPointer		mManagedPointerToBaseGeometry;
	GeometryFlags		mFlags;
	
	i8					mMonth;		// This data is a union with mpToEboFileAllocation.
	i8					mDay;		// Since mpToEboFileAllocation is never written out
	i8					mHour;		// by the pipeline, and this data IS written out by
	i8					mMinutes;	// the pipeline, this works better for endian conversion.
	
	BoundingInfo		*mBoundingInfo;
	i32					mModelMatrixExtVarIndex;
	StringArray			*mExportedStreamList;
}

FlipBookGeometry
{
	Geometry			**mGeometryArray;
	i32					mNumGeometries;
	ExternalVariable	mIndex;
	i32					mIsPipelineConstructed;
}

MultiBufferGeometry
{
	Geometry			**mGeometryArray;
	i32					*mFrameNumberArray;
	i32					mNumGeometries;
	i32					mDrawIndex;
	i32					mEditIndex;
	i32					mIsPipelineConstructed;
}

//////////////////////////////////
// User defined type definitions

// PRIVATE TYPES
// CMN Private Type
CmnTypeImage
{
	String  mName;
	i32		mByteSize;
	String	mCType;
	String	mEa3Type;
	String  mEboStruct;
}

// GC Private Type
GcTypeImage
{
	i32		mComponentType;
	i32		mComponentCount;
	i8		mFixedPointLocation;
}
// PC Private Type
PcTypeImage
{
	i32		mRegLines;
	i32		mVertexDesc;
	i32     mFVFDesc;
	i32		mShaderVarConstType;
}
// PS2 Private Type
Ps2TypeImage
{
	i32		mVuLines;
	i32		mVcUnpack;
	i32		mNumVifCodes;
	i32		*mVifCodeSnippet;
}
// XBOX Private Type
XboxTypeImage
{
	i32		mRegLines;
	i32		mVertexDesc;
}

// PUBLIC TYPES

// CMN
BaseRMSType
{
	CmnTypeImage	mCmnTypeImage;	
}
// PS2
PS2RMSType
{
	BaseRMSType			mCmnTypeImage;
	Ps2TypeImage        mPs2TypeImage;
}
// XBOX
XBOXRMSType
{
	BaseRMSType			mCmnTypeImage;
	XboxTypeImage       mXboxTypeImage;
}
// PC
PCRMSType
{
	BaseRMSType			mCmnTypeImage;
	PcTypeImage         mPcTypeImage;
}
//GC
GCRMSType
{
	BaseRMSType			mCmnTypeImage;
	GcTypeImage         mGcTypeImage;
}

// End user defined type defintions
//////////////////////////////////

//////////////////////////////////
// RenderMethod Struct definitions
ArraySpec
{
	i32 mCount;
	String mVarName;
}
DefaultInput
{
// TODO: Fill the runtime structure with something;
	i32 foo;
}
VarName
{
	i32 mType;
	String mName;
	AssetName mAssetName;
}

Assignment
{
	i32 mIsConstantList;
	i32 mNumExpressions;
	Expression *mExpressions;
}


RenderMethodInputVariable
{
	i32			mFlag;
	BaseRMSType *mType;
	String		mTypeName;
	VarName		mName;
	ArraySpec	mCount;
	String		mBoundStream;
}
PlatformVariableModifierParameters
{
	i32 mNumIdentifiers;
	String *mIdentifiers;
}

BaseRenderMethodPlatformVariable
{
	i32 mPlatformVariableType;
	PlatformVariableModifierParameters mModifierParameters;
	BaseRMSType *mType;
	String mTypeName;
	String mName;
	i32 mArraySize;
	String mActualArraySizeVariableName;
	i32 mPacketArraySize;
	i32 mPlatformVariableFlag;
	i32 mIsFilledByVertexFormat;
	i32 mAddress;
	i32 mNumRegLines;
}

Function
{
	String mName;
	i32 mNumParameters;
	Expression *mParameters;
	String mTempVariableName;
}

Expression
{
	i32 mType;
	i32 mBool;
	String mString;
	Expression *mpLeft;
	Expression *mpRight;
	VarName mVarName;
	Function mFunction;
	i32 mInt;
	f32 mFloat;
}

Statement
{
	String mRefDerefMarkers;
	VarName mLhsAssignment;
	Expression mExpression;
	i32 mNumPrereqExternVariables;
	i32 *mPrereqExternVariableIndices;
	i32 mNumPrereqPerMaterialVariables;
	i32 *mPrereqPerMaterialVariableIndices;
	i32 mNumPrereqConstants;
	i32 mStateIsAnOutput;
}

GcBindSpec
{
	i32		mBindType;
	i32		mVertexComponent;
	VarName	mStreamVar;
	VarName	mIndexVar;
	VarName	mDataVar;
	VarName	mPrimVar;
}

GcTexCoordMatrix
{
	i32		mIsVarName;
	VarName	mVarName;
}

GcTexGen
{
	i32					mTexCoordOutputNum;

	VarName				mInputStream;

	i32					mToNormalize;

	i32					mHasTexCoordMatrix;
	GcTexCoordMatrix	mTexCoordMatrix;
	i32					mTexCoordMatrixDimension;

	i32					mHasPostTransformMatrix;
	VarName				mPostTransformMatrix;
}

VertexShader
{
	i32 mNumParameters;
	Expression *mParameters;

	i32 mNumComputations;
	Function *mComputations;

	i32 mNumGcBindSpecs;
	GcBindSpec *mGcBindSpecs;

	i32 mNumGcTexGens;
	GcTexGen *mGcTexGens;

	i32 mIsGcSpecific;
}

GcTevEquation
{
	String	mOutRegEnumStr;
	i32		mIsClamped;
	i32		mTevOp;
	f32		mBias;
	f32		mScale;

	// Colour/Alpha inputs
	String	mA;
	String	mB;
	String	mC;
	String	mD;
}

GcTevTexMapCoordColourStreamConstColour
{
	i32		mHasInputTextureMapId;
	i32		mInputTextureMapId;

	i32		mHasTexCoordInputNum;
	i32		mTexCoordInputNum;

	i32		mHasColourStreamVar;
	VarName	mColourStreamVar;

	i32		mHasConstColourVar;
	VarName	mConstColourVar;
}

GcTevStage
{
	i32 mStageNumber;
	GcTevTexMapCoordColourStreamConstColour mGcTevTexMapCoordColourStreamConstColour;
	GcTevEquation mColourEquation;
	GcTevEquation mAlphaEquation;
}

GcTevRegColour
{
	i32		mRegNumber;
	VarName	mRegVar;
}

PixelShader
{
	i32 mNumComputations;
	Function *mComputations;

	i32 mNumGcTevStages;
	GcTevStage *mGcTevStages;

	i32 mNumGcTevRegColours;
	GcTevRegColour *mGcTevRegColours;

	i32 mIsGcSpecific;
}

Shader
{
	Expression mRootNode;
	i32 mNumShaderBodies;
	ShaderBody *mShaderBodies;
}

ShaderBody
{
	i32 mHasVertexShader;
	VertexShader mVertexShader;
	
	i32 mHasPixelShader;
	PixelShader mPixelShader;
	
	Function mComputation;
}

CompilerFlag
{
	String					mFlagName;
	i32						mNumParameters;
	Expression				*mParameters;
}

RenderMethodPlatformData
{
	i32 mPlatformId;
	i32 mNumIncludes;
	String *mIncludes;
	i32 mNumCompilerFlags;
	CompilerFlag *mCompilerFlags;
	i32 mNumPlatformVariables;
	BaseRenderMethodPlatformVariable *mPlatformVariables;
	String mVertexFormatName;
	i32 mNumStatements;
	Statement *mStatements;
	i32 mNumShaders;
	Shader *mShaders;
}

GcVertexBind
{
	i32		mVertexComponent;

	i32		mStreamVarIndex;
	i32		mIndicesVarIndex;
}

GcShaderSection
{
	i32				mPrimTypeVarIndex;

	i32				mNumVertexBinds;
	GcVertexBind	*mVertexBinds;
}

PlatformShaders
{
	i32 mNumShaderSections;
	i32 mOutputPlatform;
	ptr mPlatformShaderSection;
}

RenderMethod
{
	i32 mPlatform;
	String mName;
	i32 mNumInputVariables;
	RenderMethodInputVariable *mInputVariables;
	String mVertexFormatName;
	i32 mNumOutputVariables;
	BaseRenderMethodPlatformVariable *mOutputVariables;
	PlatformShaders *mPlatformExtensionModule;
}

PrivateRenderMethod
{
	String mName;
	i32 mNumInputVariables;
	RenderMethodInputVariable *mInputVariables;
	i32 mNumPlatformDataSections;
	RenderMethodPlatformData *mPlatformData;
}
//END RenderMethod Struct definitions
//////////////////////////////////


//////////////////////////////////
// XBOX VertexBuffer definitions

XBOXD3DVertexBufferMemImage
{
	i32						mCommon;
	i32						*mData;
	i32						mLock;
}

XBOXVertexBuffer
{
	XBOXD3DVertexBufferMemImage	mBaseTypeInfo;
	i32						mByteSize;
	i32						mStride;
	i32						mRegistered;
	i32						*mData;
}

// End XBOXVertexBuffer definitions
//////////////////////////////////

/////////////////////////////////////
// PC VertexBuffer definition

PCVertexBuffer
{
	i32	mSizeInBytes;
	i32	mStride;
	i32	*mpData;
	i32	*mpVertexBuffer;
	i32	mFVF;
	i32	mUsage;
	i32	mDirty;
}

PCIndexBuffer
{
	i32	mSizeInBytes;
	i32	mStride;
	i32	*mpData;
	i32	*mpIndexBuffer;
	i32	mUsage;
	i32	mVertexShaderID;
}

PCDataBuffers
{
	PCIndexBuffer *mpIndexBufferMemImage;
	i32 mBufferOffset;
	i32 mNumElem;
	i32 mNumVertexBuffers;
	void *mpBatch;
	PCVertexBuffer *mpVertexBufferMemImages[mNumVertexBuffers];
}


// PC VertexBuffer definitions
//////////////////////////////////

/////////////////////////////////////
// GC vertex stream definition

GCVertexStream
{
	i32 mSizeInBytes;
	i32 mStride;
	i32 *mpData;
}

GcIndexData
{
	i32 mAttrType;
}

// The display list in here needs to be 32-byte aligned.  There must be a better way
GcDisplayList,32
{
	i32		mDisplayListLength;
	i8		pad[28];
	i8		mDisplaylist[mDisplayListLength];
}

GcCommandBuffer
{
	GcDisplayList **mDisplayLists;
}

//
//////////////////////////////////

/////////////////////////////////////
// Types used by rms type definitions
// If you need more types for rms types then they have to be added here


PrimitiveType
{
	i32 prim;
}

Float2
{
	f32 x;
	f32 y;
}

Float3
{
	f32 x;
	f32 y;
	f32 z;
}

Float4, 16
{
	f32 x;
	f32 y;
	f32 z;
	f32 w;
}

Float4d16, 16
{
	i16 x;
	i16 y;
	i16 z;
	i16 w;
}

Short3, 2
{
	i16 x;
	i16 y;
	i16 z;
}

Short2, 2
{
	i16 x;
	i16 y;
}

Char3, 1
{
	i8 x;
	i8 y;
	i8 z;
}

Char2, 1
{
	i8 x;
	i8 y;
}

R6G6B6A6, 1
{
	i8 colourByte1;
	i8 colourByte2;
	i8 colourByte3;
}

R4G4B4A4, 2
{
	i16 colour;
}

R5G6B5, 2
{
	i16 colour;
}

Matrix4, 16
{
	Float4 _1;
	Float4 _2;
	Float4 _3;
	Float4 _4;
}

Int4, 16
{
	i32 x;
	i32 y;
	i32 z;
	i32 w;
}

Colour
{
	i32 colour;
}

PS2DrawBufferBlock
{
	ptr vifBuffer;
	i32 vifCnt;
}

LightBlock, 16
{
	Float4 mDiffuseDir0;
	Float4 mDiffuseDir1;
	Float4 mDiffuseDir2;
	Float4 mDiffuseColour0;
	Float4 mDiffuseColour1;
	Float4 mDiffuseColour2;
	Float4 mAmbientColour;
}

IrradLightBlock, 16
{
	Float4 Coeff[10];
}


PrimTag, 16
{
	i32 someData[8];
}


//--------------------------------
// Following Are PS2 VIF Types For
// Use By The GeometryCompiler
Float_VIF
{
	f32 mf32;
}

Float2_VIF
{
	f32 x;
	f32 y;
}

Float2d16_VIF
{
	i16 x;
	i16 y;
}

Float3_VIF
{
	f32 x;
	f32 y;
	f32 z;
}

Float4_VIF
{
	f32 x;
	f32 y;
	f32 z;
	f32 w;
}

Float4d16_VIF
{
	i16 x;
	i16 y;
	i16 z;
	i16 w;
}

Matrix4_VIF
{
	Float4_VIF _1;
	Float4_VIF _2;
	Float4_VIF _3;
	Float4_VIF _4;
}

I16_VIF
{
	i16 mi16;
}

I32_VIF
{
	i32 mi32;
}

Int4_VIF
{
	i32 _1;
	i32 _2;
	i32 _3;
	i32 _4;
}

Colour_VIF
{
	i32 colour;
}

PrimTag_VIF
{
	i32 someData[8];
}

PS2DMATag, 16
{
	i16 tag;
	i16 qwc;
	ptr addr;
	i32 tte1;
	i32 tte2;
}

// End RMS user type definitions
/////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Define custom types.
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
CrowdStructure, 16
{
	Matrix4 modelMatrix;
	Float4	colour;
	Float4	uvOffset;
}

NHLCrowdStructure, 16
{
	Float4	translateAndIndex;
	Float4	uvOffsetColourFactor;
}

Float3d16_VIF, 2
{
	i16 x;
	i16 y;
	i16 z;
}

Tools[edit | edit source]

Ebodit 0.2

NEBOViewer 0.8 by Akshag