diff --git a/include/JSystem/J3DGraphAnimator/J3DAnimation.h b/include/JSystem/J3DGraphAnimator/J3DAnimation.h index 4e17cc6f6..3a2593b1a 100644 --- a/include/JSystem/J3DGraphAnimator/J3DAnimation.h +++ b/include/JSystem/J3DGraphAnimator/J3DAnimation.h @@ -84,7 +84,9 @@ struct J3DAnmClusterFullTable { u16 mOffset; }; -struct J3DAnmClusterKeyTable; +struct J3DAnmClusterKeyTable { + /* 0x00 */ J3DAnmKeyTableBase mWeightTable; +}; // same as J3DModelBlock? struct J3DAnmDataBlockHeader { // actual name unknown @@ -112,7 +114,8 @@ struct J3DAnmVtxColorFullData { /* 0x09 */ u8 field_0x9; // padding? /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 mAnmTableNum[2]; - /* 0x10 */ u8 field_0x10[0x18 - 0x10]; + /* 0x10 */ u16 mIndexNum[2]; + /* 0x14 */ u32 field_0x14; /* 0x18 */ s32 mTableOffsets[2]; /* 0x20 */ s32 mVtxColorIndexDataOffsets[2]; /* 0x28 */ s32 mVtxColorIndexPointerOffsets[2]; @@ -213,14 +216,14 @@ struct J3DAnmVtxColorKeyData { /* 0x09 */ u8 field_0x9; /* 0x0A */ s16 mFrameMax; /* 0x0C */ u16 mAnmTableNum[2]; - /* 0x10 */ u8 field_0x10[0x18 - 0x10]; + /* 0x10 */ u32 mIndexNum[2]; /* 0x18 */ s32 mTableOffsets[2]; - /* 0x20 */ s32 mVtxColoIndexDataOffset[2]; - /* 0x28 */ s32 mVtxColoIndexPointerOffset[2]; - /* 0x30 */ s32 mRValOffset; - /* 0x34 */ s32 mGValOffset; - /* 0x38 */ s32 mBValOffset; - /* 0x3C */ s32 mAValOffset; + /* 0x20 */ s32 mVtxColorIndexDataOffsets[2]; + /* 0x28 */ s32 mVtxColorIndexPointerOffsets[2]; + /* 0x30 */ s32 mRValuesOffset; + /* 0x34 */ s32 mGValuesOffset; + /* 0x38 */ s32 mBValuesOffset; + /* 0x3C */ s32 mAValuesOffset; }; // Size = 0x40 STATIC_ASSERT(sizeof(J3DAnmVtxColorKeyData) == 0x40); @@ -557,14 +560,14 @@ public: mKRegDataCount[0] = 0; mKRegUpdateMaterialID = NULL; mCRegUpdateMaterialID = NULL; - mAnmCRegData[3] = NULL; - mAnmCRegData[2] = NULL; - mAnmCRegData[1] = NULL; - mAnmCRegData[0] = NULL; - mAnmKRegData[3] = NULL; - mAnmKRegData[2] = NULL; - mAnmKRegData[1] = NULL; - mAnmKRegData[0] = NULL; + mAnmCRegDataA = NULL; + mAnmCRegDataB = NULL; + mAnmCRegDataG = NULL; + mAnmCRegDataR = NULL; + mAnmKRegDataA = NULL; + mAnmKRegDataB = NULL; + mAnmKRegDataG = NULL; + mAnmKRegDataR = NULL; mKind = 5; } void getTevColorReg(u16, GXColorS10*) const; @@ -597,8 +600,14 @@ private: /* 0x3C */ JUTNameTab mKRegUpdateMaterialName; /* 0x4C */ J3DAnmCRegKeyTable* mAnmCRegKeyTable; /* 0x50 */ J3DAnmKRegKeyTable* mAnmKRegKeyTable; - /* 0x54 */ s16 * mAnmCRegData[4]; - /* 0x64 */ s16 * mAnmKRegData[4]; + /* 0x54 */ s16 * mAnmCRegDataR; + /* 0x58 */ s16 * mAnmCRegDataG; + /* 0x5C */ s16 * mAnmCRegDataB; + /* 0x60 */ s16 * mAnmCRegDataA; + /* 0x64 */ s16 * mAnmKRegDataR; + /* 0x68 */ s16 * mAnmKRegDataG; + /* 0x6C */ s16 * mAnmKRegDataB; + /* 0x70 */ s16 * mAnmKRegDataA; }; // Size: 0x74 class J3DAnmColor : public J3DAnmBase { @@ -689,48 +698,62 @@ public: mAnmTableNum[i] = 0; } for (int i = 0; i < 2; i++) { - mAnmVtxColorIndexData[i] = 0; + mAnmVtxColorIndexData[i] = NULL; } } virtual ~J3DAnmVtxColor(); virtual void getColor(u8, u16, GXColor*) const {} -private: +protected: /* 0x10 */ s16 mAnmTableNum[2]; - /* 0x14 */ int mAnmVtxColorIndexData[2]; + /* 0x14 */ void* mAnmVtxColorIndexData[2]; }; // Size: 0x1C class J3DAnmVtxColorKey : public J3DAnmVtxColor { public: + friend class J3DAnmKeyLoader_v15; + J3DAnmVtxColorKey() { for (int i = 0; i < 2; i++) { - field_0x1c[i] = 0; + mpTable[i] = NULL; } } virtual ~J3DAnmVtxColorKey(); virtual void getColor(u8, u16, GXColor*) const; -private: - /* 0x1C */ int field_0x1c[2]; - /* 0x24 */ u8 field_0x24[0x34 - 0x24]; + J3DAnmColorKeyTable * getAnmTable(u8 idx) const { return mpTable[idx]; } + +protected: + /* 0x1C */ J3DAnmColorKeyTable* mpTable[2]; + /* 0x24 */ s16* mColorR; + /* 0x28 */ s16* mColorG; + /* 0x2C */ s16* mColorB; + /* 0x30 */ s16* mColorA; }; class J3DAnmVtxColorFull : public J3DAnmVtxColor { public: + friend class J3DAnmFullLoader_v15; + J3DAnmVtxColorFull() { for (int i = 0; i < 2; i++) { - field_0x1c[i] = 0; + mpTable[i] = NULL; } } virtual ~J3DAnmVtxColorFull(); virtual void getColor(u8, u16, GXColor*) const; -private: - /* 0x1C */ int field_0x1c[2]; - /* 0x24 */ u8 field_0x24[0x34 - 0x24]; + J3DAnmColorFullTable * getAnmTable(u8 idx) const { return mpTable[idx]; } + +protected: + /* 0x1C */ J3DAnmColorFullTable* mpTable[2]; + /* 0x24 */ u8* mColorR; + /* 0x28 */ u8* mColorG; + /* 0x2C */ u8* mColorB; + /* 0x30 */ u8* mColorA; }; class J3DAnmCluster : public J3DAnmBase { @@ -767,13 +790,13 @@ public: friend class J3DAnmKeyLoader_v15; J3DAnmClusterKey() : J3DAnmCluster(3, NULL) { - field_0x14 = 0; + mAnmTable = NULL; } virtual ~J3DAnmClusterKey() {} virtual f32 getWeight(u16) const; private: - /* 0x14 */ J3DAnmClusterKeyTable* field_0x14; + /* 0x14 */ J3DAnmClusterKeyTable* mAnmTable; }; class J3DFrameCtrl { diff --git a/src/JSystem/J3DGraphAnimator/J3DAnimation.cpp b/src/JSystem/J3DGraphAnimator/J3DAnimation.cpp index 544a3e12c..f1a9073ac 100644 --- a/src/JSystem/J3DGraphAnimator/J3DAnimation.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DAnimation.cpp @@ -242,18 +242,65 @@ f32 J3DAnmClusterFull::getWeight(u16 idx) const { return mWeight[maxFrame - 1 + getAnmTable()[idx].mOffset]; } +template +f32 J3DGetKeyFrameInterpolation(f32, J3DAnmKeyTableBase*, T*) { +} + /* 802F1188-802F120C .text getWeight__16J3DAnmClusterKeyCFUs */ -f32 J3DAnmClusterKey::getWeight(u16) const { +f32 J3DAnmClusterKey::getWeight(u16 idx) const { /* Nonmatching */ + J3DAnmKeyTableBase& table = mAnmTable[idx].mWeightTable; + if (table.mMaxFrame != 0 && table.mMaxFrame != 1) { + return J3DGetKeyFrameInterpolation(getFrame(), &table, &mWeight[table.mOffset]); + } else if (table.mMaxFrame == 0) { + return 1.0f; + } else { + return mWeight[table.mOffset]; + } } /* 802F120C-802F14B4 .text getColor__18J3DAnmVtxColorFullCFUcUsP8_GXColor */ -void J3DAnmVtxColorFull::getColor(u8, u16, GXColor* dst) const { - /* Nonmatching */ +void J3DAnmVtxColorFull::getColor(u8 col, u16 idx, GXColor* dst) const { + { + u16 maxFrame = getAnmTable(col)[idx].mRMaxFrame; + if (0.0f <= getFrame() && getFrame() < maxFrame) + dst->r = mColorR[(s32)getFrame() + getAnmTable(col)[idx].mROffset]; + else if (getFrame() < 0.0f) + dst->r = mColorR[getAnmTable(col)[idx].mROffset]; + else + dst->r = mColorR[maxFrame - 1 + getAnmTable(col)[idx].mROffset]; + } + { + u16 maxFrame = getAnmTable(col)[idx].mGMaxFrame; + if (0.0f <= getFrame() && getFrame() < maxFrame) + dst->g = mColorG[(s32)getFrame() + getAnmTable(col)[idx].mGOffset]; + else if (getFrame() < 0.0f) + dst->g = mColorG[getAnmTable(col)[idx].mGOffset]; + else + dst->g = mColorG[maxFrame - 1 + getAnmTable(col)[idx].mGOffset]; + } + { + u16 maxFrame = getAnmTable(col)[idx].mBMaxFrame; + if (0.0f <= getFrame() && getFrame() < maxFrame) + dst->b = mColorB[(s32)getFrame() + getAnmTable(col)[idx].mBOffset]; + else if (getFrame() < 0.0f) + dst->b = mColorB[getAnmTable(col)[idx].mBOffset]; + else + dst->b = mColorB[maxFrame - 1 + getAnmTable(col)[idx].mBOffset]; + } + { + u16 maxFrame = getAnmTable(col)[idx].mAMaxFrame; + if (0.0f <= getFrame() && getFrame() < maxFrame) + dst->a = mColorA[(s32)getFrame() + getAnmTable(col)[idx].mAOffset]; + else if (getFrame() < 0.0f) + dst->a = mColorA[getAnmTable(col)[idx].mAOffset]; + else + dst->a = mColorA[maxFrame - 1 + getAnmTable(col)[idx].mAOffset]; + } } /* 802F14B4-802F17D0 .text getColor__17J3DAnmVtxColorKeyCFUcUsP8_GXColor */ -void J3DAnmVtxColorKey::getColor(u8, u16, GXColor* dst) const { +void J3DAnmVtxColorKey::getColor(u8 col, u16 idx, GXColor* dst) const { /* Nonmatching */ } @@ -382,11 +429,171 @@ void J3DAnmTextureSRTKey::searchUpdateMaterialID(J3DModelData* modelData) { /* 802F22E0-802F2624 .text getTevColorReg__15J3DAnmTevRegKeyCFUsP11_GXColorS10 */ void J3DAnmTevRegKey::getTevColorReg(u16 idx, GXColorS10* dst) const { /* Nonmatching */ + { + J3DAnmKeyTableBase& table = getAnmCRegKeyTable()[idx].mRTable; + switch (table.mMaxFrame) { + case 0: + dst->r = 0; + break; + case 1: + dst->r = mAnmCRegDataR[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmCRegDataR[table.mOffset]); + if (v < -1024.0f) + dst->r = -1024; + if (v > 1023.0f) + dst->r = 1023; + if (0.0f <= v && v <= 255.0f) + dst->r = v; + break; + } + } + { + J3DAnmKeyTableBase& table = getAnmCRegKeyTable()[idx].mGTable; + switch (table.mMaxFrame) { + case 0: + dst->g = 0; + break; + case 1: + dst->g = mAnmCRegDataG[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmCRegDataG[table.mOffset]); + if (v < -1024.0f) + dst->g = -1024; + if (v > 1023.0f) + dst->g = 1023; + if (0.0f <= v && v <= 255.0f) + dst->g = v; + break; + } + } + { + J3DAnmKeyTableBase& table = getAnmCRegKeyTable()[idx].mBTable; + switch (table.mMaxFrame) { + case 0: + dst->b = 0; + break; + case 1: + dst->b = mAnmCRegDataB[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmCRegDataB[table.mOffset]); + if (v < -1024.0f) + dst->b = -1024; + if (v > 1023.0f) + dst->b = 1023; + if (0.0f <= v && v <= 255.0f) + dst->b = v; + break; + } + } + { + J3DAnmKeyTableBase& table = getAnmCRegKeyTable()[idx].mATable; + switch (table.mMaxFrame) { + case 0: + dst->a = 0; + break; + case 1: + dst->a = mAnmCRegDataA[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmCRegDataA[table.mOffset]); + if (v < -1024.0f) + dst->a = -1024; + if (v > 1023.0f) + dst->a = 1023; + if (0.0f <= v && v <= 255.0f) + dst->a = v; + break; + } + } } /* 802F2624-802F2968 .text getTevKonstReg__15J3DAnmTevRegKeyCFUsP8_GXColor */ void J3DAnmTevRegKey::getTevKonstReg(u16 idx, GXColor* dst) const { /* Nonmatching */ + { + J3DAnmKeyTableBase& table = getAnmKRegKeyTable()[idx].mRTable; + switch (table.mMaxFrame) { + case 0: + dst->r = 0; + break; + case 1: + dst->r = mAnmKRegDataR[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmKRegDataR[table.mOffset]); + if (v < 0.0f) + dst->r = 0; + if (v > 255.0f) + dst->r = 255; + if (0.0f <= v && v <= 255.0f) + dst->r = v; + break; + } + } + { + J3DAnmKeyTableBase& table = getAnmKRegKeyTable()[idx].mGTable; + switch (table.mMaxFrame) { + case 0: + dst->g = 0; + break; + case 1: + dst->g = mAnmKRegDataG[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmKRegDataG[table.mOffset]); + if (v < 0.0f) + dst->g = 0; + if (v > 255.0f) + dst->g = 255; + if (0.0f <= v && v <= 255.0f) + dst->g = v; + break; + } + } + { + J3DAnmKeyTableBase& table = getAnmKRegKeyTable()[idx].mBTable; + switch (table.mMaxFrame) { + case 0: + dst->b = 0; + break; + case 1: + dst->b = mAnmKRegDataB[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmKRegDataB[table.mOffset]); + if (v < 0.0f) + dst->b = 0; + if (v > 255.0f) + dst->b = 255; + if (0.0f <= v && v <= 255.0f) + dst->b = v; + break; + } + } + { + J3DAnmKeyTableBase& table = getAnmKRegKeyTable()[idx].mATable; + switch (table.mMaxFrame) { + case 0: + dst->a = 0; + break; + case 1: + dst->a = mAnmKRegDataA[table.mOffset]; + break; + default: + f32 v = J3DGetKeyFrameInterpolation(getFrame(), &table, &mAnmKRegDataA[table.mOffset]); + if (v < 0.0f) + dst->a = 0; + if (v > 255.0f) + dst->a = 255; + if (0.0f <= v && v <= 255.0f) + dst->a = v; + break; + } + } } /* 802F2968-802F2A64 .text searchUpdateMaterialID__15J3DAnmTevRegKeyFP16J3DMaterialTable */ diff --git a/src/JSystem/J3DGraphLoader/J3DAnmLoader.cpp b/src/JSystem/J3DGraphLoader/J3DAnmLoader.cpp index fc6311ac6..5a164decf 100644 --- a/src/JSystem/J3DGraphLoader/J3DAnmLoader.cpp +++ b/src/JSystem/J3DGraphLoader/J3DAnmLoader.cpp @@ -343,8 +343,28 @@ void J3DAnmFullLoader_v15::readAnmVtxColor(const J3DAnmVtxColorFullData* param_1 } /* 803001B0-80300318 .text setAnmVtxColor__20J3DAnmFullLoader_v15FP18J3DAnmVtxColorFullPC22J3DAnmVtxColorFullData */ -void J3DAnmFullLoader_v15::setAnmVtxColor(J3DAnmVtxColorFull*, const J3DAnmVtxColorFullData*) { +void J3DAnmFullLoader_v15::setAnmVtxColor(J3DAnmVtxColorFull* dst, const J3DAnmVtxColorFullData* data) { /* Nonmatching */ + dst->mFrameMax = data->mFrameMax; + dst->mAttribute = data->field_0x8; + dst->mFrame = 0.0f; + dst->mAnmTableNum[0] = data->mAnmTableNum[0]; + dst->mAnmTableNum[1] = data->mAnmTableNum[1]; + dst->mpTable[0] = JSUConvertOffsetToPtr(data, (void*)data->mTableOffsets[0]); + dst->mpTable[1] = JSUConvertOffsetToPtr(data, (void*)data->mTableOffsets[1]); + dst->mAnmVtxColorIndexData[0] = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexDataOffsets[0]); + dst->mAnmVtxColorIndexData[1] = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexDataOffsets[1]); + void* indexPtr0 = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexPointerOffsets[0]); + void* indexPtr1 = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexPointerOffsets[1]); + + for (s32 i = 0; i < data->mIndexNum[0]; i++) { + // dst->mpIndexPtr + } + + dst->mColorR = JSUConvertOffsetToPtr(data, (void*)data->mRValuesOffset); + dst->mColorG = JSUConvertOffsetToPtr(data, (void*)data->mGValuesOffset); + dst->mColorB = JSUConvertOffsetToPtr(data, (void*)data->mBValuesOffset); + dst->mColorA = JSUConvertOffsetToPtr(data, (void*)data->mAValuesOffset); } /* 80300318-80300464 .text load__19J3DAnmKeyLoader_v15FPCv */ @@ -571,6 +591,27 @@ void J3DAnmKeyLoader_v15::readAnmVtxColor(const J3DAnmVtxColorKeyData* param_1) } /* 80300C5C-80300DC4 .text setAnmVtxColor__19J3DAnmKeyLoader_v15FP17J3DAnmVtxColorKeyPC21J3DAnmVtxColorKeyData */ -void J3DAnmKeyLoader_v15::setAnmVtxColor(J3DAnmVtxColorKey*, const J3DAnmVtxColorKeyData*) { +void J3DAnmKeyLoader_v15::setAnmVtxColor(J3DAnmVtxColorKey* dst, const J3DAnmVtxColorKeyData* data) { /* Nonmatching */ + + dst->mFrameMax = data->mFrameMax; + dst->mAttribute = data->field_0x8; + dst->mFrame = 0.0f; + dst->mAnmTableNum[0] = data->mAnmTableNum[0]; + dst->mAnmTableNum[1] = data->mAnmTableNum[1]; + dst->mpTable[0] = JSUConvertOffsetToPtr(data, (void*)data->mTableOffsets[0]); + dst->mpTable[1] = JSUConvertOffsetToPtr(data, (void*)data->mTableOffsets[1]); + dst->mAnmVtxColorIndexData[0] = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexDataOffsets[0]); + dst->mAnmVtxColorIndexData[1] = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexDataOffsets[1]); + void* indexPtr0 = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexPointerOffsets[0]); + void* indexPtr1 = JSUConvertOffsetToPtr(data, (void*)data->mVtxColorIndexPointerOffsets[1]); + + for (s32 i = 0; i < data->mIndexNum[0]; i++) { + // dst->mpIndexPtr + } + + dst->mColorR = JSUConvertOffsetToPtr(data, (void*)data->mRValuesOffset); + dst->mColorG = JSUConvertOffsetToPtr(data, (void*)data->mGValuesOffset); + dst->mColorB = JSUConvertOffsetToPtr(data, (void*)data->mBValuesOffset); + dst->mColorA = JSUConvertOffsetToPtr(data, (void*)data->mAValuesOffset); }