summaryrefslogtreecommitdiff
path: root/src/JSystem/J3DGraphBase/J3DGD.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/JSystem/J3DGraphBase/J3DGD.cpp')
-rw-r--r--src/JSystem/J3DGraphBase/J3DGD.cpp208
1 files changed, 196 insertions, 12 deletions
diff --git a/src/JSystem/J3DGraphBase/J3DGD.cpp b/src/JSystem/J3DGraphBase/J3DGD.cpp
index d4cb70e0..715a8126 100644
--- a/src/JSystem/J3DGraphBase/J3DGD.cpp
+++ b/src/JSystem/J3DGraphBase/J3DGD.cpp
@@ -7,22 +7,22 @@
#include "dolphin/types.h"
#include "dolphin/os/OS.h"
-static u8 cm2hw[] = { 0, 2, 1, 3 };
-u8 J3DGDTexMode0Ids[] = { 0x80, 0x81, 0x82, 0x83, 0xa0, 0xa1, 0xa2, 0xa3 };
-u8 J3DGDTexMode1Ids[] = { 0x84, 0x85, 0x86, 0x87, 0xa4, 0xa5, 0xa6, 0xa7 };
-u8 J3DGDTexImage0Ids[] = { 0x88, 0x89, 0x8a, 0x8b, 0xa8, 0xa9, 0xaa, 0xab };
-u8 J3DGDTexImage3Ids[] = { 0x94, 0x95, 0x96, 0x97, 0xb4, 0xb5, 0xb6, 0xb7 };
-u8 J3DGDTexTlutIds[] = { 0x98, 0x99, 0x9a, 0x9b, 0xb8, 0xb9, 0xba, 0xbb };
-static u8 GX2HWFiltConv[] = { 0, 4, 1, 5, 2, 6 };
-
/* 802D5F38-802D60B0 .text J3DGDSetGenMode__FUcUcUcUc11_GXCullMode */
void J3DGDSetGenMode(u8 texGenNum, u8 colorChanNum, u8 tevNum, u8 indTevNum, GXCullMode cull) {
+ static u8 cm2hw[] = { 0, 2, 1, 3 };
GDOverflowCheck(10);
J3DGDWriteBPCmd(0x07FC3F | 0xFE << 24);
J3DGDWriteBPCmd(texGenNum << 0 | colorChanNum << 4 | (tevNum - 1) << 10 | cm2hw[cull] << 14 | indTevNum << 16 | 0x00 << 24);
}
+u8 J3DGDTexMode0Ids[] = { 0x80, 0x81, 0x82, 0x83, 0xa0, 0xa1, 0xa2, 0xa3 };
+u8 J3DGDTexMode1Ids[] = { 0x84, 0x85, 0x86, 0x87, 0xa4, 0xa5, 0xa6, 0xa7 };
+u8 J3DGDTexImage0Ids[] = { 0x88, 0x89, 0x8a, 0x8b, 0xa8, 0xa9, 0xaa, 0xab };
+u8 J3DGDTexImage3Ids[] = { 0x94, 0x95, 0x96, 0x97, 0xb4, 0xb5, 0xb6, 0xb7 };
+u8 J3DGDTexTlutIds[] = { 0x98, 0x99, 0x9a, 0x9b, 0xb8, 0xb9, 0xba, 0xbb };
+static u8 GX2HWFiltConv[] = { 0, 4, 1, 5, 2, 6 };
+
/* 802D60B0-802D6204 .text J3DGDSetGenMode_3Param__FUcUcUc */
void J3DGDSetGenMode_3Param(u8 texGenNum, u8 tevNum, u8 indTevNum) {
GDOverflowCheck(10);
@@ -81,13 +81,197 @@ void J3DGDSetLightDir(GXLightID id, f32 x, f32 y, f32 z) {
}
/* 802D6ACC-802D702C .text J3DGDSetVtxAttrFmtv__F9_GXVtxFmtP17_GXVtxAttrFmtListb */
-void J3DGDSetVtxAttrFmtv(GXVtxFmt, GXVtxAttrFmtList*, bool) {
- /* Nonmatching */
+void J3DGDSetVtxAttrFmtv(GXVtxFmt fmt, GXVtxAttrFmtList* vtxAttr, bool forceNBT) {
+ GXCompCnt posCompCnt = GX_POS_XYZ;
+ GXCompType posCompType = GX_F32;
+ u32 posCompShift = 0;
+
+ GXCompCnt nrmCompCnt = GX_NRM_XYZ;
+ GXCompType nrmCompType = GX_F32;
+ bool nbt3 = false;
+
+ GXCompCnt clr0CompCnt = GX_CLR_RGBA;
+ GXCompType clr0CompType = GX_RGBA8;
+ GXCompCnt clr1CompCnt = GX_CLR_RGBA;
+ GXCompType clr1CompType = GX_RGBA8;
+
+ GXCompCnt tex0CompCnt = GX_TEX_ST;
+ GXCompType tex0CompType = GX_F32;
+ u32 tex0CompShift = 0;
+ GXCompCnt tex1CompCnt = GX_TEX_ST;
+ GXCompType tex1CompType = GX_F32;
+ u32 tex1CompShift = 0;
+ GXCompCnt tex2CompCnt = GX_TEX_ST;
+ GXCompType tex2CompType = GX_F32;
+ u32 tex2CompShift = 0;
+ GXCompCnt tex3CompCnt = GX_TEX_ST;
+ GXCompType tex3CompType = GX_F32;
+ u32 tex3CompShift = 0;
+ GXCompCnt tex4CompCnt = GX_TEX_ST;
+ GXCompType tex4CompType = GX_F32;
+ u32 tex4CompShift = 0;
+ GXCompCnt tex5CompCnt = GX_TEX_ST;
+ GXCompType tex5CompType = GX_F32;
+ u32 tex5CompShift = 0;
+ GXCompCnt tex6CompCnt = GX_TEX_ST;
+ GXCompType tex6CompType = GX_F32;
+ u32 tex6CompShift = 0;
+ GXCompCnt tex7CompCnt = GX_TEX_ST;
+ GXCompType tex7CompType = GX_F32;
+ u32 tex7CompShift = 0;
+
+ for (; vtxAttr->mAttrib != GX_VA_NULL; vtxAttr++) {
+ switch (vtxAttr->mAttrib) {
+ case GX_VA_POS:
+ posCompCnt = vtxAttr->mCompCnt;
+ posCompType = vtxAttr->mCompType;
+ posCompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_NRM:
+ case GX_VA_NBT:
+ nrmCompType = vtxAttr->mCompType;
+ if (vtxAttr->mCompCnt == GX_NRM_NBT3) {
+ nrmCompCnt = GX_NRM_NBT;
+ nbt3 = true;
+ } else {
+ nrmCompCnt = GX_NRM_NBT;
+ if (!forceNBT)
+ nrmCompCnt = vtxAttr->mCompCnt;
+ nbt3 = false;
+ }
+ break;
+ case GX_VA_CLR0:
+ clr0CompCnt = vtxAttr->mCompCnt;
+ clr0CompType = vtxAttr->mCompType;
+ break;
+ case GX_VA_CLR1:
+ clr1CompCnt = vtxAttr->mCompCnt;
+ clr1CompType = vtxAttr->mCompType;
+ break;
+ case GX_VA_TEX0:
+ tex0CompCnt = vtxAttr->mCompCnt;
+ tex0CompType = vtxAttr->mCompType;
+ tex0CompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_TEX1:
+ tex1CompCnt = vtxAttr->mCompCnt;
+ tex1CompType = vtxAttr->mCompType;
+ tex1CompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_TEX2:
+ tex2CompCnt = vtxAttr->mCompCnt;
+ tex2CompType = vtxAttr->mCompType;
+ tex2CompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_TEX3:
+ tex3CompCnt = vtxAttr->mCompCnt;
+ tex3CompType = vtxAttr->mCompType;
+ tex3CompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_TEX4:
+ tex4CompCnt = vtxAttr->mCompCnt;
+ tex4CompType = vtxAttr->mCompType;
+ tex4CompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_TEX5:
+ tex5CompCnt = vtxAttr->mCompCnt;
+ tex5CompType = vtxAttr->mCompType;
+ tex5CompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_TEX6:
+ tex6CompCnt = vtxAttr->mCompCnt;
+ tex6CompType = vtxAttr->mCompType;
+ tex6CompShift = vtxAttr->mCompShift;
+ break;
+ case GX_VA_TEX7:
+ tex7CompCnt = vtxAttr->mCompCnt;
+ tex7CompType = vtxAttr->mCompType;
+ tex7CompShift = vtxAttr->mCompShift;
+ break;
+ default:
+ break;
+ }
+ }
+
+ GDOverflowCheck(18);
+
+ J3DGDWriteCPCmd(0x70 + fmt,
+ (posCompCnt << 0) | (posCompType << 1) | (posCompShift << 4) |
+ (nrmCompCnt << 9) | (nrmCompType << 10) |
+ (clr0CompCnt << 13) | (clr0CompType << 14) |
+ (clr1CompCnt << 17) | (clr1CompType << 18) |
+ (tex0CompCnt << 21) | (tex0CompType << 22) | (tex0CompShift << 25) |
+ (1 << 30) | (nbt3 << 31));
+
+ J3DGDWriteCPCmd(0x80 + fmt,
+ (tex1CompCnt << 0) | (tex1CompType << 1) | (tex1CompShift << 4) |
+ (tex2CompCnt << 9) | (tex2CompType << 10) | (tex2CompShift << 13) |
+ (tex3CompCnt << 18) | (tex3CompType << 19) | (tex3CompShift << 22) |
+ (tex4CompCnt << 27) | (tex4CompType << 28) |
+ (1 << 31));
+
+ J3DGDWriteCPCmd(0x90 + fmt,
+ (tex4CompShift << 0) |
+ (tex5CompCnt << 5) | (tex5CompType << 6) | (tex5CompShift << 9) |
+ (tex6CompCnt << 14) | (tex6CompType << 15) | (tex6CompShift << 18) |
+ (tex7CompCnt << 23) | (tex7CompType << 24) | (tex7CompShift << 27));
}
/* 802D702C-802D71FC .text J3DGDSetTexCoordGen__F13_GXTexGenType12_GXTexGenSrc */
-void J3DGDSetTexCoordGen(GXTexGenType, GXTexGenSrc) {
- /* Nonmatching */
+void J3DGDSetTexCoordGen(GXTexGenType type, GXTexGenSrc src) {
+ u32 form = 0;
+ u32 proj = 0;
+ u32 row = 5;
+ u32 embossSrc = 5;
+ u32 embossLight = 0;
+
+ switch (src) {
+ case GX_TG_POS: row = 0; form = 1; break;
+ case GX_TG_NRM: row = 1; form = 1; break;
+ case GX_TG_BINRM: row = 3; form = 1; break;
+ case GX_TG_TANGENT: row = 4; form = 1; break;
+ case GX_TG_COLOR0: row = 2; break;
+ case GX_TG_COLOR1: row = 2; break;
+ case GX_TG_TEX0: row = 5; break;
+ case GX_TG_TEX1: row = 6; break;
+ case GX_TG_TEX2: row = 7; break;
+ case GX_TG_TEX3: row = 8; break;
+ case GX_TG_TEX4: row = 9; break;
+ case GX_TG_TEX5: row = 10; break;
+ case GX_TG_TEX6: row = 11; break;
+ case GX_TG_TEX7: row = 12; break;
+ case GX_TG_TEXCOORD0: embossSrc = 0; break;
+ case GX_TG_TEXCOORD1: embossSrc = 1; break;
+ case GX_TG_TEXCOORD2: embossSrc = 2; break;
+ case GX_TG_TEXCOORD3: embossSrc = 3; break;
+ case GX_TG_TEXCOORD4: embossSrc = 4; break;
+ case GX_TG_TEXCOORD5: embossSrc = 5; break;
+ case GX_TG_TEXCOORD6: embossSrc = 6; break;
+ }
+
+ switch (type) {
+ case GX_TG_MTX2x4: src = (GXTexGenSrc) 0; break;
+ case GX_TG_MTX3x4: src = (GXTexGenSrc) 0; proj = 1; break;
+ case GX_TG_BUMP0:
+ case GX_TG_BUMP1:
+ case GX_TG_BUMP2:
+ case GX_TG_BUMP3:
+ case GX_TG_BUMP4:
+ case GX_TG_BUMP5:
+ case GX_TG_BUMP6:
+ case GX_TG_BUMP7:
+ src = (GXTexGenSrc) 1;
+ embossLight = type - GX_TG_BUMP0;
+ break;
+ case GX_TG_SRTG:
+ if (src == GX_TG_COLOR0)
+ src = (GXTexGenSrc) 2;
+ else
+ src = (GXTexGenSrc) 3;
+ break;
+ }
+
+ J3DGDWrite_u32((proj << 1) | (form << 2) | (src << 4) | (row << 7) | (embossSrc << 12) | (embossLight << 15));
}
/* 802D71FC-802D7400 .text J3DGDSetTexCoordScale2__F13_GXTexCoordIDUsUcUcUsUcUc */