diff options
| author | Jasper St. Pierre <jstpierre@mecheye.net> | 2023-12-24 15:22:14 -0800 |
|---|---|---|
| committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2023-12-24 15:22:14 -0800 |
| commit | ee6a21d7dc90d97aefb3ee4e77e77858099e26fb (patch) | |
| tree | d4cad58b1fd68c053a9132b807e87b1771b9597f /src/JSystem/J3DGraphAnimator/J3DAnimation.cpp | |
| parent | 790dba270d74966f57d0aa0999f6d70007b847ea (diff) | |
J3DAnm work
Diffstat (limited to 'src/JSystem/J3DGraphAnimator/J3DAnimation.cpp')
| -rw-r--r-- | src/JSystem/J3DGraphAnimator/J3DAnimation.cpp | 215 |
1 files changed, 211 insertions, 4 deletions
diff --git a/src/JSystem/J3DGraphAnimator/J3DAnimation.cpp b/src/JSystem/J3DGraphAnimator/J3DAnimation.cpp index 544a3e12..f1a9073a 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 <typename T> +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<f32>(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<s16>(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<s16>(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<s16>(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<s16>(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<s16>(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<s16>(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<s16>(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<s16>(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 */ |
