diff --git a/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h b/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h index f2d665ae0..4d95d6075 100644 --- a/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h +++ b/include/JSystem/J3DGraphAnimator/J3DMaterialAttach.h @@ -45,6 +45,7 @@ public: JUTNameTab* getMaterialName() const { return mMaterialName; } u16 getMaterialNum() const { return mMaterialNum; } + bool isLocked() const { return field_0x20 == 1; } private: friend class J3DJointTree; diff --git a/include/JSystem/J3DGraphAnimator/J3DModel.h b/include/JSystem/J3DGraphAnimator/J3DModel.h index 08c8bd5bc..a9c2b6261 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModel.h +++ b/include/JSystem/J3DGraphAnimator/J3DModel.h @@ -29,13 +29,21 @@ struct J3DUnkCalc2 { typedef void (*J3DCalcCallBack)(J3DModel*, u32 timing); +class J3DAnmVisibilityFull; class J3DMatPacket; class J3DShapePacket; class J3DVisibilityManager { public: + J3DVisibilityManager(J3DAnmVisibilityFull* visibility) { + mAnmVisibility = visibility; + field_0x8 = 1; + } virtual ~J3DVisibilityManager(); virtual void setVisibility(J3DModelData*); + + /* 0x04 */ J3DAnmVisibilityFull* mAnmVisibility; + /* 0x08 */ int field_0x8; }; class J3DUnkCallBack { @@ -77,7 +85,6 @@ public: virtual void entry(); virtual void calc(); virtual void calcMaterial(); - virtual void calcDiffTexMtx(); virtual void viewCalc(); virtual ~J3DModel(); @@ -124,6 +131,7 @@ public: void setUserArea(u32 area) { mUserArea = area; } u32 getUserArea() const { return mUserArea; } Vec* getBaseScale() { return &mBaseScale; } + void setVisibilityManager(J3DVisibilityManager* manager) { mpVisibilityManager = manager; } /* 0x004 */ J3DModelData* mModelData; /* 0x008 */ u32 mFlags; diff --git a/include/JSystem/J3DGraphAnimator/J3DModelData.h b/include/JSystem/J3DGraphAnimator/J3DModelData.h index 658bcad32..755634155 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModelData.h +++ b/include/JSystem/J3DGraphAnimator/J3DModelData.h @@ -55,6 +55,7 @@ public: JUTNameTab* getTextureName() const { return mMaterialTable.getTextureName(); } void setTexture(J3DTexture* pTexture) { mMaterialTable.setTexture(pTexture); } void setTextureName(JUTNameTab* pTextureName) { mMaterialTable.setTextureName(pTextureName); } + bool isLocked() { return mMaterialTable.isLocked(); } u16 getDrawFullWgtMtxNum() const { return mJointTree.getDrawFullWgtMtxNum(); } u16 getWEvlpMtxNum() const { return mJointTree.getWEvlpMtxNum(); } u16* getWEvlpMixMtxIndex() const { return mJointTree.getWEvlpMixIndex(); } @@ -93,7 +94,7 @@ private: /* 0x0E */ u16 mbHasBillboard; /* 0x10 */ J3DJointTree mJointTree; /* 0x58 */ J3DMaterialTable mMaterialTable; - /* 0x78 */ J3DShapeTable mShapeTable; + /* 0x7C */ J3DShapeTable mShapeTable; /* 0x84 */ J3DVertexData mVertexData; /* 0xE0 */ JUTNameTab * mName; }; // Size: 0xE4 diff --git a/include/JSystem/J3DGraphBase/J3DMatBlock.h b/include/JSystem/J3DGraphBase/J3DMatBlock.h index 06a4fbac7..3c5b35b34 100644 --- a/include/JSystem/J3DGraphBase/J3DMatBlock.h +++ b/include/JSystem/J3DGraphBase/J3DMatBlock.h @@ -9,6 +9,7 @@ struct J3DGXColorS10 { J3DGXColorS10() {} + J3DGXColorS10(J3DGXColorS10& other) { mColor = other.mColor; } J3DGXColorS10& operator=(const J3DGXColorS10& other) { mColor = other.mColor; return *this; @@ -23,6 +24,7 @@ struct J3DGXColorS10 { struct J3DGXColor { J3DGXColor() {} + J3DGXColor(J3DGXColor& other) { mColor = other.mColor; } J3DGXColor& operator=(const J3DGXColor& other) { mColor = other.mColor; return *this; @@ -47,10 +49,10 @@ public: virtual s32 countDLSize(); virtual u32 getType() = 0; virtual void setTexGenNum(u32 const*); - virtual void setTexGenNum(u32); - virtual u32 getTexGenNum() const; - virtual void setTexCoord(u32, J3DTexCoord const*); - virtual J3DTexCoord* getTexCoord(u32); + virtual void setTexGenNum(u32) {} + virtual u32 getTexGenNum() const { return 0; } + virtual void setTexCoord(u32, J3DTexCoord const*) {} + virtual J3DTexCoord* getTexCoord(u32) { return NULL; } virtual void setTexMtx(u32, J3DTexMtx*); virtual J3DTexMtx* getTexMtx(u32) { return NULL; } virtual void setNBTScale(J3DNBTScale const*); @@ -144,46 +146,46 @@ public: virtual void diffTexCoordScale() {} virtual void diffTevStage() {} virtual void diffTevStageIndirect() {} - virtual void patch(); + virtual void patch() {} virtual void patchTexNo() {} virtual void patchTevReg() {} - virtual void patchTexNoAndTexCoordScale() = 0; + virtual void patchTexNoAndTexCoordScale() {} virtual void ptrToIndex() = 0; virtual void indexToPtr() = 0; virtual u32 getType() = 0; virtual s32 countDLSize(); virtual void setTexNo(u32, u16 const*) {} - virtual void setTexNo(u32, u16); - virtual u16 getTexNo(u32) const; + virtual void setTexNo(u32, u16) {} + virtual u16 getTexNo(u32) const { return -1; } virtual void setTevOrder(u32, J3DTevOrder const*) {} - virtual void setTevOrder(u32, J3DTevOrder); - virtual J3DTevOrder* getTevOrder(u32); + virtual void setTevOrder(u32, J3DTevOrder) {} + virtual J3DTevOrder* getTevOrder(u32) { return NULL; } virtual void setTevColor(u32, J3DGXColorS10 const*); - virtual void setTevColor(u32, J3DGXColorS10); - virtual J3DGXColorS10* getTevColor(u32); + virtual void setTevColor(u32, J3DGXColorS10) {} + virtual J3DGXColorS10* getTevColor(u32) { return NULL; } virtual void setTevKColor(u32, J3DGXColor const*); - virtual void setTevKColor(u32, J3DGXColor); - virtual J3DGXColor* getTevKColor(u32); + virtual void setTevKColor(u32, J3DGXColor) {} + virtual J3DGXColor* getTevKColor(u32) { return NULL; } virtual void setTevKColorSel(u32 i, const u8* pNum) {} - virtual void setTevKColorSel(u32, u8); - virtual u8 getTevKColorSel(u32); + virtual void setTevKColorSel(u32, u8) {} + virtual u8 getTevKColorSel(u32) { return 0; } virtual void setTevKAlphaSel(u32 i, const u8* pNum) {} - virtual void setTevKAlphaSel(u32, u8); - virtual u8 getTevKAlphaSel(u32); + virtual void setTevKAlphaSel(u32, u8) {} + virtual u8 getTevKAlphaSel(u32) { return 0; } virtual void setTevStageNum(u8 const*) {} - virtual void setTevStageNum(u8); - virtual u8 getTevStageNum() const; + virtual void setTevStageNum(u8) {} + virtual u8 getTevStageNum() const { return 1; } virtual void setTevStage(u32, J3DTevStage const*) {} - virtual void setTevStage(u32, J3DTevStage); - virtual J3DTevStage* getTevStage(u32); + virtual void setTevStage(u32, J3DTevStage) {} + virtual J3DTevStage* getTevStage(u32) { return NULL; } virtual void setTevSwapModeInfo(u32 i, const J3DTevSwapModeInfo* pInfo) {} virtual void setTevSwapModeInfo(u32 i, J3DTevSwapModeInfo info) {} virtual void setTevSwapModeTable(u32 i, const J3DTevSwapModeTable* pTable) {} - virtual void setTevSwapModeTable(u32, J3DTevSwapModeTable); - virtual J3DTevSwapModeTable* getTevSwapModeTable(u32); + virtual void setTevSwapModeTable(u32, J3DTevSwapModeTable) {} + virtual J3DTevSwapModeTable* getTevSwapModeTable(u32) { return NULL; } virtual void setIndTevStage(u32, J3DIndTevStage const*) {} - virtual void setIndTevStage(u32, J3DIndTevStage); - virtual J3DIndTevStage* getIndTevStage(u32); + virtual void setIndTevStage(u32, J3DIndTevStage) {} + virtual J3DIndTevStage* getIndTevStage(u32) { return NULL; } virtual u32 getTexNoOffset() const { return 0; } virtual u32 getTevRegOffset() const { return 0; } virtual void setTexNoOffset(u32 offs) { mTexNoOffset = offs; } @@ -631,26 +633,26 @@ class J3DPEBlock { public: virtual void reset(J3DPEBlock*); virtual void load(); - virtual void patch(); + virtual void patch() {} virtual void diff(u32); virtual void diffFog(); virtual void diffBlend(); virtual s32 countDLSize(); virtual u32 getType(); virtual void setFog(J3DFog*); - virtual J3DFog* getFog(); + virtual J3DFog* getFog() { return NULL; } virtual void setAlphaComp(J3DAlphaComp const*); virtual void setAlphaComp(J3DAlphaComp); - virtual J3DAlphaComp* getAlphaComp(); + virtual J3DAlphaComp* getAlphaComp() { return NULL; } virtual void setBlend(J3DBlend const*); virtual void setBlend(J3DBlend); - virtual J3DBlend* getBlend(); + virtual J3DBlend* getBlend() { return NULL; } virtual void setZMode(J3DZMode const*); virtual void setZMode(J3DZMode); - virtual J3DZMode* getZMode(); + virtual J3DZMode* getZMode() { return NULL; } virtual void setZCompLoc(u8 const*); virtual void setZCompLoc(u8); - virtual u8 getZCompLoc() const; + virtual u8 getZCompLoc() const { return 0; } virtual void setDither(u8 const*); virtual void setDither(u8); virtual u8 getDither() const; @@ -767,7 +769,7 @@ private: }; // Size: 0x10 struct J3DIndTexCoordScale : public J3DIndTexCoordScaleInfo { - J3DIndTexCoordScale(); + J3DIndTexCoordScale() { *(J3DIndTexCoordScaleInfo*)this = j3dDefaultIndTexCoordScaleInfo; } ~J3DIndTexCoordScale() {} u8 getScaleS() { return mScaleS; } @@ -775,7 +777,7 @@ struct J3DIndTexCoordScale : public J3DIndTexCoordScaleInfo { }; struct J3DIndTexMtx : public J3DIndTexMtxInfo { - J3DIndTexMtx(); + J3DIndTexMtx() {*(J3DIndTexMtxInfo*)this = j3dDefaultIndTexMtxInfo; } ~J3DIndTexMtx() {} void load(u32 param_1) { @@ -784,7 +786,7 @@ struct J3DIndTexMtx : public J3DIndTexMtxInfo { }; // Size: 0x1C struct J3DIndTexOrder : public J3DIndTexOrderInfo { - J3DIndTexOrder(); + J3DIndTexOrder() { *(J3DIndTexOrderInfo*) this = j3dDefaultIndTexOrderNull; } u8 getCoord() const { return mCoord; } u8 getMap() const { return mMap; } @@ -797,17 +799,17 @@ public: virtual void load() = 0; virtual s32 countDLSize(); virtual u32 getType() = 0; - virtual void setIndTexStageNum(u8); - virtual u8 getIndTexStageNum() const; + virtual void setIndTexStageNum(u8) {} + virtual u8 getIndTexStageNum() const { return 0; } virtual void setIndTexOrder(u32, J3DIndTexOrder); virtual void setIndTexOrder(u32, J3DIndTexOrder const*); - virtual J3DIndTexOrder* getIndTexOrder(u32); + virtual J3DIndTexOrder* getIndTexOrder(u32) { return NULL; } virtual void setIndTexMtx(u32, J3DIndTexMtx const*); virtual void setIndTexMtx(u32, J3DIndTexMtx) {} - virtual J3DIndTexMtx* getIndTexMtx(u32); - virtual void setIndTexCoordScale(u32, J3DIndTexCoordScale) {} + virtual J3DIndTexMtx* getIndTexMtx(u32) { return NULL; } virtual void setIndTexCoordScale(u32, J3DIndTexCoordScale const*); - virtual J3DIndTexCoordScale* getIndTexCoordScale(u32); + virtual void setIndTexCoordScale(u32, J3DIndTexCoordScale) {} + virtual J3DIndTexCoordScale* getIndTexCoordScale(u32) { return NULL; } virtual ~J3DIndBlock() {} }; @@ -850,6 +852,25 @@ public: virtual ~J3DIndBlockNull(); }; +inline u16 calcColorChanID(u16 param_0, u8 param_1, u8 param_2, u8 param_3, u8 param_4, u8 param_5) { + u32 r31 = 0; + r31 = r31 & ~0x0002 | param_0 << 1; + r31 = r31 & ~0x0001 | param_1; + r31 = r31 & ~0x0040 | param_5 << 6; + r31 = r31 & ~0x0004 | bool(param_2 & 0x01) << 2; + r31 = r31 & ~0x0008 | bool(param_2 & 0x02) << 3; + r31 = r31 & ~0x0010 | bool(param_2 & 0x04) << 4; + r31 = r31 & ~0x0020 | bool(param_2 & 0x08) << 5; + r31 = r31 & ~0x0800 | bool(param_2 & 0x10) << 11; + r31 = r31 & ~0x1000 | bool(param_2 & 0x20) << 12; + r31 = r31 & ~0x2000 | bool(param_2 & 0x40) << 13; + r31 = r31 & ~0x4000 | bool(param_2 & 0x80) << 14; + r31 = r31 & ~0x0180 | (param_4 == 0 ? 0 : param_3) << 7; + r31 = r31 & ~0x0200 | (param_4 != 2) << 9; + r31 = r31 & ~0x0400 | (param_4 != 0) << 10; + return r31; +} + inline u32 setChanCtrlMacro(u8 enable, GXColorSrc ambSrc, GXColorSrc matSrc, u32 lightMask, GXDiffuseFn diffuseFn, GXAttnFn attnFn) { return matSrc | @@ -863,7 +884,7 @@ inline u32 setChanCtrlMacro(u8 enable, GXColorSrc ambSrc, GXColorSrc matSrc, u32 } struct J3DColorChan { - J3DColorChan(); + J3DColorChan() { setColorChanInfo(j3dDefaultColorChanInfo); } GXAttnFn getAttnFn(); GXDiffuseFn getDiffuseFn() { return GXDiffuseFn(mChanCtrl >> 7 & 3); } u8 getLightMask() { return ((mChanCtrl >> 2 & 0x0f) | (mChanCtrl >> 11 & 0x0f) << 4); } @@ -874,6 +895,10 @@ struct J3DColorChan { GXColorSrc getMatSrc() { return GXColorSrc(mChanCtrl >> 0 & 0x01); } GXColorSrc getAmbSrc() { return GXColorSrc(mChanCtrl >> 6 & 0x01); } u8 getEnable() { return !!(mChanCtrl & 0x02); } + void setColorChanInfo(const J3DColorChanInfo& info) { + u8 r30 = info.field_0x5 == 0xFFFF ? 0 : info.field_0x5; + mChanCtrl = calcColorChanID(info.field_0x0, info.field_0x1, info.field_0x2, info.field_0x3, info.field_0x4, r30); + } void load() { J3DGDWrite_u32(setChanCtrlMacro(getEnable(), getAmbSrc(), getMatSrc(), getLightMask(), getDiffuseFn(), getAttnFn())); } @@ -887,24 +912,24 @@ public: virtual void reset(J3DColorBlock*); virtual void patch(); virtual void patchMatColor(); - virtual void patchLight(); + virtual void patchLight() {} virtual void diff(u32); virtual void diffMatColor(); virtual void diffLight(); virtual s32 countDLSize(); virtual u32 getType() = 0; virtual void setMatColor(u32, J3DGXColor const*); - virtual void setMatColor(u32, J3DGXColor); - virtual J3DGXColor* getMatColor(u32); + virtual void setMatColor(u32, J3DGXColor) {} + virtual J3DGXColor* getMatColor(u32) { return NULL; } virtual void setAmbColor(u32, J3DGXColor const*); - virtual void setAmbColor(u32, J3DGXColor); - virtual J3DGXColor* getAmbColor(u32); - virtual void setColorChanNum(u8); + virtual void setAmbColor(u32, J3DGXColor) {} + virtual J3DGXColor* getAmbColor(u32) { return NULL; } + virtual void setColorChanNum(u8) {} virtual void setColorChanNum(u8 const*); - virtual u8 getColorChanNum() const; - virtual void setColorChan(u32, J3DColorChan const&); + virtual u8 getColorChanNum() const { return 0; } + virtual void setColorChan(u32, J3DColorChan const&) {} virtual void setColorChan(u32, J3DColorChan const*); - virtual J3DColorChan* getColorChan(u32); + virtual J3DColorChan* getColorChan(u32) { return NULL; } virtual void setLight(u32, J3DLightObj*); virtual J3DLightObj* getLight(u32); virtual void setCullMode(u8 const*); diff --git a/include/JSystem/J3DGraphBase/J3DMaterial.h b/include/JSystem/J3DGraphBase/J3DMaterial.h index d7d6833a6..7bc64fce2 100644 --- a/include/JSystem/J3DGraphBase/J3DMaterial.h +++ b/include/JSystem/J3DGraphBase/J3DMaterial.h @@ -43,6 +43,8 @@ public: J3DMaterial* getNext() const { return mNext; } J3DShape* getShape() const { return mShape; } + u32 getMaterialMode() { return mMaterialMode; } + void setMaterialMode(u32 mode) { mMaterialMode = mode; } J3DTevBlock* getTevBlock() const { return mTevBlock; } J3DColorBlock* getColorBlock() const { return mColorBlock; } J3DTexGenBlock* getTexGenBlock() const { return mTexGenBlock; } diff --git a/include/JSystem/J3DGraphBase/J3DStruct.h b/include/JSystem/J3DGraphBase/J3DStruct.h index d2f9dbc27..9232eccc2 100644 --- a/include/JSystem/J3DGraphBase/J3DStruct.h +++ b/include/JSystem/J3DGraphBase/J3DStruct.h @@ -76,6 +76,20 @@ struct J3DIndTexMtxInfo { }; // Size: 0x1C struct J3DFogInfo { + void operator=(const J3DFogInfo& other) { + mType = other.mType; + mAdjEnable = other.mAdjEnable; + mCenter = other.mCenter; + mStartZ = other.mStartZ; + mEndZ = other.mEndZ; + mNearZ = other.mNearZ; + mFarZ = other.mFarZ; + mColor = other.mColor; + for (int i = 0; i < 10; i++) { + mFogAdjTable[i] = other.mFogAdjTable[i]; + } + } + /* 0x00 */ u8 mType; /* 0x01 */ u8 mAdjEnable; /* 0x02 */ u16 mCenter; diff --git a/include/JSystem/J3DGraphBase/J3DTevs.h b/include/JSystem/J3DGraphBase/J3DTevs.h index fe3be9cd3..bb4f71313 100644 --- a/include/JSystem/J3DGraphBase/J3DTevs.h +++ b/include/JSystem/J3DGraphBase/J3DTevs.h @@ -27,7 +27,7 @@ extern const J3DTevSwapModeInfo j3dDefaultTevSwapMode; extern const J3DTevSwapModeTableInfo j3dDefaultTevSwapModeTable; extern const J3DBlendInfo j3dDefaultBlendInfo; extern const J3DColorChanInfo j3dDefaultColorChanInfo; -extern const u16 j3dDefaultTevSwapTableID; +extern const u8 j3dDefaultTevSwapTableID; extern const u16 j3dDefaultAlphaCmpID; extern const u16 j3dDefaultZModeID; @@ -75,7 +75,32 @@ struct J3DTevStage { }; struct J3DIndTevStage { - J3DIndTevStage(); + J3DIndTevStage() { + mInfo = 0; + setIndTevStageInfo(j3dDefaultIndTevStageInfo); + } + + void setIndStage(u8 stage) { mInfo = mInfo & ~0x03 | stage; } + void setIndFormat(u8 format) { mInfo = mInfo & ~0x0C | format << 2; } + void setBiasSel(u8 sel) { mInfo = mInfo & ~0x70 | sel << 4; } + void setAlphaSel(u8 sel) { mInfo = mInfo & ~0x0180 | sel << 7; } + void setMtxSel(u8 sel) { mInfo = mInfo & ~0x1E00 | sel << 9; } + void setWrapS(u8 wrap) { mInfo = mInfo & ~0xE000 | wrap << 13; } + void setWrapT(u8 wrap) { mInfo = mInfo & ~0x070000 | wrap << 16; } + void setLod(u8 lod) { mInfo = mInfo & ~0x080000 | lod << 19; } + void setPrev(u8 prev) { mInfo = mInfo & ~0x100000 | prev << 20; } + + void setIndTevStageInfo(const J3DIndTevStageInfo& info) { + setIndStage(info.mIndStage); + setIndFormat(info.mIndFormat); + setBiasSel(info.mBiasSel); + setMtxSel(info.mMtxSel); + setWrapS(info.mWrapS); + setWrapT(info.mWrapT); + setPrev(info.mPrev); + setLod(info.mLod); + setAlphaSel(info.mAlphaSel); + } void load(u32 param_1) { J3DGDWriteBPCmd(mInfo | (param_1 + 16) << 24); @@ -85,14 +110,14 @@ struct J3DIndTevStage { }; struct J3DTevOrder : public J3DTevOrderInfo { - J3DTevOrder(); + J3DTevOrder() { *(J3DTevOrderInfo*)this = j3dDefaultTevOrderInfoNull; } J3DTevOrderInfo& getTevOrderInfo() { return *this; } u8 getTexMap() { return mTexMap; } }; struct J3DTevSwapModeTable { - J3DTevSwapModeTable(); + J3DTevSwapModeTable() { field_0x0 = j3dDefaultTevSwapTableID; } u8 getR() { return j3dTevSwapTableTable[field_0x0 * 4]; } u8 getG() { return j3dTevSwapTableTable[field_0x0 * 4 + 1]; } diff --git a/include/JSystem/J3DGraphBase/J3DTexture.h b/include/JSystem/J3DGraphBase/J3DTexture.h index 2a5e77088..42b9a8535 100644 --- a/include/JSystem/J3DGraphBase/J3DTexture.h +++ b/include/JSystem/J3DGraphBase/J3DTexture.h @@ -54,7 +54,7 @@ public: J3DTexMtx(const J3DTexMtxInfo& info) { mTexMtxInfo = info; } - ~J3DTexMtx(); + ~J3DTexMtx() {} void load(u32 i) const { GDOverflowCheck(53); J3DGDLoadTexMtxImm((Mtx&)mMtx, i * 3 + 30, (GXTexMtxType)mTexMtxInfo.mProjection); @@ -78,7 +78,7 @@ private: }; // Size: 0xc4 struct J3DTexCoord : public J3DTexCoordInfo { - J3DTexCoord(); + J3DTexCoord() { *(J3DTexCoordInfo*)this = j3dDefaultTexCoordInfo[0]; } u8 getTexGenType() { return mTexGenType; } u8 getTexGenSrc() { return mTexGenSrc; } diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 08884aa10..60febcf37 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -126,7 +126,7 @@ public: private: /* 0x08 */ J3DAnmTransform* mAnm; - /* 0x0C */ J3DMtxCalc* mpMtxCalc; + /* 0x0C */ J3DMtxCalcMayaAnm* mpMtxCalc; }; // Size: 0x10 STATIC_ASSERT(sizeof(mDoExt_bckAnm) == 0x10); @@ -190,7 +190,8 @@ public: int init(J3DModelData*, J3DAnmTransform*, int, int, float, short, short, bool); private: - // TODO + /* 0x08 */ J3DAnmVisibilityFull* mpAnm; + /* 0x0C */ J3DVisibilityManager* field_0xc; }; class mDoExt_AnmRatioPack { @@ -358,36 +359,76 @@ public: void restore(J3DMaterial*); private: - // TODO + /* 0x000 */ J3DGXColor mMatColor[2]; + /* 0x008 */ u8 mColorChanNum; + /* 0x00A */ J3DColorChan mColorChan[4]; + /* 0x012 */ J3DGXColor mAmbColor[2]; + /* 0x01C */ u32 mTexGenNum; + /* 0x020 */ J3DTexCoord mTexCoord[8]; + /* 0x040 */ J3DTexMtx mTexMtx[8]; + /* 0x660 */ u8 mTevStageNum; + /* 0x662 */ u16 mTexNo[8]; + /* 0x672 */ J3DGXColorS10 mTevColor[4]; + /* 0x692 */ J3DGXColor mTevKColor[4]; + /* 0x6A2 */ J3DTevStage mTevStage[8]; + /* 0x6E4 */ J3DIndTevStage mIndTevStage[8]; + /* 0x704 */ J3DTevOrder mTevOrder[4]; + /* 0x714 */ u8 mTevKColorSel[4]; + /* 0x718 */ u8 mTevKAlphaSel[4]; + /* 0x71C */ J3DTevSwapModeTable mTevSwapModeTable[4]; + /* 0x720 */ u8 mIndTexStageNum; + /* 0x721 */ J3DIndTexOrder mIndTexOrder[4]; + /* 0x734 */ J3DIndTexMtx mIndTexMtx[3]; + /* 0x788 */ J3DIndTexCoordScale mIndTexCoordScale[4]; + /* 0x798 */ J3DFog mFog; + /* 0x7C4 */ J3DAlphaComp mAlphaComp; + /* 0x7C8 */ J3DBlend mBlend; + /* 0x7CC */ J3DZMode mZMode; + /* 0x7CE */ u8 mZCompLoc; + /* 0x7D0 */ J3DMaterialAnm* mMaterialAnm; + /* 0x7D4 */ u32 mMaterialMode; }; class mDoExt_backupMaterial_c { public: - void create(J3DModelData*); - void create(u16); + bool create(J3DModelData*); + bool create(u16); void restore(J3DModelData*); private: - // TODO + /* 0x00 */ mDoExt_backupMatBlock_c* mBackupMatBlock; + /* 0x04 */ J3DTexture* mTexture; + /* 0x08 */ JUTNameTab* mTextureName; +}; + +class mDoExt_invJntPacket : public J3DPacket { +public: + mDoExt_invJntPacket() {} + ~mDoExt_invJntPacket() {} + + void draw(); + + void setJoint(J3DModel* i_model, u16 param_1) { + mModel = i_model; + field_0x14 = param_1; + } + + J3DModel* mModel; + u16 field_0x14; }; class mDoExt_invisibleModel { public: - void create(J3DModel*); + bool create(J3DModel*); void entry(); void entryMaskOff(); void updateDL(J3DModel*); void updateDL(mDoExt_McaMorf*); -}; -class mDoExt_invJntPacket : public J3DPacket { -public: - mDoExt_invJntPacket(); - ~mDoExt_invJntPacket(); - - void draw(); + J3DModel* mModel; + mDoExt_invJntPacket* mpPackets; }; class mDoExt_offCupOnAupPacket : public J3DPacket { @@ -449,10 +490,10 @@ JKRExpHeap* mDoExt_createArchiveHeap(u32 heapSize, JKRHeap* i_heap); JKRExpHeap* mDoExt_createZeldaHeap(u32 heapSize, JKRHeap* i_heap); JKRExpHeap* mDoExt_createGameHeap(u32 heapSize, JKRHeap* i_heap); -int mDoExt_getSafeArchiveHeapSize(); -int mDoExt_getSafeGameHeapSize(); -int mDoExt_getSafeZeldaHeapSize(); -int mDoExt_getSafeCommandHeapSize(); +s32 mDoExt_getSafeArchiveHeapSize(); +s32 mDoExt_getSafeGameHeapSize(); +s32 mDoExt_getSafeZeldaHeapSize(); +s32 mDoExt_getSafeCommandHeapSize(); s32 mDoExt_resIDToIndex(JKRArchive*, u16); @@ -461,6 +502,7 @@ JKRSolidHeap * mDoExt_createSolidHeapToCurrent(u32, JKRHeap *, u32 align); void mDoExt_restoreCurrentHeap(); u32 mDoExt_adjustSolidHeap(JKRSolidHeap * pHeap); void mDoExt_destroySolidHeap(JKRSolidHeap * pHeap); +JKRHeap* mDoExt_setCurrentHeap(JKRHeap*); extern JKRExpHeap* zeldaHeap; extern JKRExpHeap* gameHeap; diff --git a/include/m_Do/m_Do_main.h b/include/m_Do/m_Do_main.h index 9caea01ed..cc448af22 100644 --- a/include/m_Do/m_Do_main.h +++ b/include/m_Do/m_Do_main.h @@ -9,6 +9,8 @@ class JKRExpHeap; void version_check(); s32 LOAD_COPYDATE(void*); +extern OSThread mainThread; + #define HeapCheckTableNum 6 class HeapCheck { diff --git a/src/JSystem/J3DGraphBase/J3DTevs.cpp b/src/JSystem/J3DGraphBase/J3DTevs.cpp index dc5caf6ec..a73a2796a 100644 --- a/src/JSystem/J3DGraphBase/J3DTevs.cpp +++ b/src/JSystem/J3DGraphBase/J3DTevs.cpp @@ -308,6 +308,6 @@ const J3DTevSwapModeInfo j3dDefaultTevSwapMode = {}; const J3DTevSwapModeTableInfo j3dDefaultTevSwapModeTable = {0, 1, 2, 3}; const J3DBlendInfo j3dDefaultBlendInfo = {GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_NOOP}; const J3DColorChanInfo j3dDefaultColorChanInfo = {0, 0, 0, 2, 2, 0, 0xFF, 0xFF}; -const u16 j3dDefaultTevSwapTableID = 0x1B00; +const u8 j3dDefaultTevSwapTableID = 0x1B; const u16 j3dDefaultAlphaCmpID = 0xE7; const u16 j3dDefaultZModeID = 0x17; diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index d323c16b5..3851df113 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -5,9 +5,11 @@ #include "m_Do/m_Do_ext.h" #include "JSystem/J3DGraphBase/J3DTransform.h" -#include "JSystem/JKernel/JKRHeap.h" +#include "JSystem/JKernel/JKRArchive.h" +#include "JSystem/JKernel/JKRSolidHeap.h" #include "JSystem/JUtility/JUTAssert.h" #include "SSystem/SComponent/c_m3d.h" +#include "d/d_s_play.h" #include "m_Do/m_Do_printf.h" /* 8000DA70-8000DCF0 .text mDoExt_setJ3DData__FPA4_fPC16J3DTransformInfoUs */ @@ -340,193 +342,362 @@ int mDoExt_brkAnm::init(J3DMaterialTable* i_matTable, J3DAnmTevRegKey* i_brk, in } } return 1; - - /* Nonmatching */ } /* 8000EF80-8000EFBC .text entry__13mDoExt_brkAnmFP16J3DMaterialTablef */ -void mDoExt_brkAnm::entry(J3DMaterialTable*, f32) { - /* Nonmatching */ +void mDoExt_brkAnm::entry(J3DMaterialTable* i_matTable, f32 i_frame) { + mpAnm->setFrame(i_frame); + i_matTable->setTevRegAnimator(mpAnm, mpCRegAnm, mpKRegAnm); } /* 8000EFBC-8000F178 .text init__13mDoExt_bvaAnmFP8J3DModelP20J3DAnmVisibilityFulliifssbi */ -int mDoExt_bvaAnm::init(J3DModel*, J3DAnmVisibilityFull*, int, int, f32, s16, s16, bool, int) { - /* Nonmatching */ +int mDoExt_bvaAnm::init(J3DModel* i_model, J3DAnmVisibilityFull* i_bva, int i_anmPlay, int i_attribute, f32 i_rate, s16 i_startF, s16 i_endF, bool i_modify, int i_entry) { + JUT_ASSERT(1002, i_modify || isCurrentSolidHeap()); + JUT_ASSERT(1004, i_model != 0 && i_bva != 0); + mpAnm = i_bva; + if (!i_modify) { + field_0xc = new J3DVisibilityManager(mpAnm); + if (!field_0xc) { + return 0; + } + if (i_entry) { + i_model->setVisibilityManager(field_0xc); + } + } else { + field_0xc->mAnmVisibility = mpAnm; + } + if (i_anmPlay) { + if (initPlay(mpAnm->getFrameMax(), i_attribute, i_rate, i_startF, i_endF, i_modify) == 0) { + return 0; + } + } + return 1; } /* 8000F178-8000F1B4 .text entry__13mDoExt_bvaAnmFP8J3DModels */ -void mDoExt_bvaAnm::entry(J3DModel*, s16) { - /* Nonmatching */ +void mDoExt_bvaAnm::entry(J3DModel* i_model, s16 i_frame) { + mpAnm->setFrame(i_frame); + i_model->setVisibilityManager(field_0xc); } /* 8000F1B4-8000F408 .text init__13mDoExt_bckAnmFP12J3DModelDataP15J3DAnmTransformiifssb */ -int mDoExt_bckAnm::init(J3DModelData*, J3DAnmTransform*, int, int, f32, s16, s16, bool) { +int mDoExt_bckAnm::init(J3DModelData* i_modelData, J3DAnmTransform* i_bck, int i_anmPlay, int i_attribute, f32 i_rate, s16 i_startF, s16 i_endF, bool i_modify) { /* Nonmatching */ + JUT_ASSERT(1065, i_modify || isCurrentSolidHeap()); + JUT_ASSERT(1067, i_bck != 0); + mAnm = i_bck; + if (!i_modify) { + mpMtxCalc = new J3DMtxCalcMayaAnm(mAnm); + if (!mpMtxCalc) { + return 0; + } + } else { + mpMtxCalc->mOne[0] = (u32)mAnm; + } + if (i_anmPlay) { + if (initPlay(mAnm->getFrameMax(), i_attribute, i_rate, i_startF, i_endF, i_modify) == 0) { + return 0; + } + } + return 1; } /* 8000F590-8000F610 .text changeBckOnly__13mDoExt_bckAnmFP15J3DAnmTransform */ -void mDoExt_bckAnm::changeBckOnly(J3DAnmTransform*) { +void mDoExt_bckAnm::changeBckOnly(J3DAnmTransform* i_bck) { + /* Nonmatching */ + mAnm = i_bck; + JUT_ASSERT(1104, mAnm != 0); + mpMtxCalc->mOne[0] = (u32)mAnm; /* Nonmatching */ } /* 8000F610-8000F638 .text entry__13mDoExt_bckAnmFP12J3DModelDataf */ -void mDoExt_bckAnm::entry(J3DModelData*, f32) { - /* Nonmatching */ +void mDoExt_bckAnm::entry(J3DModelData* i_modelData, f32 i_frame) { + mAnm->setFrame(i_frame); + i_modelData->getJointNodePointer(0)->setMtxCalc(mpMtxCalc); } /* 8000F638-8000F6A0 .text mDoExt_changeMaterial__FP8J3DModel */ -void mDoExt_changeMaterial(J3DModel*) { - /* Nonmatching */ +void mDoExt_changeMaterial(J3DModel* i_model) { + J3DModelData* model_data = i_model->getModelData(); + + for (u16 i = 0; i < model_data->getMaterialNum(); i++) { + model_data->getMaterialNodePointer(i)->change(); + } } /* 8000F6A0-8000F758 .text mDoExt_modelTexturePatch__FP12J3DModelData */ -void mDoExt_modelTexturePatch(J3DModelData*) { - /* Nonmatching */ +void mDoExt_modelTexturePatch(J3DModelData* i_modelData) { + j3dSys.setTexture(i_modelData->getTexture()); + + for (u16 i = 0; i < i_modelData->getMaterialNum(); i++) { + J3DMaterial* mat = i_modelData->getMaterialNodePointer(i); + J3DTevBlock* tev = mat->getTevBlock(); + J3DDisplayListObj* dlObj = mat->getSharedDisplayListObj(); + + BOOL ret = OSDisableInterrupts(); + GDInitGDLObj(&J3DDisplayListObj::sGDLObj, dlObj->getDisplayList(0), + dlObj->getDisplayListSize()); + GDSetCurrent(&J3DDisplayListObj::sGDLObj); + tev->patchTexNoAndTexCoordScale(); + OSRestoreInterrupts(ret); + GDSetCurrent(NULL); + } } -/* 8000F758-8000F75C .text patchTexNoAndTexCoordScale__11J3DTevBlockFv */ -void J3DTevBlock::patchTexNoAndTexCoordScale() { - /* Nonmatching */ -} - -/* 8000F75C-8000F760 .text patch__10J3DPEBlockFv */ -void J3DPEBlock::patch() { - /* Nonmatching */ -} - -/* 8000F760-8000F764 .text patchLight__13J3DColorBlockFv */ -void J3DColorBlock::patchLight() { - /* Nonmatching */ -} - -/* 8000F764-8000F768 .text patch__11J3DTevBlockFv */ -void J3DTevBlock::patch() { - /* Nonmatching */ +static void dummy(J3DTevBlock* tev, J3DColorBlock* color, J3DPEBlock* pe) { + tev->patch(); + color->patchLight(); + pe->patch(); } /* 8000F768-8000F7BC .text mDoExt_modelDiff__FP8J3DModel */ -void mDoExt_modelDiff(J3DModel*) { - /* Nonmatching */ +void mDoExt_modelDiff(J3DModel* i_model) { + i_model->calcMaterial(); + i_model->diff(); + i_model->entry(); } /* 8000F7BC-8000F84C .text mDoExt_modelUpdate__FP8J3DModel */ -void mDoExt_modelUpdate(J3DModel*) { - /* Nonmatching */ +void mDoExt_modelUpdate(J3DModel* i_model) { + J3DModelData* model_data = i_model->getModelData(); + + if (model_data->getModelDataType() == 1 && !model_data->isLocked()) { + i_model->calc(); + mDoExt_modelDiff(i_model); + } else { + i_model->update(); + i_model->lock(); + } + + i_model->viewCalc(); } /* 8000F84C-8000F8F8 .text mDoExt_modelUpdateDL__FP8J3DModel */ -void mDoExt_modelUpdateDL(J3DModel*) { - /* Nonmatching */ +void mDoExt_modelUpdateDL(J3DModel* i_model) { + J3DModelData* model_data = i_model->getModelData(); + + if (model_data->getModelDataType() == 1 && !model_data->isLocked()) { + i_model->calc(); + mDoExt_modelDiff(i_model); + } else { + if (g_regHIO.mChild[2].mShortRegs[9] == 0) { + i_model->unlock(); + } + i_model->update(); + i_model->lock(); + } + + i_model->viewCalc(); } /* 8000F8F8-8000F974 .text mDoExt_modelEntry__FP8J3DModel */ -void mDoExt_modelEntry(J3DModel*) { - /* Nonmatching */ +void mDoExt_modelEntry(J3DModel* i_model) { + J3DModelData* model_data = i_model->getModelData(); + + if (model_data->getModelDataType() == 1 && !model_data->isLocked()) { + mDoExt_modelDiff(i_model); + } else { + i_model->entry(); + i_model->lock(); + } + + i_model->viewCalc(); } /* 8000F974-8000FA0C .text mDoExt_modelEntryDL__FP8J3DModel */ -void mDoExt_modelEntryDL(J3DModel*) { - /* Nonmatching */ +void mDoExt_modelEntryDL(J3DModel* i_model) { + J3DModelData* model_data = i_model->getModelData(); + + if (model_data->getModelDataType() == 1 && !model_data->isLocked()) { + mDoExt_modelDiff(i_model); + } else { + if (g_regHIO.mChild[2].mShortRegs[9] == 0) { + i_model->unlock(); + } + i_model->entry(); + i_model->lock(); + } + + i_model->viewCalc(); } /* 8000FA0C-800100F0 .text store__23mDoExt_backupMatBlock_cFP11J3DMaterial */ -void mDoExt_backupMatBlock_c::store(J3DMaterial*) { +void mDoExt_backupMatBlock_c::store(J3DMaterial* i_material) { /* Nonmatching */ + J3DColorBlock* colorBlock = i_material->getColorBlock(); + mColorChanNum = colorBlock->getColorChanNum(); + for (u32 i = 0; i < 2; i++) { + mMatColor[i] = *colorBlock->getMatColor(i); + } + for (u32 i = 0; i < 4; i++) { + mColorChan[i] = *colorBlock->getColorChan(i); + } + for (u32 i = 0; i < 2; i++) { + mAmbColor[i] = *colorBlock->getAmbColor(i); + } + J3DTexGenBlock* texGenBlock = i_material->getTexGenBlock(); + mTexGenNum = texGenBlock->getTexGenNum(); + u32 texGenMax = 8; + if (texGenBlock->getType() == 'TGB4') { + texGenMax = 4; + }; + for (u32 i = 0; i < texGenMax; i++) { + mTexCoord[i] = *texGenBlock->getTexCoord(i); + } + for (u32 i = 0; i < texGenMax; i++) { + if (texGenBlock->getTexMtx(i)) { + memcpy(&mTexMtx[i], texGenBlock->getTexMtx(i), sizeof(J3DTexMtx)); + DCStoreRange(&mTexMtx[i], sizeof(J3DTexMtx)); + } + } + J3DTevBlock* tevBlock = i_material->getTevBlock(); + mTevStageNum = tevBlock->getTevStageNum(); + for (u32 i = 0; i < 4; i++) { + mTevColor[i] = *tevBlock->getTevColor(i); + } + for (u32 i = 0; i < 4; i++) { + mTevKColor[i] = *tevBlock->getTevKColor(i); + } + u32 texNoMax = 8; + if (tevBlock->getType() == 'TVB4') { + texNoMax = 4; + for (u32 i = 0; i < 4; i++) { + mTevOrder[i] = *tevBlock->getTevOrder(i); + mTevKColorSel[i] = tevBlock->getTevKColorSel(i); + mTevKAlphaSel[i] = tevBlock->getTevKAlphaSel(i); + } + for (u32 i = 0; i < 4; i++) { + mTevSwapModeTable[i] = *tevBlock->getTevSwapModeTable(i); + } + } + for (u32 i = 0; i < texNoMax; i++) { + mTexNo[i] = tevBlock->getTexNo(i); + } + for (u32 i = 0; i < texNoMax; i++) { + mTevStage[i] = *tevBlock->getTevStage(i); + mIndTevStage[i] = *tevBlock->getIndTevStage(i); + } + J3DIndBlock* indBlock = i_material->getIndBlock(); + if (indBlock->getType() == 'IBLF') { + mIndTexStageNum = indBlock->getIndTexStageNum(); + for (u32 i = 0; i < 4; i++) { + mIndTexOrder[i] = *indBlock->getIndTexOrder(i); + } + for (u32 i = 0; i < 3; i++) { + mIndTexMtx[i] = *indBlock->getIndTexMtx(i); + } + for (u32 i = 0; i < 4; i++) { + mIndTexCoordScale[i] = *indBlock->getIndTexCoordScale(i); + } + } + J3DPEBlock* peBlock = i_material->getPEBlock(); + memcpy(&mFog, peBlock->getFog(), sizeof(J3DFog)); + DCStoreRange(&mFog, sizeof(J3DFog)); + mAlphaComp = *peBlock->getAlphaComp(); + mBlend = *peBlock->getBlend(); + mZMode = *peBlock->getZMode(); + mZCompLoc = peBlock->getZCompLoc(); + mMaterialAnm = i_material->getMaterialAnm(); + mMaterialMode = i_material->getMaterialMode(); } /* 800101BC-8001084C .text restore__23mDoExt_backupMatBlock_cFP11J3DMaterial */ -void mDoExt_backupMatBlock_c::restore(J3DMaterial*) { - /* Nonmatching */ -} - -/* 800108DC-800108E0 .text setIndTexStageNum__11J3DIndBlockFUc */ -void J3DIndBlock::setIndTexStageNum(u8) { - /* Nonmatching */ -} - -/* 800108E0-800108E4 .text setIndTevStage__11J3DTevBlockFUl14J3DIndTevStage */ -void J3DTevBlock::setIndTevStage(u32, J3DIndTevStage) { - /* Nonmatching */ -} - -/* 800108E4-800108E8 .text setTevStage__11J3DTevBlockFUl11J3DTevStage */ -void J3DTevBlock::setTevStage(u32, J3DTevStage) { - /* Nonmatching */ -} - -/* 800108E8-800108EC .text setTexNo__11J3DTevBlockFUlUs */ -void J3DTevBlock::setTexNo(u32, u16) { - /* Nonmatching */ -} - -/* 800108EC-800108F0 .text setTevSwapModeTable__11J3DTevBlockFUl19J3DTevSwapModeTable */ -void J3DTevBlock::setTevSwapModeTable(u32, J3DTevSwapModeTable) { - /* Nonmatching */ -} - -/* 800108F0-800108F4 .text setTevKAlphaSel__11J3DTevBlockFUlUc */ -void J3DTevBlock::setTevKAlphaSel(u32, u8) { - /* Nonmatching */ -} - -/* 800108F4-800108F8 .text setTevKColorSel__11J3DTevBlockFUlUc */ -void J3DTevBlock::setTevKColorSel(u32, u8) { - /* Nonmatching */ -} - -/* 800108F8-800108FC .text setTevOrder__11J3DTevBlockFUl11J3DTevOrder */ -void J3DTevBlock::setTevOrder(u32, J3DTevOrder) { - /* Nonmatching */ -} - -/* 800108FC-80010900 .text setTevKColor__11J3DTevBlockFUl10J3DGXColor */ -void J3DTevBlock::setTevKColor(u32, J3DGXColor) { - /* Nonmatching */ -} - -/* 80010900-80010904 .text setTevColor__11J3DTevBlockFUl13J3DGXColorS10 */ -void J3DTevBlock::setTevColor(u32, J3DGXColorS10) { - /* Nonmatching */ -} - -/* 80010904-80010908 .text setTevStageNum__11J3DTevBlockFUc */ -void J3DTevBlock::setTevStageNum(u8) { - /* Nonmatching */ -} - -/* 80010908-8001090C .text setTexCoord__14J3DTexGenBlockFUlPC11J3DTexCoord */ -void J3DTexGenBlock::setTexCoord(u32, const J3DTexCoord*) { - /* Nonmatching */ -} - -/* 8001090C-80010910 .text setTexGenNum__14J3DTexGenBlockFUl */ -void J3DTexGenBlock::setTexGenNum(u32) { - /* Nonmatching */ -} - -/* 80010910-80010914 .text setAmbColor__13J3DColorBlockFUl10J3DGXColor */ -void J3DColorBlock::setAmbColor(u32, J3DGXColor) { - /* Nonmatching */ -} - -/* 80010914-80010918 .text setColorChan__13J3DColorBlockFUlRC12J3DColorChan */ -void J3DColorBlock::setColorChan(u32, const J3DColorChan&) { - /* Nonmatching */ -} - -/* 80010918-8001091C .text setMatColor__13J3DColorBlockFUl10J3DGXColor */ -void J3DColorBlock::setMatColor(u32, J3DGXColor) { - /* Nonmatching */ -} - -/* 8001091C-80010920 .text setColorChanNum__13J3DColorBlockFUc */ -void J3DColorBlock::setColorChanNum(u8) { +void mDoExt_backupMatBlock_c::restore(J3DMaterial* i_material) { /* Nonmatching */ + J3DColorBlock* colorBlock = i_material->getColorBlock(); + colorBlock->setColorChanNum(mColorChanNum); + for (u32 i = 0; i < 2; i++) { + colorBlock->setMatColor(i, mMatColor[i]); + } + for (u32 i = 0; i < 4; i++) { + colorBlock->setColorChan(i, mColorChan[i]); + } + for (u32 i = 0; i < 2; i++) { + colorBlock->setAmbColor(i, mAmbColor[i]); + } + J3DTexGenBlock* texGenBlock = i_material->getTexGenBlock(); + texGenBlock->setTexGenNum(mTexGenNum); + u32 texGenMax = 8; + if (texGenBlock->getType() == 'TGB4') { + texGenMax = 4; + }; + for (u32 i = 0; i < texGenMax; i++) { + texGenBlock->setTexCoord(i, &mTexCoord[i]); + } + for (u32 i = 0; i < texGenMax; i++) { + if (texGenBlock->getTexMtx(i)) { + memcpy(texGenBlock->getTexMtx(i), &mTexMtx[i], sizeof(J3DTexMtx)); + DCStoreRange(texGenBlock->getTexMtx(i), sizeof(J3DTexMtx)); + } + } + J3DTevBlock* tevBlock = i_material->getTevBlock(); + tevBlock->setTevStageNum(mTevStageNum); + for (u32 i = 0; i < 4; i++) { + tevBlock->setTevColor(i, mTevColor[i]); + } + for (u32 i = 0; i < 4; i++) { + tevBlock->setTevKColor(i, mTevKColor[i]); + } + u32 texNoMax = 8; + if (tevBlock->getType() == 'TVB4') { + texNoMax = 4; + for (u32 i = 0; i < 4; i++) { + tevBlock->setTevOrder(i, mTevOrder[i]); + tevBlock->setTevKColorSel(i, mTevKColorSel[i]); + tevBlock->setTevKAlphaSel(i, mTevKAlphaSel[i]); + } + for (u32 i = 0; i < 4; i++) { + tevBlock->setTevSwapModeTable(i, mTevSwapModeTable[i]); + } + } + for (u32 i = 0; i < texNoMax; i++) { + tevBlock->setTexNo(i, mTexNo[i]); + } + for (u32 i = 0; i < texNoMax; i++) { + tevBlock->setTevStage(i, mTevStage[i]); + tevBlock->setIndTevStage(i, mIndTevStage[i]); + } + J3DIndBlock* indBlock = i_material->getIndBlock(); + if (indBlock->getType() == 'IBLF') { + indBlock->setIndTexStageNum(mIndTexStageNum); + for (u32 i = 0; i < 4; i++) { + *indBlock->getIndTexOrder(i) = mIndTexOrder[i]; + } + for (u32 i = 0; i < 3; i++) { + indBlock->setIndTexMtx(i, mIndTexMtx[i]); + } + for (u32 i = 0; i < 4; i++) { + indBlock->setIndTexCoordScale(i, mIndTexCoordScale[i]); + } + } + J3DPEBlock* peBlock = i_material->getPEBlock(); + memcpy(peBlock->getFog(), &mFog, sizeof(J3DFog)); + DCStoreRange(peBlock->getFog(), sizeof(J3DFog)); + peBlock->setAlphaComp(mAlphaComp); + peBlock->setBlend(mBlend); + peBlock->setZMode(mZMode); + peBlock->setZCompLoc(mZCompLoc); + i_material->setMaterialAnm(mMaterialAnm); + i_material->setMaterialMode(mMaterialMode); } /* 80010920-800109F4 .text create__23mDoExt_backupMaterial_cFP12J3DModelData */ -void mDoExt_backupMaterial_c::create(J3DModelData*) { +bool mDoExt_backupMaterial_c::create(J3DModelData* i_modelData) { /* Nonmatching */ + if (!mBackupMatBlock) { + mBackupMatBlock = new mDoExt_backupMatBlock_c[i_modelData->getMaterialNum()]; + if (!mBackupMatBlock) { + return false; + } + } + for (u16 i = 0; i < i_modelData->getMaterialNum(); i++) { + J3DMaterial* material = i_modelData->getMaterialNodePointer(i); + mBackupMatBlock[i].store(material); + } + mTexture = i_modelData->getTexture(); + mTextureName = i_modelData->getTextureName(); + return true; } /* 800109F4-80010A88 .text __dt__23mDoExt_backupMatBlock_cFv */ @@ -534,84 +705,50 @@ mDoExt_backupMatBlock_c::~mDoExt_backupMatBlock_c() { /* Nonmatching */ } -/* 80010A88-80010AC4 .text __dt__9J3DTexMtxFv */ -J3DTexMtx::~J3DTexMtx() { - /* Nonmatching */ -} - /* 80010AC4-80010D44 .text __ct__23mDoExt_backupMatBlock_cFv */ mDoExt_backupMatBlock_c::mDoExt_backupMatBlock_c() { /* Nonmatching */ } -/* 80010D44-80010D5C .text __ct__19J3DIndTexCoordScaleFv */ -J3DIndTexCoordScale::J3DIndTexCoordScale() { - /* Nonmatching */ -} - -/* 80010D5C-80010DB4 .text __ct__12J3DIndTexMtxFv */ -J3DIndTexMtx::J3DIndTexMtx() { - /* Nonmatching */ -} - -/* 80010DB4-80010DCC .text __ct__14J3DIndTexOrderFv */ -J3DIndTexOrder::J3DIndTexOrder() { - /* Nonmatching */ -} - -/* 80010DCC-80010DD8 .text __ct__19J3DTevSwapModeTableFv */ -J3DTevSwapModeTable::J3DTevSwapModeTable() { - /* Nonmatching */ -} - -/* 80010DD8-80010DF8 .text __ct__11J3DTevOrderFv */ -J3DTevOrder::J3DTevOrder() { - /* Nonmatching */ -} - -/* 80010DF8-80010EDC .text __ct__14J3DIndTevStageFv */ -J3DIndTevStage::J3DIndTevStage() { - /* Nonmatching */ -} - /* 80010F44-8001110C .text setTevStageInfo__11J3DTevStageFRC15J3DTevStageInfo */ void J3DTevStage::setTevStageInfo(const J3DTevStageInfo&) { /* Nonmatching */ } -/* 800111B4-800111D4 .text __ct__11J3DTexCoordFv */ -J3DTexCoord::J3DTexCoord() { - /* Nonmatching */ -} - -/* 800111D4-80011290 .text __ct__12J3DColorChanFv */ -J3DColorChan::J3DColorChan() { - /* Nonmatching */ -} - /* 80011294-80011300 .text create__23mDoExt_backupMaterial_cFUs */ -void mDoExt_backupMaterial_c::create(u16) { - /* Nonmatching */ +bool mDoExt_backupMaterial_c::create(u16 param_0) { + mBackupMatBlock = new mDoExt_backupMatBlock_c[param_0]; + return mBackupMatBlock != NULL; } /* 80011300-80011380 .text restore__23mDoExt_backupMaterial_cFP12J3DModelData */ -void mDoExt_backupMaterial_c::restore(J3DModelData*) { - /* Nonmatching */ +void mDoExt_backupMaterial_c::restore(J3DModelData* i_modelData) { + for (u16 i = 0; i < i_modelData->getMaterialNum(); i++) { + J3DMaterial* material = i_modelData->getMaterialNodePointer(i); + mBackupMatBlock[i].restore(material); + } + i_modelData->setTexture(mTexture); + i_modelData->setTextureName(mTextureName); } /* 80011380-80011434 .text create__21mDoExt_invisibleModelFP8J3DModel */ -void mDoExt_invisibleModel::create(J3DModel*) { - /* Nonmatching */ -} +bool mDoExt_invisibleModel::create(J3DModel* model) { + J3DModelData* modelData = model->getModelData(); -/* 80011434-80011490 .text __dt__19mDoExt_invJntPacketFv */ -mDoExt_invJntPacket::~mDoExt_invJntPacket() { - /* Nonmatching */ -} + mpPackets = new mDoExt_invJntPacket[modelData->getJointNum()]; + if (!mpPackets) { + return false; + } -/* 80011490-800114BC .text __ct__19mDoExt_invJntPacketFv */ -mDoExt_invJntPacket::mDoExt_invJntPacket() { - /* Nonmatching */ + mModel = model; + mDoExt_invJntPacket* packet = mpPackets; + + for (u16 i = 0; i < modelData->getJointNum(); i++) { + packet->setJoint(mModel, i); + packet++; + } + + return true; } /* 80011504-800115AC .text entry__21mDoExt_invisibleModelFv */ @@ -634,139 +771,224 @@ void mDoExt_invisibleModel::updateDL(mDoExt_McaMorf*) { /* Nonmatching */ } +JKRExpHeap* gameHeap; + /* 80011734-800117E4 .text mDoExt_createGameHeap__FUlP7JKRHeap */ -JKRExpHeap* mDoExt_createGameHeap(u32, JKRHeap*) { - /* Nonmatching */ +JKRExpHeap* mDoExt_createGameHeap(u32 heapSize, JKRHeap* i_heap) { + JUT_ASSERT(2050, gameHeap == 0 || heapSize == 0); + gameHeap = JKRExpHeap::create(heapSize, i_heap, true); + gameHeap->setAllocationMode(JKRExpHeap::ALLOC_MODE_1); + return gameHeap; } /* 800117E4-800117EC .text mDoExt_getGameHeap__Fv */ JKRExpHeap* mDoExt_getGameHeap() { - /* Nonmatching */ + return gameHeap; } +s32 safeGameHeapSize; + /* 800117EC-80011814 .text mDoExt_setSafeGameHeapSize__Fv */ void mDoExt_setSafeGameHeapSize() { - /* Nonmatching */ + safeGameHeapSize = mDoExt_getGameHeap()->getTotalFreeSize(); } /* 80011814-8001181C .text mDoExt_getSafeGameHeapSize__Fv */ -int mDoExt_getSafeGameHeapSize() { - /* Nonmatching */ +s32 mDoExt_getSafeGameHeapSize() { + return safeGameHeapSize; } +JKRExpHeap* zeldaHeap; + /* 8001181C-800118C0 .text mDoExt_createZeldaHeap__FUlP7JKRHeap */ -JKRExpHeap* mDoExt_createZeldaHeap(u32, JKRHeap*) { - /* Nonmatching */ +JKRExpHeap* mDoExt_createZeldaHeap(u32 heapSize, JKRHeap* i_heap) { + JUT_ASSERT(2112, zeldaHeap == 0 || heapSize == 0); + return zeldaHeap = JKRExpHeap::create(heapSize, i_heap, true); } /* 800118C0-800118C8 .text mDoExt_getZeldaHeap__Fv */ JKRExpHeap* mDoExt_getZeldaHeap() { - /* Nonmatching */ + return zeldaHeap; } +s32 safeZeldaHeapSize; + /* 800118C8-800118F0 .text mDoExt_setSafeZeldaHeapSize__Fv */ int mDoExt_setSafeZeldaHeapSize() { - /* Nonmatching */ + safeZeldaHeapSize = mDoExt_getZeldaHeap()->getTotalFreeSize(); } /* 800118F0-800118F8 .text mDoExt_getSafeZeldaHeapSize__Fv */ -int mDoExt_getSafeZeldaHeapSize() { - /* Nonmatching */ +s32 mDoExt_getSafeZeldaHeapSize() { + return safeZeldaHeapSize; } +JKRExpHeap* commandHeap; + /* 800118F8-8001199C .text mDoExt_createCommandHeap__FUlP7JKRHeap */ -JKRExpHeap* mDoExt_createCommandHeap(u32, JKRHeap*) { - /* Nonmatching */ +JKRExpHeap* mDoExt_createCommandHeap(u32 heapSize, JKRHeap* i_heap) { + JUT_ASSERT(2173, commandHeap == 0 || heapSize == 0); + return commandHeap = JKRExpHeap::create(heapSize, i_heap, true); } /* 8001199C-800119A4 .text mDoExt_getCommandHeap__Fv */ JKRExpHeap* mDoExt_getCommandHeap() { - /* Nonmatching */ + return commandHeap; } +s32 safeCommandHeapSize; + /* 800119A4-800119CC .text mDoExt_setSafeCommandHeapSize__Fv */ void mDoExt_setSafeCommandHeapSize() { - /* Nonmatching */ + safeCommandHeapSize = mDoExt_getCommandHeap()->getTotalFreeSize(); } /* 800119CC-800119D4 .text mDoExt_getSafeCommandHeapSize__Fv */ -int mDoExt_getSafeCommandHeapSize() { - /* Nonmatching */ +s32 mDoExt_getSafeCommandHeapSize() { + return safeCommandHeapSize; } +JKRExpHeap* archiveHeap; + /* 800119D4-80011A84 .text mDoExt_createArchiveHeap__FUlP7JKRHeap */ -JKRExpHeap* mDoExt_createArchiveHeap(u32, JKRHeap*) { - /* Nonmatching */ +JKRExpHeap* mDoExt_createArchiveHeap(u32 heapSize, JKRHeap* i_heap) { + JUT_ASSERT(2237, archiveHeap == 0 || heapSize == 0); + archiveHeap = JKRExpHeap::create(heapSize, i_heap, true); + archiveHeap->setAllocationMode(JKRExpHeap::ALLOC_MODE_1); + return archiveHeap; } +s32 safeArchiveHeapSize; + /* 80011A84-80011AAC .text mDoExt_setSafeArchiveHeapSize__Fv */ void mDoExt_setSafeArchiveHeapSize() { - /* Nonmatching */ + safeArchiveHeapSize = mDoExt_getArchiveHeap()->getTotalFreeSize(); } /* 80011AAC-80011AB4 .text mDoExt_getSafeArchiveHeapSize__Fv */ -int mDoExt_getSafeArchiveHeapSize() { - /* Nonmatching */ +s32 mDoExt_getSafeArchiveHeapSize() { + return safeArchiveHeapSize; } /* 80011AB4-80011ABC .text mDoExt_getArchiveHeap__Fv */ JKRExpHeap* mDoExt_getArchiveHeap() { - /* Nonmatching */ + return archiveHeap; } /* 80011ABC-80011B54 .text mDoExt_createSolidHeap__FUlP7JKRHeapUl */ -void mDoExt_createSolidHeap(u32, JKRHeap*, u32) { - /* Nonmatching */ +JKRSolidHeap* mDoExt_createSolidHeap(u32 i_size, JKRHeap* i_heap, u32 i_alignment) { + if (i_heap == NULL) { + i_heap = JKRHeap::getCurrentHeap(); + } + + JKRSolidHeap* createdHeap; + if (i_size == 0 || i_size == 0xFFFFFFFF) { + createdHeap = JKRSolidHeap::create(0xFFFFFFFFFF, i_heap, false); + } else { + i_size = ALIGN_NEXT(i_size, 0x10); + i_size += 0x80; + + if (0x10 < i_alignment) { + i_size = (i_alignment - 0x10 + i_size); + } + createdHeap = JKRSolidHeap::create(i_size, i_heap, false); + } + + if (createdHeap != NULL) { + createdHeap->setErrorFlag(true); + } + + return createdHeap; } /* 80011B54-80011B9C .text mDoExt_createSolidHeapFromGame__FUlUl */ -void mDoExt_createSolidHeapFromGame(u32, u32) { - /* Nonmatching */ +JKRSolidHeap* mDoExt_createSolidHeapFromGame(u32 i_size, u32 i_alignment) { + return mDoExt_createSolidHeap(i_size, mDoExt_getGameHeap(), i_alignment); } /* 80011B9C-80011BE4 .text mDoExt_createSolidHeapFromSystem__FUlUl */ -void mDoExt_createSolidHeapFromSystem(u32, u32) { - /* Nonmatching */ +JKRSolidHeap* mDoExt_createSolidHeapFromSystem(u32 i_size, u32 i_alignment) { + return mDoExt_createSolidHeap(i_size, mDoExt_getZeldaHeap(), i_alignment); } +static void dummy() { + OSReport("situationHeap == 0 || heapSize == 0"); + OSReport("situationHeapLocked == 0"); + OSReport("situationHeap"); + OSReport("situationHeapLocked"); + OSReport("heap == situationHeap"); +} + +JKRHeap* mDoExt_SaveCurrentHeap; + /* 80011BE4-80011CC0 .text mDoExt_createSolidHeapToCurrent__FUlP7JKRHeapUl */ -JKRSolidHeap* mDoExt_createSolidHeapToCurrent(u32, JKRHeap*, u32) { - /* Nonmatching */ +JKRSolidHeap* mDoExt_createSolidHeapToCurrent(u32 i_size, JKRHeap* i_parent, u32 i_alignment) { + JKRSolidHeap* resultHeap = mDoExt_createSolidHeap(i_size, i_parent, i_alignment); + if (!resultHeap) { + return NULL; + } + JUT_ASSERT(2545, OSGetCurrentThread() == &mainThread); + JUT_ASSERT(2546, mDoExt_SaveCurrentHeap == 0); + mDoExt_SaveCurrentHeap = JKRGetCurrentHeap(); + mDoExt_setCurrentHeap(resultHeap); + + return resultHeap; } /* 80011CC0-80011D0C .text mDoExt_createSolidHeapFromGameToCurrent__FUlUl */ -JKRSolidHeap* mDoExt_createSolidHeapFromGameToCurrent(u32, u32) { - /* Nonmatching */ +JKRSolidHeap* mDoExt_createSolidHeapFromGameToCurrent(u32 i_size, u32 i_alignment) { + mDoExt_getGameHeap(); + return mDoExt_createSolidHeapToCurrent(i_size, mDoExt_getGameHeap(), i_alignment); } /* 80011D0C-80011D48 .text mDoExt_adjustSolidHeap__FP12JKRSolidHeap */ -u32 mDoExt_adjustSolidHeap(JKRSolidHeap*) { - /* Nonmatching */ +u32 mDoExt_adjustSolidHeap(JKRSolidHeap* i_heap) { + if (i_heap == NULL) { + return 0; + } + + s32 result = i_heap->adjustSize(); + + if (result >= (u32)0x80) { + result -= 0x80; + } + + return result; } /* 80011D48-80011D68 .text mDoExt_destroySolidHeap__FP12JKRSolidHeap */ -void mDoExt_destroySolidHeap(JKRSolidHeap*) { - /* Nonmatching */ +void mDoExt_destroySolidHeap(JKRSolidHeap* i_heap) { + i_heap->destroy(); } /* 80011D68-80011DD4 .text mDoExt_setCurrentHeap__FP7JKRHeap */ -void mDoExt_setCurrentHeap(JKRHeap*) { - /* Nonmatching */ +JKRHeap* mDoExt_setCurrentHeap(JKRHeap* heap) { + JUT_ASSERT(2684, heap != 0); + return heap->becomeCurrentHeap(); } /* 80011DD4-80011DDC .text mDoExt_getCurrentHeap__Fv */ -void mDoExt_getCurrentHeap() { - /* Nonmatching */ +JKRHeap* mDoExt_getCurrentHeap() { + return JKRGetCurrentHeap(); } /* 80011DDC-80011E98 .text mDoExt_restoreCurrentHeap__Fv */ void mDoExt_restoreCurrentHeap() { - /* Nonmatching */ + JUT_ASSERT(2754, OSGetCurrentThread() == &mainThread); + JUT_ASSERT(2755, mDoExt_SaveCurrentHeap != 0); + mDoExt_SaveCurrentHeap->becomeCurrentHeap(); + mDoExt_SaveCurrentHeap = NULL; } /* 80011E98-80011EE4 .text mDoExt_resIDToIndex__FP10JKRArchiveUs */ -s32 mDoExt_resIDToIndex(JKRArchive*, u16) { - /* Nonmatching */ +s32 mDoExt_resIDToIndex(JKRArchive* p_archive, u16 id) { + JKRArchive::SDIFileEntry* res = p_archive->findIdResource(id); + + if (res == NULL) { + return -1; + } + + return res - p_archive->mFiles; } /* 80011EE4-80012140 .text calc__25mDoExt_MtxCalcAnmBlendTblFUs */