#ifndef J3DPACKET_H #define J3DPACKET_H #include "JSystem/J3DGraphBase/J3DSys.h" #include "dolphin/gd/GDBase.h" #include class J3DMatPacket; class J3DDrawBuffer; class J3DMaterial; class J3DMaterialAnm; class J3DModel; class J3DMtxBuffer; class J3DShape; class J3DTexMtx; class J3DTexMtxObj; class J3DTexture; enum J3DDiffFlag { J3DDiffFlag_MatColor = 0x1, J3DDiffFlag_ColorChan = 0x2, J3DDiffFlag_AmbColor = 0x4, J3DDiffFlag_TexGen = 0x1000, J3DDiffFlag_TevReg = 0x1000000, J3DDiffFlag_KonstColor = 0x2000000, // is this right? J3DDiffFlag_TexCoordScale = 0x4000000, J3DDiffFlag_TevStageIndirect = 0x8000000, J3DDiffFlag_Fog = 0x10000000, J3DDiffFlag_Blend = 0x20000000, J3DDiffFlag_Unk40000000 = 0x40000000, J3DDiffFlag_Changed = 0x80000000, }; #define J3D_DIFF_LIGHTOBJNUM(n) ((n & 0xF) << 4) #define J3D_DIFF_TEXGENNUM(n) ((n & 0xF) << 8) #define J3D_DIFF_TEXNONUM(n) ((n & 0xF) << 16) #define J3D_DIFF_TEVSTAGENUM(n) ((n & 0xF) << 20) #define J3D_DIFF_FLAG(MatColor, ColorChan, AmbColor, LightNum, TexGenNum, TexGen, TexCoordNum, TevStageNum, TevReg, KColor, TexCoordScale, TevStageInd, Fog, Blend) \ ( \ (MatColor << 0) | \ (ColorChan << 1) | \ (AmbColor << 2) | \ ((LightNum & 0xF) << 4) | \ ((TexGenNum & 0xF) << 8) | \ (TexGen << 12) | \ ((TexCoordNum & 0xF) << 16) | \ ((TevStageNum & 0xF) << 20) | \ (TevReg << 24) | \ (KColor << 25) | \ (TexCoordScale << 26) | \ (TevStageInd << 27) | \ (Fog << 28) | \ (Blend << 29) \ ) inline u32 getDiffFlag_LightObjNum(u32 diffFlags) { return (diffFlags & 0xf0) >> 4; } inline u32 getDiffFlag_TexGenNum(u32 diffFlags) { return (diffFlags & 0xf00) >> 8; } inline int calcDifferedBufferSize_TexMtxSize(u32 param_1) { return param_1 * 0x35; } inline int calcDifferedBufferSize_TexGenSize(u32 param_1) { return param_1 * 0x3d + 10; } inline u32 getDiffFlag_TexNoNum(u32 diffFlags) { return (diffFlags & 0xf0000) >> 0x10; } inline int calcDifferedBufferSize_TexNoSize(u32 param_1) { return param_1 * 0x37; } inline u32 calcDifferedBufferSize_TexNoAndTexCoordScaleSize(u32 param_1) { u32 res = param_1 * 0x37; res += ((param_1 + 1) >> 1) * 0x37; return res; } inline u32 getDiffFlag_TevStageNum(u32 diffFlags) { return (diffFlags & 0xf00000) >> 0x14; } inline int calcDifferedBufferSize_TevStageSize(u32 param_1) { return param_1 * 10; } inline int calcDifferedBufferSize_TevStageDirectSize(u32 param_1) { return param_1 * 5; } /** * @ingroup jsystem-j3d * */ class J3DDisplayListObj { public: J3DDisplayListObj() { mpDisplayList[0] = NULL; mpDisplayList[1] = NULL; mSize = 0; mMaxSize = 0; } J3DError newDisplayList(u32); J3DError newSingleDisplayList(u32); int single_To_Double(); void setSingleDisplayList(void*, u32); void swapBuffer(); void callDL() const; void beginDL(); u32 endDL(); void beginPatch(); u32 endPatch(); u8* getDisplayList(int idx) { return (u8*)mpDisplayList[idx]; } u32 getDisplayListSize() { return mSize; } static GDLObj sGDLObj; static s32 sInterruptFlag; /* 0x0 */ void* mpDisplayList[2]; /* 0x8 */ u32 mSize; /* 0xC */ u32 mMaxSize; }; // Size: 0x10 /** * @ingroup jsystem-j3d * */ class J3DPacket { public: J3DPacket() { mpNextPacket = NULL; mpFirstChild = NULL; mpUserArea = NULL; } void addChildPacket(J3DPacket*); J3DPacket* getNextPacket() const { return mpNextPacket; } void setNextPacket(J3DPacket* i_packet) { mpNextPacket = i_packet; } void drawClear() { mpNextPacket = NULL; mpFirstChild = NULL; } void* getUserArea() const { return mpUserArea; } void setUserArea(uintptr_t area) { mpUserArea = (void*)area; } virtual int entry(J3DDrawBuffer*); virtual void draw(); virtual ~J3DPacket() {} public: /* 0x04 */ J3DPacket* mpNextPacket; /* 0x08 */ J3DPacket* mpFirstChild; /* 0x0C */ void* mpUserArea; }; // Size: 0x10 /** * @ingroup jsystem-j3d * */ class J3DDrawPacket : public J3DPacket { public: J3DDrawPacket(); ~J3DDrawPacket(); J3DError newDisplayList(u32); J3DError newSingleDisplayList(u32); virtual void draw(); J3DDisplayListObj* getDisplayListObj() { return mpDisplayListObj; } void setDisplayListObj(J3DDisplayListObj* pObj) { mpDisplayListObj = pObj; } void beginPatch() { mpDisplayListObj->beginPatch(); } void endPatch() { mpDisplayListObj->endPatch(); } void callDL() const { mpDisplayListObj->callDL(); } void beginDL() { mpDisplayListObj->beginDL(); } void endDL() { mpDisplayListObj->endDL(); } void* getDisplayList(int i) { return mpDisplayListObj->mpDisplayList[i]; } u32 getDisplayListSize() const { return mpDisplayListObj->mSize; } enum { LOCKED = 0x01, }; bool checkFlag(u32 flag) const { return (mFlags & flag) ? true : false; } void onFlag(u32 flag) { mFlags |= flag; } void offFlag(u32 flag) { mFlags &= ~flag; } void lock() { onFlag(LOCKED); } void unlock() { offFlag(LOCKED); } J3DTexMtxObj* getTexMtxObj() { return mpTexMtxObj; } bool isLocked() const { return checkFlag(1); } public: /* 0x10 */ u32 mFlags; /* 0x14 */ char unk_0x14[0x20 - 0x14]; /* 0x20 */ J3DDisplayListObj* mpDisplayListObj; /* 0x24 */ J3DTexMtxObj* mpTexMtxObj; }; // Size: 0x28 /** * @ingroup jsystem-j3d * */ class J3DShapePacket : public J3DDrawPacket { public: J3DShapePacket(); u32 calcDifferedBufferSize(u32); int newDifferedDisplayList(u32); void prepareDraw() const; void drawFast(); virtual ~J3DShapePacket(); virtual void draw(); void setShape(J3DShape* pShape) { J3D_ASSERT_NULLPTR(523, pShape != NULL); mpShape = pShape; } void setModel(J3DModel* pModel) { J3D_ASSERT_NULLPTR(533, pModel != NULL); mpModel = pModel; } void setMtxBuffer(J3DMtxBuffer* pMtxBuffer) { mpMtxBuffer = pMtxBuffer; } void setBaseMtxPtr(Mtx* pMtx) { mpBaseMtxPtr = pMtx; } J3DShape* getShape() const { return mpShape; } J3DModel* getModel() const { return mpModel; } Mtx* getBaseMtxPtr() const { return mpBaseMtxPtr; } public: /* 0x28 */ J3DShape* mpShape; /* 0x2C */ J3DMtxBuffer* mpMtxBuffer; /* 0x30 */ Mtx* mpBaseMtxPtr; /* 0x34 */ u32 mDiffFlag; /* 0x38 */ J3DModel* mpModel; }; // Size: 0x3C /** * @ingroup jsystem-j3d * */ class J3DMatPacket : public J3DDrawPacket { public: J3DMatPacket(); void addShapePacket(J3DShapePacket*); void beginDiff(); void endDiff(); bool isSame(J3DMatPacket*) const; J3DMaterial* getMaterial() const { return mpMaterial; } J3DShapePacket* getShapePacket() const { return mpShapePacket; } void setShapePacket(J3DShapePacket* packet) { mpShapePacket = packet; } void setMaterial(J3DMaterial* pMaterial) { J3D_ASSERT_NULLPTR(646, pMaterial != NULL); mpMaterial = pMaterial; } void setTexture(J3DTexture* pTexture) { J3D_ASSERT_NULLPTR(651, pTexture != NULL); mpTexture = pTexture; } void setInitShapePacket(J3DShapePacket* packet) { mpInitShapePacket = packet; } void setMaterialID(u32 id) { mDiffFlag = id; } void setMaterialAnmID(J3DMaterialAnm* materialAnm) { mpMaterialAnm = materialAnm; } BOOL isChanged() { return mDiffFlag & J3DDiffFlag_Changed; } bool isEnabled_Diff() { return mpInitShapePacket->getDisplayListObj() != NULL; } virtual ~J3DMatPacket(); virtual int entry(J3DDrawBuffer*); virtual void draw(); public: /* 0x28 */ J3DShapePacket* mpInitShapePacket; /* 0x2C */ J3DShapePacket* mpShapePacket; /* 0x30 */ J3DMaterial* mpMaterial; /* 0x34 */ u32 mDiffFlag; /* 0x38 */ J3DTexture* mpTexture; /* 0x3C */ J3DMaterialAnm* mpMaterialAnm; }; // Size: 0x40 #endif /* J3DPACKET_H */