diff --git a/include/JSystem/J3DGraphAnimator/J3DCluster.h b/include/JSystem/J3DGraphAnimator/J3DCluster.h index abdd5e67a..40afc1657 100644 --- a/include/JSystem/J3DGraphAnimator/J3DCluster.h +++ b/include/JSystem/J3DGraphAnimator/J3DCluster.h @@ -26,10 +26,7 @@ public: J3DDeformer* getDeformer() { return mDeformer; } void setDeformer(J3DDeformer* deformer) { mDeformer = deformer; } -private: - friend class J3DClusterLoader; - friend class J3DClusterLoader_v15; - +public: /* 0x00 */ f32 mMaxAngle; /* 0x04 */ f32 mMinAngle; /* 0x08 */ J3DClusterKey* mClusterKey; diff --git a/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h b/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h index afec3a448..b1634bfe6 100644 --- a/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h +++ b/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h @@ -101,7 +101,7 @@ private: /* 0x00 */ J3DDeformData* mDeformData; /* 0x04 */ J3DAnmCluster* mAnmCluster; - /* 0x08 */ f32* field_0x8; + /* 0x08 */ f32* mWeightList; /* 0x0C */ f32* field_0xc; /* 0x10 */ u32 mFlags; }; // Size: 0x14 diff --git a/include/JSystem/J3DGraphBase/J3DVertex.h b/include/JSystem/J3DGraphBase/J3DVertex.h index 6a4646b11..b3184eb30 100644 --- a/include/JSystem/J3DGraphBase/J3DVertex.h +++ b/include/JSystem/J3DGraphBase/J3DVertex.h @@ -34,15 +34,15 @@ public: u32 getNrmNum() const { return mNrmNum; } u32 getVtxNum() const { return mVtxNum; } GXVtxAttrFmtList* getVtxAttrFmtList() { return mVtxAttrFmtList; } - u8 getVtxPosFrac() const { return mVtxPosFrac; } - u8 getVtxNrmFrac() const { return mVtxNrmFrac; } - int getVtxPosType() const { return mVtxPosType; } - int getVtxNrmType() const { return mVtxNrmType; } - void setVtxPosFrac(u8 frac) { mVtxPosFrac = frac; } + GXCompType getVtxPosType() const { return mVtxPosType; } void setVtxPosType(GXCompType type) { mVtxPosType = type; } - void setVtxNrmFrac(u8 frac) { mVtxNrmFrac = frac; } + u8 getVtxPosFrac() const { return mVtxPosFrac; } + void setVtxPosFrac(u8 frac) { mVtxPosFrac = frac; } + GXCompType getVtxNrmType() const { return mVtxNrmType; } void setVtxNrmType(GXCompType type) { mVtxNrmType = type; } + u8 getVtxNrmFrac() const { return mVtxNrmFrac; } + void setVtxNrmFrac(u8 frac) { mVtxNrmFrac = frac; } private: friend class J3DModelLoader; @@ -78,6 +78,8 @@ public: s32 allocTransformedVtxPosArray(); s32 allocTransformedVtxNrmArray(); + J3DVertexData* getVertexData() { return mVtxData; } + void setCurrentVtxPos(void* pVtxPos) { mCurrentVtxPos = pVtxPos; } void* getCurrentVtxPos() { return mCurrentVtxPos; } @@ -94,7 +96,20 @@ public: void* getTransformedVtxPos(int idx) { return mTransformedVtxPosArray[idx]; } void* getTransformedVtxNrm(int idx) { return mTransformedVtxNrmArray[idx]; } - J3DVertexData* getVertexData() { return mVtxData; } + void* getVtxPosArrayPointer(int idx) { return mVtxPosArray[idx]; } + void* getVtxNrmArrayPointer(int idx) { return mVtxNrmArray[idx]; } + + void swapVtxPosArrayPointer() { + void* tmp = mVtxPosArray[0]; + mVtxPosArray[0] = mVtxPosArray[1]; + mVtxPosArray[1] = tmp; + } + + void swapVtxNrmArrayPointer() { + void* tmp = mVtxNrmArray[0]; + mVtxNrmArray[0] = mVtxNrmArray[1]; + mVtxNrmArray[1] = tmp; + } void swapTransformedVtxPos() { void* tmp = mTransformedVtxPosArray[0]; diff --git a/include/JSystem/JAudio/JAISystemInterface.h b/include/JSystem/JAudio/JAISystemInterface.h index 922d72b8b..7f7f82f5d 100644 --- a/include/JSystem/JAudio/JAISystemInterface.h +++ b/include/JSystem/JAudio/JAISystemInterface.h @@ -15,7 +15,7 @@ namespace JASystem { namespace JAInter { class SeqUpdateData; namespace SystemInterface { - s32 checkFileExsistence(char*); + BOOL checkFileExsistence(char*); int checkSeqActiveFlag(JASystem::TTrack*); void trackToSeqp(JAISound*, u8); void setSeqPortargsF32(JAInter::SeqUpdateData*, u32, u8, f32); diff --git a/include/JSystem/JMessage/processor.h b/include/JSystem/JMessage/processor.h index 39d7ab1a5..f6b0202b2 100644 --- a/include/JSystem/JMessage/processor.h +++ b/include/JSystem/JMessage/processor.h @@ -29,12 +29,12 @@ public: inline void clear() { mNum = 0; } inline void push(const char* str) { - mStack[mNum - 1] = str; + mStack[mNum] = str; mNum++; } inline bool IsStorable() const { return mNum < 4; } inline void pop() { mNum--; } - inline const char* top() const { return mStack[mNum - 2]; } + inline const char* top() const { return mStack[mNum - 1]; } inline bool empty() const { return mNum == 0; } /* 0x00 */ const char* mStack[4]; diff --git a/include/d/d_2dnumber.h b/include/d/d_2dnumber.h index 31ffd0c5d..0fea347ee 100644 --- a/include/d/d_2dnumber.h +++ b/include/d/d_2dnumber.h @@ -42,6 +42,11 @@ public: bool init(ResTIMG*, ResTIMG*, ResTIMG*, ResTIMG*); void setRotate(float); void draw(); + +public: + /* 0x04 */ J2DPicture* mPicture[3]; + /* 0x10 */ J2DPicture* mNum[3][2]; + /* 0x28 */ f32 field_0x28[14]; }; class dDlst_2DObject_c : public dDlst_base_c { diff --git a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp index f7e56ccb5..18bfca040 100644 --- a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp @@ -6,6 +6,8 @@ #include "JSystem/J3DGraphAnimator/J3DCluster.h" #include "JSystem/J3DGraphAnimator/J3DModel.h" #include "JSystem/J3DGraphAnimator/J3DSkinDeform.h" +#include "JSystem/J3DGraphAnimator/J3DAnimation.h" +#include "dolphin/os/OSCache.h" /* 802F37C4-802F37E4 .text clear__13J3DDeformDataFv */ void J3DDeformData::clear() { @@ -28,37 +30,64 @@ void J3DDeformData::deform(J3DModel* model) { } /* 802F3838-802F3900 .text deform__13J3DDeformDataFP15J3DVertexBuffer */ -void J3DDeformData::deform(J3DVertexBuffer*) { - /* Nonmatching */ +void J3DDeformData::deform(J3DVertexBuffer* vtx) { + vtx->swapVtxPosArrayPointer(); + vtx->swapVtxNrmArrayPointer(); + + for (u16 i = 0; i < mClusterNum; i++) + mClusterPointer[i].getDeformer()->deform(vtx, i); + + DCStoreRange(vtx->getVtxPosArrayPointer(0), vtx->getVertexData()->getVtxNum() * 12); + DCStoreRange(vtx->getVtxNrmArrayPointer(0), vtx->getVertexData()->getNrmNum() * 12); + vtx->setCurrentVtxPos(vtx->getVtxPosArrayPointer(0)); + vtx->setCurrentVtxNrm(vtx->getVtxNrmArrayPointer(0)); } /* 802F3900-802F3920 .text clear__11J3DDeformerFv */ void J3DDeformer::clear() { mDeformData = NULL; mAnmCluster = NULL; - field_0x8 = NULL; + mWeightList = NULL; field_0xc = NULL; mFlags = 3; } /* 802F3920-802F3A08 .text deform__11J3DDeformerFP15J3DVertexBufferUs */ -void J3DDeformer::deform(J3DVertexBuffer*, u16) { +void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx) { /* Nonmatching */ + u16 keyIdx = 0; + if (mAnmCluster) { + for (u16 i = 0; i < idx; i++) + keyIdx += mDeformData->getClusterPointer(i)->mKeyNum; + + for (u16 i = 0; i < mDeformData->getClusterPointer(idx)->mKeyNum; i++) + mWeightList[i] = mAnmCluster->getWeight(keyIdx++); + + deform(vtx, idx, mWeightList); + } } /* 802F3A08-802F3FA8 .text deform__11J3DDeformerFP15J3DVertexBufferUsPf */ -void J3DDeformer::deform(J3DVertexBuffer*, u16, f32*) { +void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) { /* Nonmatching */ } /* 802F3FA8-802F4064 .text normalize__11J3DDeformerFPf */ -void J3DDeformer::normalize(f32*) { - /* Nonmatching */ +void J3DDeformer::normalize(f32* vec) { + f32 inv = 1.0f / sqrtf(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]); + vec[0] *= inv; + vec[1] *= inv; + vec[2] *= inv; } /* 802F4064-802F40C0 .text normalizeWeight__11J3DDeformerFiPf */ -void J3DDeformer::normalizeWeight(int, f32*) { - /* Nonmatching */ +void J3DDeformer::normalizeWeight(int count, f32* weight) { + f32 sum = 0.0f; + for (u16 i = 0; i < count; i++) + sum += weight[i]; + sum = 1.0f / sum; + for (u16 i = 0; i < count; i++) + weight[i] *= sum; } /* 802F40C0-802F40F0 .text __ct__13J3DSkinDeformFv */ diff --git a/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp b/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp index 24dbd7b62..c42bada96 100644 --- a/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp +++ b/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp @@ -31,7 +31,7 @@ J3DClusterLoader_v15::~J3DClusterLoader_v15() {} void* J3DClusterLoader_v15::load(const void* i_data) { mpDeformData = new J3DDeformData(); mpDeformData->clear(); - + const JUTDataFileHeader* fileHeader = (JUTDataFileHeader*)i_data; const JUTDataBlockHeader* block = &fileHeader->mFirstBlock; for (int i = 0; i < fileHeader->mBlockNum; i++) { @@ -45,7 +45,7 @@ void* J3DClusterLoader_v15::load(const void* i_data) { } block = block->getNext(); } - + return mpDeformData; } @@ -56,7 +56,7 @@ void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) { mpDeformData->mVtxPosNum = block->mVtxPosNum; mpDeformData->mVtxNrmNum = block->mVtxNrmNum; mpDeformData->mClusterVertexNum = block->mClusterVertexNum; - + if (block->mClusterName != NULL) { mpDeformData->mClusterName = new JUTNameTab(JSUConvertOffsetToPtr(block, block->mClusterName)); } else { @@ -67,28 +67,28 @@ void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) { } else { mpDeformData->mClusterKeyName = NULL; } - + mpDeformData->mVtxPos = JSUConvertOffsetToPtr(block, block->mVtxPos); mpDeformData->mVtxNrm = JSUConvertOffsetToPtr(block, block->mVtxNrm); - + mpDeformData->mClusterPointer = new J3DCluster[mpDeformData->getClusterNum()]; J3DCluster* blockCluster = JSUConvertOffsetToPtr(block, block->mClusterPointer); for (int i = 0; i < mpDeformData->getClusterNum(); i++) { mpDeformData->mClusterPointer[i] = blockCluster[i]; } - + mpDeformData->mClusterKeyPointer = new J3DClusterKey[mpDeformData->getClusterKeyNum()]; J3DClusterKey* blockClusterKey = JSUConvertOffsetToPtr(block, block->mClusterKeyPointer); for (int i = 0; i < mpDeformData->getClusterKeyNum(); i++) { mpDeformData->mClusterKeyPointer[i] = blockClusterKey[i]; } - + mpDeformData->mClusterVertex = new J3DClusterVertex[mpDeformData->mClusterVertexNum]; J3DClusterVertex* blockClusterVertex = JSUConvertOffsetToPtr(block, block->mClusterVertex); for (int i = 0; i < mpDeformData->mClusterVertexNum; i++) { mpDeformData->mClusterVertex[i] = blockClusterVertex[i]; } - + for (int i = 0; i < mpDeformData->getClusterNum(); i++) { J3DCluster* cluster = &mpDeformData->mClusterPointer[i]; cluster->mClusterKey = JSUConvertOffsetToPtr(block, cluster->mClusterKey); @@ -103,16 +103,16 @@ void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) { deformer->field_0xc = NULL; } deformer->mFlags = cluster->mFlags; - deformer->field_0x8 = new f32[cluster->mKeyNum]; + deformer->mWeightList = new f32[cluster->mKeyNum]; cluster->setDeformer(deformer); } - + for (int i = 0; i < mpDeformData->getClusterKeyNum(); i++) { J3DClusterKey* clusterKey = &mpDeformData->mClusterKeyPointer[i]; clusterKey->field_0x4 = JSUConvertOffsetToPtr(block, clusterKey->field_0x4); clusterKey->field_0x8 = JSUConvertOffsetToPtr(block, clusterKey->field_0x8); } - + for (int i = 0; i < mpDeformData->mClusterVertexNum; i++) { J3DClusterVertex* clusterVertex = &mpDeformData->mClusterVertex[i]; clusterVertex->field_0x4 = JSUConvertOffsetToPtr(block, clusterVertex->field_0x4); diff --git a/src/JSystem/JAudio/JAISystemInterface.cpp b/src/JSystem/JAudio/JAISystemInterface.cpp index 578df2fc9..8e013ec32 100644 --- a/src/JSystem/JAudio/JAISystemInterface.cpp +++ b/src/JSystem/JAudio/JAISystemInterface.cpp @@ -10,8 +10,11 @@ JASystem::Kernel::TPortCmd JAInter::SystemInterface::systemPortCmd; /* 8029E188-8029E1B4 .text checkFileExsistence__Q27JAInter15SystemInterfaceFPc */ -s32 JAInter::SystemInterface::checkFileExsistence(char* param_1) { - return DVDConvertPathToEntrynum(param_1) != -1; +BOOL JAInter::SystemInterface::checkFileExsistence(char* param_1) { + if (DVDConvertPathToEntrynum(param_1) != -1) + return TRUE; + else + return FALSE; } /* 8029E1B4-8029E2A0 .text checkSeqActiveFlag__Q27JAInter15SystemInterfaceFPQ28JASystem6TTrack */ diff --git a/src/JSystem/JMessage/resource.cpp b/src/JSystem/JMessage/resource.cpp index d5894880e..bc4176aa1 100644 --- a/src/JSystem/JMessage/resource.cpp +++ b/src/JSystem/JMessage/resource.cpp @@ -17,7 +17,7 @@ JMessage::TResourceContainer::TResourceContainer() { /* 8029FD04-8029FD90 .text Get_groupID__Q28JMessage18TResourceContainerFUs */ JMessage::TResource* JMessage::TResourceContainer::Get_groupID(u16 groupID) { /* Nonmatching */ - for (iterator iter = begin(); iter != end(); ++iter) { + for (iterator iter = begin(); iter != end(); iter++) { TResource* res = &(*iter); if (res->mInfo.get_groupID() == groupID) return res;