diff --git a/include/JSystem/J3DGraphAnimator/J3DModel.h b/include/JSystem/J3DGraphAnimator/J3DModel.h index b1e179462..b3571ec31 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModel.h +++ b/include/JSystem/J3DGraphAnimator/J3DModel.h @@ -76,6 +76,7 @@ public: MtxP getAnmMtx(int idx) { return mpNodeMtx[idx]; } void setAnmMtx(int idx, Mtx mtx) { MTXCopy(mtx, mpNodeMtx[idx]); } MtxP getWeightAnmMtx(int idx) { return mpWeightEnvMtx[idx]; } + void setWeightAnmMtx(int idx, Mtx mtx) { MTXCopy(mtx, mpWeightEnvMtx[idx]); } s32 setNoUseDrawMtx(); s32 createSingleDrawMtx(J3DModelData*); @@ -111,29 +112,36 @@ public: Mtx& getBaseTRMtx() { return mBaseTransformMtx; } void setBaseTRMtx(Mtx m) { MTXCopy(m, mBaseTransformMtx); } - u32 getMtxCalcMode() const { return mFlags & 0x03; } - u32* getCurrentViewNoPtr() { return &mCurrentViewNo; } - u8* getScaleFlagArray() const { return mpScaleFlagArr; } - u8 getScaleFlag(u32 idx) const { return mpScaleFlagArr[idx]; } + u32 getMtxCalcMode() { return mFlags & 0x03; } + u8 getScaleFlag(int idx) const { return mpScaleFlagArr[idx]; } void setScaleFlag(int idx, u8 param_1) { mpScaleFlagArr[idx] = param_1; } - u8 getEnvScaleFlag(u32 idx) const { return mpEvlpScaleFlagArr[idx]; } - J3DVertexBuffer* getVertexBuffer() const { return (J3DVertexBuffer*)&mVertexBuffer; } - J3DMatPacket* getMatPacket(u16 idx) const { return &mpMatPacket[idx]; } - J3DShapePacket* getShapePacket(u16 idx) const { return &mpShapePacket[idx]; } - Mtx** getDrawMtxPtrPtr() const { return mpDrawMtxBuf[1]; } - Mtx* getDrawMtxPtr() const { return mpDrawMtxBuf[1][mCurrentViewNo]; } - Mtx& getDrawMtx(u32 idx) const { return getDrawMtxPtr()[idx]; } - Mtx33** getNrmMtxPtrPtr() const { return mpNrmMtxBuf[1]; } - Mtx33* getNrmMtxPtr() const { return mpNrmMtxBuf[1][mCurrentViewNo]; } - Mtx33& getNrmMtx(u32 idx) const { return getNrmMtxPtr()[idx]; } - Mtx33** getBumpMtxPtrPtr(u32 idx) const { return mpBumpMtxArr[1][idx]; } - Mtx33* getBumpMtxPtr(u32 idx) const { return mpBumpMtxArr[1][idx][mCurrentViewNo]; } + u8 getEnvScaleFlag(int idx) const { return mpEvlpScaleFlagArr[idx]; } + J3DVertexBuffer* getVertexBuffer() { return (J3DVertexBuffer*)&mVertexBuffer; } + J3DMatPacket* getMatPacket(u16 idx) { return &mpMatPacket[idx]; } + J3DMatPacket* getMatPacketArray() { return mpMatPacket; } + J3DShapePacket* getShapePacket(u16 idx) { return &mpShapePacket[idx]; } + J3DShapePacket* getShapePacketArray() { return mpShapePacket; } + Mtx* getDrawMtxPtr() { return mpDrawMtxBuf[1][mCurrentViewNo]; } + Mtx& getDrawMtx(int idx) { return getDrawMtxPtr()[idx]; } + Mtx33* getNrmMtxPtr() { return mpNrmMtxBuf[1][mCurrentViewNo]; } + Mtx33& getNrmMtx(int idx) { return getNrmMtxPtr()[idx]; } + Mtx33* getBumpMtxPtr(int idx) { return mpBumpMtxArr[1][idx][mCurrentViewNo]; } void setBaseScale(const Vec& scale) { mBaseScale = scale; } void setUserArea(u32 area) { mUserArea = area; } u32 getUserArea() const { return mUserArea; } - Vec* getBaseScale() { return &mBaseScale; } void setVisibilityManager(J3DVisibilityManager* manager) { mpVisibilityManager = manager; } + // TODO + void getCurrentVtxNrm() {} + void setCurrentVtxNrm(void*) {} + void getCurrentVtxPos() {} + void setCurrentVtxPos(void*) {} + void setModelData(J3DModelData*) {} + void setNrmMtx(int, Mtx) {} + + // Appears in TP debug maps but not TWW debug maps. + Vec* getBaseScale() { return &mBaseScale; } + /* 0x004 */ J3DModelData* mModelData; /* 0x008 */ u32 mFlags; /* 0x00C */ u32 mDiffFlag; diff --git a/include/JSystem/J3DGraphAnimator/J3DModelData.h b/include/JSystem/J3DGraphAnimator/J3DModelData.h index 2281eb99e..6f9d6ab98 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModelData.h +++ b/include/JSystem/J3DGraphAnimator/J3DModelData.h @@ -51,7 +51,7 @@ public: J3DJoint* getJointNodePointer(u16 idx) const { return mJointTree.getJointNodePointer(idx); } J3DJointTree& getJointTree() { return mJointTree; } JUTNameTab* getJointName() const { return mJointTree.getJointName(); } - Mtx& getInvJointMtx(s32 idx) const { return mJointTree.getInvJointMtx(idx); } + Mtx& getInvJointMtx(int idx) { return mJointTree.getInvJointMtx(idx); } J3DTexture* getTexture() const { return mMaterialTable.getTexture(); } JUTNameTab* getTextureName() const { return mMaterialTable.getTextureName(); } void setTexture(J3DTexture* pTexture) { mMaterialTable.setTexture(pTexture); } @@ -59,22 +59,18 @@ public: bool isLocked() { return mMaterialTable.isLocked(); } u16 getDrawFullWgtMtxNum() const { return mJointTree.getDrawFullWgtMtxNum(); } u16 getWEvlpMtxNum() const { return mJointTree.getWEvlpMtxNum(); } - u16* getWEvlpMixMtxIndex() const { return mJointTree.getWEvlpMixIndex(); } - f32* getWEvlpMixWeight() const { return mJointTree.getWEvlpMixWeight(); } + u16* getWEvlpMixMtxIndex() { return mJointTree.getWEvlpMixIndex(); } + f32* getWEvlpMixWeight() { return mJointTree.getWEvlpMixWeight(); } u8 getWEvlpMixMtxNum(u16 idx) const { return mJointTree.getWEvlpMixMtxNum(idx); } u32 getModelDataType() const { return mJointTree.getModelDataType(); } - void* getVtxPosArray() const { return mVertexData.getVtxPosArray(); } - void* getVtxNrmArray() const { return mVertexData.getVtxNrmArray(); } GXColor* getVtxColorArray(u8 idx) const { return mVertexData.getVtxColorArray(idx); } bool checkFlag(u32 flag) const { return (mFlags & flag) ? true : false; } u32 getFlag() const { return mFlags; } - void* getRawData() const { return mpRawData; } u16 checkBumpFlag() const { return mbHasBumpArray; } void setBumpFlag(u32 flag) { mbHasBumpArray = flag; } bool checkBBoardFlag() const { return mbHasBillboard == 1; } void entryTexMtxAnimator(J3DAnmTextureSRTKey* anm) { mMaterialTable.entryTexMtxAnimator(anm); } void entryTevRegAnimator(J3DAnmTevRegKey* anm) { mMaterialTable.entryTevRegAnimator(anm); } - void entryTexNoAnimator(J3DAnmTexPattern* anm) { mMaterialTable.entryTexNoAnimator(anm); } int removeTexNoAnimator(J3DAnmTexPattern* anm) { return mMaterialTable.removeTexNoAnimator(anm); } @@ -88,6 +84,20 @@ public: return mMaterialTable.removeMatColorAnimator(anm); } + // TODO + void entryMatColorAnimator(J3DAnmColor*) {} + void getBasicMtxCalc() {} + void getBinary() {} + void getHierarchy() const {} + void getRootNode() {} + void makeHierarchy(J3DNode*, const J3DModelHierarchy**) {} + void setBasicMtxCalc(J3DMtxCalc*) {} + void setHierarchy(J3DModelHierarchy*) {} + void setMatColorAnimator(J3DAnmColor*, J3DMatColorAnm*) {} + void setModelDataType(u32) {} + void setTexMtxAnimator(J3DAnmTextureSRTKey*, J3DTexMtxAnm*, J3DTexMtxAnm*) {} + void setTexNoAnimator(J3DAnmTexPattern*, J3DTexNoAnm*) {} + private: /* 0x04 */ void* mpRawData; /* 0x08 */ u32 mFlags; diff --git a/src/JSystem/J3DGraphAnimator/J3DModel.cpp b/src/JSystem/J3DGraphAnimator/J3DModel.cpp index 929240912..bba450f43 100644 --- a/src/JSystem/J3DGraphAnimator/J3DModel.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DModel.cpp @@ -22,7 +22,6 @@ J3DModel::J3DModel() { /* 802ED5AC-802ED610 .text __dt__8J3DModelFv */ J3DModel::~J3DModel() { - /* Nonmatching */ } /* 802ED610-802ED6C4 .text initialize__8J3DModelFv */ @@ -320,18 +319,20 @@ s32 J3DModel::createMatPacket(J3DModelData* pModelData, u32 flag) { /* 802EDF60-802EE1D4 .text createBumpMtxArray__8J3DModelFP12J3DModelDataUl */ s32 J3DModel::createBumpMtxArray(J3DModelData* modelData, u32 bufferNum) { - /* Nonmatching */ if (modelData->getModelDataType() == 0) { - u16 bumpMtxNum = 0; + u32 bumpMtxNum = 0; + u16 hasScaleNum = 0; for (s32 matIdx = 0; matIdx < modelData->getMaterialNum(); matIdx++) { J3DMaterial * pMaterial = getModelData()->getMaterialNodePointer(matIdx); - if (pMaterial->getNBTScale()->mbHasScale == 1) + if (pMaterial->getNBTScale()->mbHasScale == 1) { bumpMtxNum += pMaterial->getShape()->countBumpMtxNum(); + hasScaleNum++; + } } - if (bumpMtxNum != 0 && bufferNum != 0) { + if ((u16)bumpMtxNum != 0 && bufferNum != 0) { for (s32 i = 0; i < 2; i++) { - mpBumpMtxArr[i] = new Mtx33**[bumpMtxNum]; + mpBumpMtxArr[i] = new Mtx33**[hasScaleNum]; if (mpBumpMtxArr[i] == NULL) return J3DErrType_OutOfMemory; } @@ -366,8 +367,8 @@ s32 J3DModel::createBumpMtxArray(J3DModelData* modelData, u32 bufferNum) { } } - if (bumpMtxNum != 0) - getModelData()->setBumpFlag(1); + if (hasScaleNum != 0) + mModelData->setBumpFlag(1); } return J3DErrType_Success; @@ -603,23 +604,36 @@ extern void J3DPSMtxArrayConcat(f32(*)[4], f32(*)[4], f32(*)[4], u32); void J3DModel::calcDrawMtx() { switch (getMtxCalcMode()) { case 0: - for (u16 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++) - MTXConcat(j3dSys.getViewMtx(), getAnmMtx(getModelData()->getDrawMtxIndex(i)), getDrawMtxPtr()[i]); - if (getModelData()->getDrawFullWgtMtxNum() > getModelData()->getDrawMtxNum()) - J3DPSMtxArrayConcat(j3dSys.getViewMtx(), (MtxP)mpWeightEnvMtx, (MtxP)getDrawMtxPtr(), getModelData()->getWEvlpMtxNum()); + MtxP viewMtx = j3dSys.getViewMtx(); + for (u16 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++) { + u16 drawMtxIdx = getModelData()->getDrawMtxIndex(i); + MTXConcat(viewMtx, getAnmMtx(drawMtxIdx), getDrawMtxPtr()[i]); + } + if (getModelData()->getDrawMtxNum() > getModelData()->getDrawFullWgtMtxNum()) { + MtxP weightAnmMtx = getWeightAnmMtx(0); + MtxP drawMtx = getDrawMtxPtr()[getModelData()->getDrawFullWgtMtxNum()]; + J3DPSMtxArrayConcat(viewMtx, weightAnmMtx, drawMtx, getModelData()->getWEvlpMtxNum()); + } break; case 1: for (u16 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++) MTXCopy(getAnmMtx(getModelData()->getDrawMtxIndex(i)), getDrawMtxPtr()[i]); - for (u16 i = 0; i < getModelData()->getWEvlpMtxNum(); i++) - MTXCopy(getWeightAnmMtx(i), getDrawMtxPtr()[getModelData()->getDrawFullWgtMtxNum() + i]); + for (u16 i = 0; i < getModelData()->getWEvlpMtxNum(); i++) { + MtxP drawMtx = getDrawMtxPtr()[getModelData()->getDrawFullWgtMtxNum() + i]; + setWeightAnmMtx(i, drawMtx); + } break; case 2: calcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx, mViewBaseMtx); - for (u16 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++) - MTXConcat(mViewBaseMtx, getAnmMtx(getModelData()->getDrawMtxIndex(i)), getDrawMtxPtr()[i]); - if (getModelData()->getDrawFullWgtMtxNum() > getModelData()->getDrawMtxNum()) - J3DPSMtxArrayConcat(mViewBaseMtx, (MtxP)mpWeightEnvMtx, (MtxP)getDrawMtxPtr(), getModelData()->getWEvlpMtxNum()); + for (u16 i = 0; i < getModelData()->getDrawFullWgtMtxNum(); i++) { + MtxP anmMtx = getAnmMtx(getModelData()->getDrawMtxIndex(i)); + MTXConcat(mViewBaseMtx, anmMtx, getDrawMtxPtr()[i]); + } + if (getModelData()->getDrawFullWgtMtxNum() > getModelData()->getDrawMtxNum()) { + MtxP weightAnmMtx = getWeightAnmMtx(0); + MtxP drawMtx = getDrawMtxPtr()[getModelData()->getDrawFullWgtMtxNum()]; + J3DPSMtxArrayConcat(mViewBaseMtx, weightAnmMtx, drawMtx, getModelData()->getWEvlpMtxNum()); + } break; } }