summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2023-12-24 15:22:14 -0800
committerJasper St. Pierre <jstpierre@mecheye.net>2023-12-24 15:22:14 -0800
commitee6a21d7dc90d97aefb3ee4e77e77858099e26fb (patch)
treed4cad58b1fd68c053a9132b807e87b1771b9597f /src
parent790dba270d74966f57d0aa0999f6d70007b847ea (diff)
J3DAnm work
Diffstat (limited to 'src')
-rw-r--r--src/JSystem/J3DGraphAnimator/J3DAnimation.cpp215
-rw-r--r--src/JSystem/J3DGraphLoader/J3DAnmLoader.cpp45
2 files changed, 254 insertions, 6 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 */
diff --git a/src/JSystem/J3DGraphLoader/J3DAnmLoader.cpp b/src/JSystem/J3DGraphLoader/J3DAnmLoader.cpp
index fc6311ac..5a164dec 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<J3DAnmColorFullTable>(data, (void*)data->mTableOffsets[0]);
+ dst->mpTable[1] = JSUConvertOffsetToPtr<J3DAnmColorFullTable>(data, (void*)data->mTableOffsets[1]);
+ dst->mAnmVtxColorIndexData[0] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(data, (void*)data->mVtxColorIndexDataOffsets[0]);
+ dst->mAnmVtxColorIndexData[1] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(data, (void*)data->mVtxColorIndexDataOffsets[1]);
+ void* indexPtr0 = JSUConvertOffsetToPtr<u16>(data, (void*)data->mVtxColorIndexPointerOffsets[0]);
+ void* indexPtr1 = JSUConvertOffsetToPtr<u16>(data, (void*)data->mVtxColorIndexPointerOffsets[1]);
+
+ for (s32 i = 0; i < data->mIndexNum[0]; i++) {
+ // dst->mpIndexPtr
+ }
+
+ dst->mColorR = JSUConvertOffsetToPtr<u8>(data, (void*)data->mRValuesOffset);
+ dst->mColorG = JSUConvertOffsetToPtr<u8>(data, (void*)data->mGValuesOffset);
+ dst->mColorB = JSUConvertOffsetToPtr<u8>(data, (void*)data->mBValuesOffset);
+ dst->mColorA = JSUConvertOffsetToPtr<u8>(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<J3DAnmColorKeyTable>(data, (void*)data->mTableOffsets[0]);
+ dst->mpTable[1] = JSUConvertOffsetToPtr<J3DAnmColorKeyTable>(data, (void*)data->mTableOffsets[1]);
+ dst->mAnmVtxColorIndexData[0] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(data, (void*)data->mVtxColorIndexDataOffsets[0]);
+ dst->mAnmVtxColorIndexData[1] = JSUConvertOffsetToPtr<J3DAnmVtxColorIndexData>(data, (void*)data->mVtxColorIndexDataOffsets[1]);
+ void* indexPtr0 = JSUConvertOffsetToPtr<u16>(data, (void*)data->mVtxColorIndexPointerOffsets[0]);
+ void* indexPtr1 = JSUConvertOffsetToPtr<u16>(data, (void*)data->mVtxColorIndexPointerOffsets[1]);
+
+ for (s32 i = 0; i < data->mIndexNum[0]; i++) {
+ // dst->mpIndexPtr
+ }
+
+ dst->mColorR = JSUConvertOffsetToPtr<s16>(data, (void*)data->mRValuesOffset);
+ dst->mColorG = JSUConvertOffsetToPtr<s16>(data, (void*)data->mGValuesOffset);
+ dst->mColorB = JSUConvertOffsetToPtr<s16>(data, (void*)data->mBValuesOffset);
+ dst->mColorA = JSUConvertOffsetToPtr<s16>(data, (void*)data->mAValuesOffset);
}