// // Generated by dtk // Translation Unit: J3DAnimation.cpp // #include "JSystem/JSystem.h" // IWYU pragma: keep #include "JSystem/J3DGraphAnimator/J3DAnimation.h" #include "JSystem/JMath/JMath.h" #include "dolphin/os/OS.h" /* 802EF5D8-802EF608 .text init__12J3DFrameCtrlFs */ void J3DFrameCtrl::init(s16 end) { mAttribute = EMode_LOOP; mState = 0; mStart = 0; mEnd = end; mLoop = 0; mRate = 1.0f; mFrame = 0.0f; } /* 802EF608-802EFBA8 .text checkPass__12J3DFrameCtrlFf */ BOOL J3DFrameCtrl::checkPass(f32 pass_frame) { f32 cur_frame = mFrame; f32 next_frame = cur_frame + mRate; switch (mAttribute) { case EMode_NONE: case EMode_RESET: if (next_frame < mStart) { next_frame = mStart; } if (next_frame >= mEnd) { next_frame = mEnd - 0.001f; } if (cur_frame <= next_frame) { if (cur_frame <= pass_frame && pass_frame < next_frame) { return true; } else { return false; } } if (next_frame <= pass_frame && pass_frame < cur_frame) { return true; } return false; case EMode_LOOP: if (cur_frame < mStart) { while (next_frame < mStart) { if (mLoop - mStart <= 0.0f) { break; } next_frame += mLoop - mStart; } if (next_frame <= pass_frame && pass_frame < mLoop) { return true; } else { return false; } } else if (mEnd <= cur_frame) { while (next_frame >= mEnd) { if (mEnd - mLoop <= 0.0f) { break; } next_frame -= mEnd - mLoop; } if (mLoop <= pass_frame && pass_frame < next_frame) { return true; } else { return false; } } else if (next_frame < mStart) { while (next_frame < mStart) { if (mLoop - mStart <= 0.0f) { break; } next_frame += mLoop - mStart; } if ((mStart <= pass_frame && pass_frame < cur_frame) || (next_frame <= pass_frame && pass_frame < mLoop)) { return true; } else { return false; } } else if (mEnd <= next_frame) { while (next_frame >= mEnd) { if (mEnd - mLoop <= 0.0f) { break; } next_frame -= mEnd - mLoop; } if ((cur_frame <= pass_frame && pass_frame < mEnd) || (mLoop <= pass_frame && pass_frame < next_frame)) { return true; } else { return false; } } else if (cur_frame <= next_frame) { if (cur_frame <= pass_frame && pass_frame < next_frame) { return true; } else { return false; } } else if (next_frame <= pass_frame && pass_frame < cur_frame) { return true; } return false; case EMode_REVERSE: case EMode_LOOP_REVERSE: if (next_frame >= mEnd) { next_frame = mEnd - 0.001f; } if (next_frame < mStart) { next_frame = mStart; } if (cur_frame <= next_frame) { if (cur_frame <= pass_frame && pass_frame < next_frame) { return true; } else { return false; } } if (next_frame <= pass_frame && pass_frame < cur_frame) { return true; } return false; default: return false; } } /* 802EFBA8-802EFFE4 .text update__12J3DFrameCtrlFv */ void J3DFrameCtrl::update() { mState = 0; mFrame += mRate; switch (mAttribute) { case EMode_NONE: if (mFrame < mStart) { mFrame = mStart; mRate = 0.0f; mState |= 1; } if (mFrame >= mEnd) { mFrame = mEnd - 0.001f; mRate = 0.0f; mState |= 1; } break; case EMode_RESET: if (mFrame < mStart) { mFrame = mStart; mRate = 0.0f; mState |= 1; } if (mFrame >= mEnd) { mFrame = mStart; mRate = 0.0f; mState |= 1; } break; case EMode_LOOP: while (mFrame < mStart) { mState |= 2; if (mLoop - mStart <= 0.0f) { break; } mFrame += mLoop - mStart; } while (mFrame >= mEnd) { mState |= 2; if (mEnd - mLoop <= 0.0f) { break; } mFrame -= mEnd - mLoop; } break; case EMode_REVERSE: if (mFrame >= mEnd) { mFrame = mEnd - 0.001f; mRate = -mRate; } if (mFrame < mStart) { mFrame = mStart; mRate = 0.0f; mState |= 1; } break; case EMode_LOOP_REVERSE: if (mFrame >= mEnd) { mFrame = mEnd - 0.001f; mRate = -mRate; } if (mFrame < mStart) { mFrame = mStart; mRate = -mRate; mState |= 2; } break; } } /* 802EFFE4-802F06D8 .text getTransform__19J3DAnmTransformFullCFUsP16J3DTransformInfo */ void J3DAnmTransformFull::getTransform(u16 idx, J3DTransformInfo* dst) const { /* Scale */ { u16 maxFrame = mAnmTable[idx*3 + 0].mScaleMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame) { s32 frame = getFrame(); dst->mScale.x = mScaleData[frame + mAnmTable[idx*3 + 0].mScaleOffset]; } else if (getFrame() < 0.0f) dst->mScale.x = mScaleData[mAnmTable[idx*3 + 0].mScaleOffset]; else dst->mScale.x = mScaleData[maxFrame - 1 + mAnmTable[idx*3 + 0].mScaleOffset]; } /* Seems they copy-pasted this block one too many times? */ { u16 maxFrame = mAnmTable[idx*3 + 0].mScaleMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame) { s32 frame = getFrame(); dst->mScale.x = mScaleData[frame + mAnmTable[idx*3 + 0].mScaleOffset]; } else if (getFrame() < 0.0f) dst->mScale.x = mScaleData[mAnmTable[idx*3 + 0].mScaleOffset]; else dst->mScale.x = mScaleData[maxFrame - 1 + mAnmTable[idx*3 + 0].mScaleOffset]; } { u16 maxFrame = mAnmTable[idx*3 + 1].mScaleMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame) { s32 frame = getFrame(); dst->mScale.y = mScaleData[frame + mAnmTable[idx*3 + 1].mScaleOffset]; } else if (getFrame() < 0.0f) dst->mScale.y = mScaleData[mAnmTable[idx*3 + 1].mScaleOffset]; else dst->mScale.y = mScaleData[maxFrame - 1 + mAnmTable[idx*3 + 1].mScaleOffset]; } { u16 maxFrame = mAnmTable[idx*3 + 2].mScaleMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame){ s32 frame = getFrame(); dst->mScale.z = mScaleData[frame + mAnmTable[idx*3 + 2].mScaleOffset]; } else if (getFrame() < 0.0f) dst->mScale.z = mScaleData[mAnmTable[idx*3 + 2].mScaleOffset]; else dst->mScale.z = mScaleData[maxFrame - 1 + mAnmTable[idx*3 + 2].mScaleOffset]; } /* Rotation */ { u16 maxFrame = mAnmTable[idx*3 + 0].mRotationMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame){ s32 frame = getFrame(); dst->mRotation.x = mRotData[frame + mAnmTable[idx*3 + 0].mRotationOffset]; } else if (getFrame() < 0.0f) dst->mRotation.x = mRotData[mAnmTable[idx*3 + 0].mRotationOffset]; else dst->mRotation.x = mRotData[maxFrame - 1 + mAnmTable[idx*3 + 0].mRotationOffset]; } { u16 maxFrame = mAnmTable[idx*3 + 1].mRotationMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame){ s32 frame = getFrame(); dst->mRotation.y = mRotData[frame + mAnmTable[idx*3 + 1].mRotationOffset]; } else if (getFrame() < 0.0f) dst->mRotation.y = mRotData[mAnmTable[idx*3 + 1].mRotationOffset]; else dst->mRotation.y = mRotData[maxFrame - 1 + mAnmTable[idx*3 + 1].mRotationOffset]; } { u16 maxFrame = mAnmTable[idx*3 + 2].mRotationMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame){ s32 frame = getFrame(); dst->mRotation.z = mRotData[frame + mAnmTable[idx*3 + 2].mRotationOffset]; } else if (getFrame() < 0.0f) dst->mRotation.z = mRotData[mAnmTable[idx*3 + 2].mRotationOffset]; else dst->mRotation.z = mRotData[maxFrame - 1 + mAnmTable[idx*3 + 2].mRotationOffset]; } /* Translation */ { u16 maxFrame = mAnmTable[idx*3 + 0].mTranslateMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame){ s32 frame = getFrame(); dst->mTranslate.x = mTransData[frame + mAnmTable[idx*3 + 0].mTranslateOffset]; } else if (getFrame() < 0.0f) dst->mTranslate.x = mTransData[mAnmTable[idx*3 + 0].mTranslateOffset]; else dst->mTranslate.x = mTransData[maxFrame - 1 + mAnmTable[idx*3 + 0].mTranslateOffset]; } { u16 maxFrame = mAnmTable[idx*3 + 1].mTranslateMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame){ s32 frame = getFrame(); dst->mTranslate.y = mTransData[frame + mAnmTable[idx*3 + 1].mTranslateOffset]; } else if (getFrame() < 0.0f) dst->mTranslate.y = mTransData[mAnmTable[idx*3 + 1].mTranslateOffset]; else dst->mTranslate.y = mTransData[maxFrame - 1 + mAnmTable[idx*3 + 1].mTranslateOffset]; } { u16 maxFrame = mAnmTable[idx*3 + 2].mTranslateMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame){ s32 frame = getFrame(); dst->mTranslate.z = mTransData[frame + mAnmTable[idx*3 + 2].mTranslateOffset]; } else if (getFrame() < 0.0f) dst->mTranslate.z = mTransData[mAnmTable[idx*3 + 2].mTranslateOffset]; else dst->mTranslate.z = mTransData[maxFrame - 1 + mAnmTable[idx*3 + 2].mTranslateOffset]; } } /* 802F06D8-802F072C .text J3DHermiteInterpolationS__FfPsPsPsPsPsPs */ f32 J3DHermiteInterpolationS(f32 t, s16* time0, s16* value0, s16* tangent0, s16* time1, s16* value1, s16* tangent1) { /* f32 v0 = *(f32*)value0; f32 timeRange = (*(f32*)time1 - *(f32*)time0); f32 kt = (t - *(f32*)time0) / timeRange; f32 t1 = (-timeRange * *(f32*)tangent0 - (*(f32*)value1 - v0)); f32 t2 = kt * kt * ((*(f32*)tangent1 * timeRange + v0) - *(f32*)value1 - t1); return (t1 * kt * kt + (timeRange * *(f32*)tangent0 + t2) * kt + v0) - t2; */ register f32 p1 = t; register s16* p2 = time0; register s16* p3 = value0; register s16* p4 = tangent0; register s16* p5 = time1; register s16* p6 = value1; register s16* p7 = tangent1; register f32 fout; #ifdef __MWERKS__ asm { psq_l f0, 0(p2), 0x1, 5 psq_l f3, 0(p5), 0x1, 5 psq_l f2, 0(p3), 0x1, 5 fsubs f4, f3, f0 psq_l f3, 0(p6), 0x1, 5 fsubs f6, fout, f0 psq_l fout, 0(p7), 0x1, 5 fsubs f5, f3, f2 fdivs f6, f6, f4 psq_l f0, 0(p4), 0x1, 5 fmadds fout, fout, f4, f2 fmuls f7, f6, f6 fnmsubs f5, f4, f0, f5 fsubs fout, fout, f3 fsubs fout, fout, f5 fmuls f3, f7, fout fmadds fout, f4, f0, f3 fmadds fout, fout, f6, f2 fmadds fout, f5, f7, fout fsubs fout, fout, f3 } #endif return fout; } /* 802F072C-802F0954 .text J3DGetKeyFrameInterpolationS__FfP18J3DAnmKeyTableBasePs */ f32 J3DGetKeyFrameInterpolationS(f32 frame, J3DAnmKeyTableBase* table, s16* data) { if (table->mType == 0) { if (frame < data[0]) { return data[1]; } else if (data[3 * (table->mMaxFrame - 1)] <= frame) { return data[3 * (table->mMaxFrame - 1) + 1]; } else { // bisect int num = table->mMaxFrame; while (num > 1) { int mid = num / 2; if (frame >= data[3 * mid]) { data += 3 * mid; num -= mid; } else { num = mid; } } return J3DHermiteInterpolationS(frame, &data[0], &data[1], &data[2], &data[3], &data[4], &data[5]); } } else { if (frame < data[0]) { return data[1]; } else if (data[4 * (table->mMaxFrame - 1)] <= frame) { return data[4 * (table->mMaxFrame - 1) + 1]; } else { // bisect int num = table->mMaxFrame; while (num > 1) { int mid = num / 2; if (frame >= data[4 * mid]) { data += 4 * mid; num -= mid; } else { num = mid; } } return J3DHermiteInterpolationS(frame, &data[0], &data[1], &data[3], &data[4], &data[5], &data[6]); } } } template f32 J3DGetKeyFrameInterpolation(f32 frame, J3DAnmKeyTableBase* table, T* data) { if (table->mType == 0) { if (frame < data[0]) { return data[1]; } else if (data[3 * (table->mMaxFrame - 1)] <= frame) { return data[3 * (table->mMaxFrame - 1) + 1]; } else { // bisect int num = table->mMaxFrame; while (num > 1) { int mid = num / 2; if (frame >= data[3 * mid]) { data += 3 * mid; num -= mid; } else { num = mid; } } return JMAHermiteInterpolation(frame, data[0], data[1], data[2], data[3], data[4], data[5]); } } else { if (frame < data[0]) { return data[1]; } else if (data[4 * (table->mMaxFrame - 1)] <= frame) { return data[4 * (table->mMaxFrame - 1) + 1]; } else { // bisect int num = table->mMaxFrame; while (num > 1) { int mid = num / 2; if (frame >= data[4 * mid]) { data += 4 * mid; num -= mid; } else { num = mid; } } return JMAHermiteInterpolation(frame, data[0], data[1], data[3], data[4], data[5], data[6]); } } } /* 802F0954-802F0E20 .text calcTransform__18J3DAnmTransformKeyCFfUsP16J3DTransformInfo */ void J3DAnmTransformKey::calcTransform(f32 frame, u16 idx, J3DTransformInfo* dst) const { /* Scale */ switch (mAnmTable[idx*3 + 0].mScale.mMaxFrame) { case 0: dst->mScale.x = 1.0f; break; case 1: dst->mScale.x = mScaleData[mAnmTable[idx*3 + 0].mScale.mOffset]; break; default: dst->mScale.x = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 0].mScale, &mScaleData[mAnmTable[idx*3 + 0].mScale.mOffset]); break; } switch (mAnmTable[idx*3 + 1].mScale.mMaxFrame) { case 0: dst->mScale.y = 1.0f; break; case 1: dst->mScale.y = mScaleData[mAnmTable[idx*3 + 1].mScale.mOffset]; break; default: dst->mScale.y = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 1].mScale, &mScaleData[mAnmTable[idx*3 + 1].mScale.mOffset]); break; } switch (mAnmTable[idx*3 + 2].mScale.mMaxFrame) { case 0: dst->mScale.z = 1.0f; break; case 1: dst->mScale.z = mScaleData[mAnmTable[idx*3 + 2].mScale.mOffset]; break; default: dst->mScale.z = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 2].mScale, &mScaleData[mAnmTable[idx*3 + 2].mScale.mOffset]); break; } /* Rotation */ switch (mAnmTable[idx*3 + 0].mRotation.mMaxFrame) { case 0: dst->mRotation.x = 0; break; case 1: dst->mRotation.x = mRotData[mAnmTable[idx*3 + 0].mRotation.mOffset] << mDecShift; break; default: dst->mRotation.x = (s32)(J3DGetKeyFrameInterpolationS(frame, &mAnmTable[idx*3 + 0].mRotation, &mRotData[mAnmTable[idx*3 + 0].mRotation.mOffset])) << mDecShift; break; } switch (mAnmTable[idx*3 + 1].mRotation.mMaxFrame) { case 0: dst->mRotation.y = 0; break; case 1: dst->mRotation.y = mRotData[mAnmTable[idx*3 + 1].mRotation.mOffset] << mDecShift; break; default: dst->mRotation.y = (s32)(J3DGetKeyFrameInterpolationS(frame, &mAnmTable[idx*3 + 1].mRotation, &mRotData[mAnmTable[idx*3 + 1].mRotation.mOffset])) << mDecShift; break; } switch (mAnmTable[idx*3 + 2].mRotation.mMaxFrame) { case 0: dst->mRotation.z = 0; break; case 1: dst->mRotation.z = mRotData[mAnmTable[idx*3 + 2].mRotation.mOffset] << mDecShift; break; default: dst->mRotation.z = (s32)(J3DGetKeyFrameInterpolationS(frame, &mAnmTable[idx*3 + 2].mRotation, &mRotData[mAnmTable[idx*3 + 2].mRotation.mOffset])) << mDecShift; break; } /* Translation */ switch (mAnmTable[idx*3 + 0].mTranslate.mMaxFrame) { case 0: dst->mTranslate.x = 0.0f; break; case 1: dst->mTranslate.x = mTransData[mAnmTable[idx*3 + 0].mTranslate.mOffset]; break; default: dst->mTranslate.x = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 0].mTranslate, &mTransData[mAnmTable[idx*3 + 0].mTranslate.mOffset]); break; } switch (mAnmTable[idx*3 + 1].mTranslate.mMaxFrame) { case 0: dst->mTranslate.y = 0.0f; break; case 1: dst->mTranslate.y = mTransData[mAnmTable[idx*3 + 1].mTranslate.mOffset]; break; default: dst->mTranslate.y = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 1].mTranslate, &mTransData[mAnmTable[idx*3 + 1].mTranslate.mOffset]); break; } switch (mAnmTable[idx*3 + 2].mTranslate.mMaxFrame) { case 0: dst->mTranslate.z = 0.0f; break; case 1: dst->mTranslate.z = mTransData[mAnmTable[idx*3 + 2].mTranslate.mOffset]; break; default: dst->mTranslate.z = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 2].mTranslate, &mTransData[mAnmTable[idx*3 + 2].mTranslate.mOffset]); break; } } /* 802F0E20-802F10D4 .text calcTransform__19J3DAnmTextureSRTKeyCFfUsP17J3DTextureSRTInfo */ void J3DAnmTextureSRTKey::calcTransform(f32 frame, u16 idx, J3DTextureSRTInfo* dst) const { /* Scale */ switch (mAnmTable[idx*3 + 0].mScale.mMaxFrame) { case 0: dst->mScaleX = 1.0f; break; case 1: dst->mScaleX = mScaleData[mAnmTable[idx*3 + 0].mScale.mOffset]; break; default: dst->mScaleX = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 0].mScale, &mScaleData[mAnmTable[idx*3 + 0].mScale.mOffset]); break; } switch (mAnmTable[idx*3 + 1].mScale.mMaxFrame) { case 0: dst->mScaleY = 1.0f; break; case 1: dst->mScaleY = mScaleData[mAnmTable[idx*3 + 1].mScale.mOffset]; break; default: dst->mScaleY = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 1].mScale, &mScaleData[mAnmTable[idx*3 + 1].mScale.mOffset]); break; } /* Rotation */ switch (mAnmTable[idx*3 + 2].mRotation.mMaxFrame) { case 0: dst->mRotation = 0; break; case 1: dst->mRotation = mRotData[mAnmTable[idx*3 + 2].mRotation.mOffset] << mDecShift; break; default: dst->mRotation = (s32)(J3DGetKeyFrameInterpolationS(frame, &mAnmTable[idx*3 + 2].mRotation, &mRotData[mAnmTable[idx*3 + 2].mRotation.mOffset])) << mDecShift; break; } /* Translation */ switch (mAnmTable[idx*3 + 0].mTranslate.mMaxFrame) { case 0: dst->mTranslationX = 0.0f; break; case 1: dst->mTranslationX = mTransData[mAnmTable[idx*3 + 0].mTranslate.mOffset]; break; default: dst->mTranslationX = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 0].mTranslate, &mTransData[mAnmTable[idx*3 + 0].mTranslate.mOffset]); break; } switch (mAnmTable[idx*3 + 1].mTranslate.mMaxFrame) { case 0: dst->mTranslationY = 0.0f; break; case 1: dst->mTranslationY = mTransData[mAnmTable[idx*3 + 1].mTranslate.mOffset]; break; default: dst->mTranslationY = J3DGetKeyFrameInterpolation(frame, &mAnmTable[idx*3 + 1].mTranslate, &mTransData[mAnmTable[idx*3 + 1].mTranslate.mOffset]); break; } } /* 802F10D4-802F1188 .text getWeight__17J3DAnmClusterFullCFUs */ f32 J3DAnmClusterFull::getWeight(u16 idx) const { u16 maxFrame = getAnmTable()[idx].mMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame) return mWeight[(s32)getFrame() + getAnmTable()[idx].mOffset]; if (getFrame() < 0.0f) return mWeight[getAnmTable()[idx].mOffset]; else return mWeight[maxFrame - 1 + getAnmTable()[idx].mOffset]; } /* 802F1188-802F120C .text getWeight__16J3DAnmClusterKeyCFUs */ f32 J3DAnmClusterKey::getWeight(u16 idx) const { if (mAnmTable[idx].mWeightTable.mMaxFrame != 0 && mAnmTable[idx].mWeightTable.mMaxFrame != 1) { return J3DGetKeyFrameInterpolation(getFrame(), &mAnmTable[idx].mWeightTable, &mWeight[mAnmTable[idx].mWeightTable.mOffset]); } else if (mAnmTable[idx].mWeightTable.mMaxFrame == 0) { return 1.0f; } else { return mWeight[mAnmTable[idx].mWeightTable.mOffset]; } } /* 802F120C-802F14B4 .text getColor__18J3DAnmVtxColorFullCFUcUsP8_GXColor */ 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 col, u16 idx, GXColor* outColor) const { f32 frame; switch (getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::RED].mMaxFrame) { case 0: outColor->r = 0; break; case 1: outColor->r = mColorR[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::RED].mOffset]; break; default: frame = J3DGetKeyFrameInterpolationS(mFrame, &getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::RED], &mColorR[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::RED].mOffset]); if (frame <= 0.0f) { outColor->r = 0; } else if (frame <= 255.0f) { OSf32tou8(&frame, &outColor->r); } else { outColor->r = 255; } } switch (getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::GREEN].mMaxFrame) { case 0: outColor->g = 0; break; case 1: outColor->g = mColorG[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::GREEN].mOffset]; break; default: frame = J3DGetKeyFrameInterpolationS(mFrame, &getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::GREEN], &mColorG[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::GREEN].mOffset]); if (frame <= 0.0f) { outColor->g = 0; } else if (frame <= 255.0f) { OSf32tou8(&frame, &outColor->g); } else { outColor->g = 255; } } switch (getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::BLUE].mMaxFrame) { case 0: outColor->b = 0; break; case 1: outColor->b = mColorB[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::BLUE].mOffset]; break; default: frame = J3DGetKeyFrameInterpolationS(mFrame, &getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::BLUE], &mColorB[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::BLUE].mOffset]); if (frame <= 0.0f) { outColor->b = 0; } else if (frame <= 255.0f) { OSf32tou8(&frame, &outColor->b); } else { outColor->b = 255; } } switch (getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::ALPHA].mMaxFrame) { case 0: outColor->a = 0; break; case 1: outColor->a = mColorA[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::ALPHA].mOffset]; break; default: frame = J3DGetKeyFrameInterpolationS(mFrame, &getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::ALPHA], &mColorA[getAnmTable(col)[idx].mColorInfo[J3DAnmColorKeyTable::ALPHA].mOffset]); if (frame <= 0.0f) { outColor->a = 0; } else if (frame <= 255.0f) { OSf32tou8(&frame, &outColor->a); } else { outColor->a = 255; } } } /* 802F17D0-802F1868 .text searchUpdateMaterialID__11J3DAnmColorFP16J3DMaterialTable */ void J3DAnmColor::searchUpdateMaterialID(J3DMaterialTable* table) { for (u16 i = 0; i < getUpdateMaterialNum(); i++) { s32 materialID = table->getMaterialName()->getIndex(getUpdateMaterialName()->getName(i)); if (materialID != -1) mUpdateMaterialID[i] = materialID; else mUpdateMaterialID[i] = 0xFFFF; } } /* 802F1868-802F188C .text searchUpdateMaterialID__11J3DAnmColorFP12J3DModelData */ void J3DAnmColor::searchUpdateMaterialID(J3DModelData* modelData) { searchUpdateMaterialID(&modelData->getMaterialTable()); } /* 802F188C-802F1BDC .text getColor__15J3DAnmColorFullCFUsP8_GXColor */ void J3DAnmColorFull::getColor(u16 idx, GXColor* dst) const { { u16 maxFrame = getAnmTable()[idx].mRMaxFrame; if (getFrame() < 0.0f) dst->r = mColorR[getAnmTable()[idx].mROffset]; if (getFrame() >= maxFrame) dst->r = mColorR[maxFrame - 1 + getAnmTable()[idx].mROffset]; if (0.0f <= getFrame() && getFrame() < maxFrame) dst->r = mColorR[(s32)getFrame() + getAnmTable()[idx].mROffset]; } { u16 maxFrame = getAnmTable()[idx].mGMaxFrame; if (getFrame() < 0.0f) dst->g = mColorG[getAnmTable()[idx].mGOffset]; if (getFrame() >= maxFrame) dst->g = mColorG[maxFrame - 1 + getAnmTable()[idx].mGOffset]; if (0.0f <= getFrame() && getFrame() < maxFrame) dst->g = mColorG[(s32)getFrame() + getAnmTable()[idx].mGOffset]; } { u16 maxFrame = getAnmTable()[idx].mBMaxFrame; if (getFrame() < 0.0f) dst->b = mColorB[getAnmTable()[idx].mBOffset]; if (getFrame() >= maxFrame) dst->b = mColorB[maxFrame - 1 + getAnmTable()[idx].mBOffset]; if (0.0f <= getFrame() && getFrame() < maxFrame) dst->b = mColorB[(s32)getFrame() + getAnmTable()[idx].mBOffset]; } { u16 maxFrame = getAnmTable()[idx].mAMaxFrame; if (getFrame() < 0.0f) dst->a = mColorA[getAnmTable()[idx].mAOffset]; if (getFrame() >= maxFrame) dst->a = mColorA[maxFrame - 1 + getAnmTable()[idx].mAOffset]; if (0.0f <= getFrame() && getFrame() < maxFrame) dst->a = mColorA[(s32)getFrame() + getAnmTable()[idx].mAOffset]; } } /* 802F1BDC-802F1F20 .text getColor__14J3DAnmColorKeyCFUsP8_GXColor */ void J3DAnmColorKey::getColor(u16 tableIndex, GXColor* outColor) const { f32 frame; switch (mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::RED].mMaxFrame) { case 0: outColor->r = 0; break; case 1: outColor->r = mColorR[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::RED].mOffset]; break; default: frame = J3DGetKeyFrameInterpolation(mFrame, &mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::RED], &mColorR[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::RED].mOffset]); if (frame < 0.0f) { outColor->r = 0; } if (frame > 255.0f) { outColor->r = 255; } if (0.0f <= frame && frame <= 255.0f) { outColor->r = frame; } } switch (mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::GREEN].mMaxFrame) { case 0: outColor->g = 0; break; case 1: outColor->g = mColorG[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::GREEN].mOffset]; break; default: frame = J3DGetKeyFrameInterpolation(mFrame, &mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::GREEN], &mColorG[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::GREEN].mOffset]); if (frame < 0.0f) { outColor->g = 0; } if (frame > 255.0f) { outColor->g = 255; } if (0.0f <= frame && frame <= 255.0f) { outColor->g = frame; } } switch (mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::BLUE].mMaxFrame) { case 0: outColor->b = 0; break; case 1: outColor->b = mColorB[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::BLUE].mOffset]; break; default: frame = J3DGetKeyFrameInterpolation(mFrame, &mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::BLUE], &mColorB[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::BLUE].mOffset]); if (frame < 0.0f) { outColor->b = 0; } if (frame > 255.0f) { outColor->b = 255; } if (0.0f <= frame && frame <= 255.0f) { outColor->b = frame; } } switch (mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::ALPHA].mMaxFrame) { case 0: outColor->a = 0; break; case 1: outColor->a = mColorA[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::ALPHA].mOffset]; break; default: frame = J3DGetKeyFrameInterpolation(mFrame, &mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::ALPHA], &mColorA[mTable[tableIndex].mColorInfo[J3DAnmColorKeyTable::ALPHA].mOffset]); if (frame < 0.0f) { outColor->a = 0; } if (frame > 255.0f) { outColor->a = 255; } if (0.0f <= frame && frame <= 255.0f) { outColor->a = frame; } } } /* 802F1F20-802F200C .text getTexNo__16J3DAnmTexPatternCFUsPUs */ void J3DAnmTexPattern::getTexNo(u16 idx, u16* dst) const { u16 maxFrame = getAnmTable()[idx].mMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame) *dst = mTextureIndex[(s32)getFrame() + getAnmTable()[idx].mOffset]; if (getFrame() < 0.0f) *dst = mTextureIndex[getAnmTable()[idx].mOffset]; if (getFrame() >= maxFrame) *dst = mTextureIndex[maxFrame - 1 + getAnmTable()[idx].mOffset]; } /* 802F200C-802F20EC .text getVisibility__20J3DAnmVisibilityFullCFUsPUc */ void J3DAnmVisibilityFull::getVisibility(u16 idx, u8* dst) const { u16 maxFrame = getAnmTable()[idx].mMaxFrame; if (0.0f <= getFrame() && getFrame() < maxFrame) *dst = mVisibility[(s32)getFrame() + getAnmTable()[idx].mOffset]; if (getFrame() < 0.0f) *dst = mVisibility[getAnmTable()[idx].mOffset]; if (getFrame() >= maxFrame) *dst = mVisibility[maxFrame - 1 + getAnmTable()[idx].mOffset]; } /* 802F20EC-802F2184 .text searchUpdateMaterialID__16J3DAnmTexPatternFP16J3DMaterialTable */ void J3DAnmTexPattern::searchUpdateMaterialID(J3DMaterialTable* table) { for (u16 i = 0; i < getUpdateMaterialNum(); i++) { s32 materialID = table->getMaterialName()->getIndex(getUpdateMaterialName()->getName(i)); if (materialID != -1) mUpdateMaterialID[i] = materialID; else mUpdateMaterialID[i] = 0xFFFF; } } /* 802F2184-802F21A8 .text searchUpdateMaterialID__16J3DAnmTexPatternFP12J3DModelData */ void J3DAnmTexPattern::searchUpdateMaterialID(J3DModelData* modelData) { searchUpdateMaterialID(&modelData->getMaterialTable()); } /* 802F21A8-802F22BC .text searchUpdateMaterialID__19J3DAnmTextureSRTKeyFP16J3DMaterialTable */ void J3DAnmTextureSRTKey::searchUpdateMaterialID(J3DMaterialTable* table) { for (u16 i = 0; i < getUpdateMaterialNum(); i++) { s32 materialID = table->getMaterialName()->getIndex(getUpdateMaterialName()->getName(i)); if (materialID != -1) mUpdateMaterialID[i] = materialID; else mUpdateMaterialID[i] = 0xFFFF; } for (u16 i = 0; i < getPostUpdateMaterialNum(); i++) { s32 materialID = table->getMaterialName()->getIndex(getPostUpdateMaterialName()->getName(i)); if (materialID != -1) mPostUpdateMaterialID[i] = materialID; else mPostUpdateMaterialID[i] = 0xFFFF; } } /* 802F22BC-802F22E0 .text searchUpdateMaterialID__19J3DAnmTextureSRTKeyFP12J3DModelData */ void J3DAnmTextureSRTKey::searchUpdateMaterialID(J3DModelData* modelData) { searchUpdateMaterialID(&modelData->getMaterialTable()); } /* 802F22E0-802F2624 .text getTevColorReg__15J3DAnmTevRegKeyCFUsP11_GXColorS10 */ void J3DAnmTevRegKey::getTevColorReg(u16 idx, GXColorS10* dst) const { { switch (getAnmCRegKeyTable()[idx].mRTable.mMaxFrame) { case 0: dst->r = 0; break; case 1: dst->r = mAnmCRegDataR[getAnmCRegKeyTable()[idx].mRTable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmCRegKeyTable()[idx].mRTable, &mAnmCRegDataR[getAnmCRegKeyTable()[idx].mRTable.mOffset]); if (v < -1024.0f) dst->r = -1024; if (v > 1023.0f) dst->r = 1023; if (-1024.0f <= v && v <= 1023.0f) dst->r = v; break; } } { switch (getAnmCRegKeyTable()[idx].mGTable.mMaxFrame) { case 0: dst->g = 0; break; case 1: dst->g = mAnmCRegDataG[getAnmCRegKeyTable()[idx].mGTable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmCRegKeyTable()[idx].mGTable, &mAnmCRegDataG[getAnmCRegKeyTable()[idx].mGTable.mOffset]); if (v < -1024.0f) dst->g = -1024; if (v > 1023.0f) dst->g = 1023; if (-1024.0f <= v && v <= 1023.0f) dst->g = v; break; } } { switch (getAnmCRegKeyTable()[idx].mBTable.mMaxFrame) { case 0: dst->b = 0; break; case 1: dst->b = mAnmCRegDataB[getAnmCRegKeyTable()[idx].mBTable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmCRegKeyTable()[idx].mBTable, &mAnmCRegDataB[getAnmCRegKeyTable()[idx].mBTable.mOffset]); if (v < -1024.0f) dst->b = -1024; if (v > 1023.0f) dst->b = 1023; if (-1024.0f <= v && v <= 1023.0f) dst->b = v; break; } } { switch (getAnmCRegKeyTable()[idx].mATable.mMaxFrame) { case 0: dst->a = 0; break; case 1: dst->a = mAnmCRegDataA[getAnmCRegKeyTable()[idx].mATable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmCRegKeyTable()[idx].mATable, &mAnmCRegDataA[getAnmCRegKeyTable()[idx].mATable.mOffset]); if (v < -1024.0f) dst->a = -1024; if (v > 1023.0f) dst->a = 1023; if (-1024.0f <= v && v <= 1023.0f) dst->a = v; break; } } } /* 802F2624-802F2968 .text getTevKonstReg__15J3DAnmTevRegKeyCFUsP8_GXColor */ void J3DAnmTevRegKey::getTevKonstReg(u16 idx, GXColor* dst) const { { switch (getAnmKRegKeyTable()[idx].mRTable.mMaxFrame) { case 0: dst->r = 0; break; case 1: dst->r = mAnmKRegDataR[getAnmKRegKeyTable()[idx].mRTable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmKRegKeyTable()[idx].mRTable, &mAnmKRegDataR[getAnmKRegKeyTable()[idx].mRTable.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; } } { switch (getAnmKRegKeyTable()[idx].mGTable.mMaxFrame) { case 0: dst->g = 0; break; case 1: dst->g = mAnmKRegDataG[getAnmKRegKeyTable()[idx].mGTable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmKRegKeyTable()[idx].mGTable, &mAnmKRegDataG[getAnmKRegKeyTable()[idx].mGTable.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; } } { switch (getAnmKRegKeyTable()[idx].mBTable.mMaxFrame) { case 0: dst->b = 0; break; case 1: dst->b = mAnmKRegDataB[getAnmKRegKeyTable()[idx].mBTable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmKRegKeyTable()[idx].mBTable, &mAnmKRegDataB[getAnmKRegKeyTable()[idx].mBTable.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; } } { switch (getAnmKRegKeyTable()[idx].mATable.mMaxFrame) { case 0: dst->a = 0; break; case 1: dst->a = mAnmKRegDataA[getAnmKRegKeyTable()[idx].mATable.mOffset]; break; default: f32 v = J3DGetKeyFrameInterpolation(getFrame(), &getAnmKRegKeyTable()[idx].mATable, &mAnmKRegDataA[getAnmKRegKeyTable()[idx].mATable.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 */ void J3DAnmTevRegKey::searchUpdateMaterialID(J3DMaterialTable* table) { for (u16 i = 0; i < getCRegUpdateMaterialNum(); i++) { s32 materialID = table->getMaterialName()->getIndex(getCRegUpdateMaterialName()->getName(i)); if (materialID != -1) mCRegUpdateMaterialID[i] = materialID; else mCRegUpdateMaterialID[i] = 0xFFFF; } for (u16 i = 0; i < getKRegUpdateMaterialNum(); i++) { s32 materialID = table->getMaterialName()->getIndex(getKRegUpdateMaterialName()->getName(i)); if (materialID != -1) mKRegUpdateMaterialID[i] = materialID; else mKRegUpdateMaterialID[i] = 0xFFFF; } } /* 802F2A64-802F2A88 .text searchUpdateMaterialID__15J3DAnmTevRegKeyFP12J3DModelData */ void J3DAnmTevRegKey::searchUpdateMaterialID(J3DModelData* modelData) { searchUpdateMaterialID(&modelData->getMaterialTable()); }