diff options
Diffstat (limited to 'libs/JSystem/J3DGraphBase')
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DGD.cpp | 226 | ||||
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DMatBlock.cpp | 274 | ||||
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DMaterial.cpp | 37 | ||||
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DPacket.cpp | 30 | ||||
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DShape.cpp | 19 | ||||
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DTevs.cpp | 72 | ||||
| -rw-r--r-- | libs/JSystem/J3DGraphBase/J3DTransform.cpp | 272 |
7 files changed, 526 insertions, 404 deletions
diff --git a/libs/JSystem/J3DGraphBase/J3DGD.cpp b/libs/JSystem/J3DGraphBase/J3DGD.cpp index 927cd214c1..7f65db79a5 100644 --- a/libs/JSystem/J3DGraphBase/J3DGD.cpp +++ b/libs/JSystem/J3DGraphBase/J3DGD.cpp @@ -5,6 +5,7 @@ #include "JSystem/J3DGraphBase/J3DGD.h"
#include "dol2asm.h"
+#include "dolphin/gd.h"
#include "dolphin/os.h"
//
@@ -74,8 +75,8 @@ void J3DGDSetGenMode(u8 texGenNum, u8 colorChanNum, u8 tevStageNum, u8 indTexSta GDOverflowCheck(0xa);
J3DGDWriteBPCmd(0xfe07fc3f);
static u8 cm2hw[4] = {0, 2, 1, 3};
- J3DGDWriteBPCmd(texGenNum | colorChanNum << 4 | (tevStageNum - 1) << 0xa
- | cm2hw[cullMode] << 0xe | indTexStageNum << 0x10);
+ J3DGDWriteBPCmd(texGenNum | colorChanNum << 4 | (tevStageNum - 1) << 0xa |
+ cm2hw[cullMode] << 0xe | indTexStageNum << 0x10);
}
/* 8030D210-8030D364 307B50 0154+00 0/0 1/1 0/0 .text J3DGDSetGenMode_3Param__FUcUcUc */
@@ -86,48 +87,40 @@ void J3DGDSetGenMode_3Param(u8 texGenNum, u8 tevStageNum, u8 indTexStageNum) { }
/* 8030D364-8030D65C 307CA4 02F8+00 0/0 1/1 0/0 .text J3DGDSetLightAttn__F10_GXLightIDffffff */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DGDSetLightAttn(_GXLightID param_0, f32 param_1, f32 param_2, f32 param_3, f32 param_4,
- f32 param_5, f32 param_6) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DGD/J3DGDSetLightAttn__F10_GXLightIDffffff.s"
+void J3DGDSetLightAttn(GXLightID id, f32 a0, f32 a1, f32 a2, f32 k0, f32 k1, f32 k2) {
+ J3DGDWriteXFCmdHdr(0x0604 + __GDLightID2Offset(id), 6);
+ J3DGDWrite_f32(a0);
+ J3DGDWrite_f32(a1);
+ J3DGDWrite_f32(a2);
+ J3DGDWrite_f32(k0);
+ J3DGDWrite_f32(k1);
+ J3DGDWrite_f32(k2);
}
-#pragma pop
/* 8030D65C-8030D76C 307F9C 0110+00 0/0 1/1 0/0 .text J3DGDSetLightColor__F10_GXLightID8_GXColor
*/
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DGDSetLightColor(_GXLightID param_0, _GXColor param_1) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DGD/J3DGDSetLightColor__F10_GXLightID8_GXColor.s"
+void J3DGDSetLightColor(GXLightID id, GXColor color) {
+ J3DGDWriteXFCmd(0x0603 + __GDLightID2Offset(id),
+ (color.r << 24) | (color.g << 16) | (color.b << 8) | (color.a << 0));
}
-#pragma pop
/* 8030D76C-8030D938 3080AC 01CC+00 0/0 1/1 0/0 .text J3DGDSetLightPos__F10_GXLightIDfff
*/
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DGDSetLightPos(_GXLightID param_0, f32 param_1, f32 param_2, f32 param_3) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DGD/J3DGDSetLightPos__F10_GXLightIDfff.s"
+void J3DGDSetLightPos(GXLightID id, f32 x, f32 y, f32 z) {
+ J3DGDWriteXFCmdHdr(0x060A + __GDLightID2Offset(id), 3);
+ J3DGDWrite_f32(x);
+ J3DGDWrite_f32(y);
+ J3DGDWrite_f32(z);
}
-#pragma pop
/* 8030D938-8030DB04 308278 01CC+00 0/0 1/1 0/0 .text J3DGDSetLightDir__F10_GXLightIDfff
*/
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DGDSetLightDir(_GXLightID param_0, f32 param_1, f32 param_2, f32 param_3) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DGD/J3DGDSetLightDir__F10_GXLightIDfff.s"
+void J3DGDSetLightDir(GXLightID id, f32 x, f32 y, f32 z) {
+ J3DGDWriteXFCmdHdr(0x060D + __GDLightID2Offset(id), 3);
+ J3DGDWrite_f32(x);
+ J3DGDWrite_f32(y);
+ J3DGDWrite_f32(z);
}
-#pragma pop
/* 8030DB04-8030E064 308444 0560+00 1/0 1/1 0/0 .text
* J3DGDSetVtxAttrFmtv__F9_GXVtxFmtPC17_GXVtxAttrFmtListb */
@@ -239,17 +232,19 @@ void J3DGDSetVtxAttrFmtv(GXVtxFmt fmt, GXVtxAttrFmtList const* fmtList, bool par }
}
GDOverflowCheck(0x12);
- J3DGDWriteCPCmd(GX_CP_REG_VAT_GRP0 + fmt, pos_cnt | pos_type << 1 | pos_shift << 4
- | nrm_cnt << 9 | nrm_type << 0xa | clr0_cnt << 0xd | clr0_type << 0xe | clr1_cnt << 0x11
- | clr1_type << 0x12 | tex0_cnt << 0x15 | tex0_type << 0x16 | tex0_shift << 0x19
- | 0x40000000 | local_34 << 0x1f);
- J3DGDWriteCPCmd(GX_CP_REG_VAT_GRP1 + fmt, tex1_cnt | tex1_type << 1 | tex1_shift << 4
- | tex2_cnt << 9 | tex2_type << 0xa | tex2_shift << 0xd | tex3_cnt << 0x12
- | tex3_type << 0x13 | tex3_shift << 0x16 | tex4_cnt << 0x1b | tex4_type << 0x1c
- | 0x80000000);
- J3DGDWriteCPCmd(GX_CP_REG_VAT_GRP2 + fmt, tex4_shift | tex5_cnt << 5 | tex5_type << 6
- | tex5_shift << 9 | tex6_cnt << 0xe | tex6_type << 0xf | tex6_shift << 0x12
- | tex7_cnt << 0x17 | tex7_type << 0x18 | tex7_shift << 0x1b);
+ J3DGDWriteCPCmd(GX_CP_REG_VAT_GRP0 + fmt,
+ pos_cnt | pos_type << 1 | pos_shift << 4 | nrm_cnt << 9 | nrm_type << 0xa |
+ clr0_cnt << 0xd | clr0_type << 0xe | clr1_cnt << 0x11 | clr1_type << 0x12 |
+ tex0_cnt << 0x15 | tex0_type << 0x16 | tex0_shift << 0x19 | 0x40000000 |
+ local_34 << 0x1f);
+ J3DGDWriteCPCmd(GX_CP_REG_VAT_GRP1 + fmt,
+ tex1_cnt | tex1_type << 1 | tex1_shift << 4 | tex2_cnt << 9 | tex2_type << 0xa |
+ tex2_shift << 0xd | tex3_cnt << 0x12 | tex3_type << 0x13 |
+ tex3_shift << 0x16 | tex4_cnt << 0x1b | tex4_type << 0x1c | 0x80000000);
+ J3DGDWriteCPCmd(GX_CP_REG_VAT_GRP2 + fmt,
+ tex4_shift | tex5_cnt << 5 | tex5_type << 6 | tex5_shift << 9 |
+ tex6_cnt << 0xe | tex6_type << 0xf | tex6_shift << 0x12 | tex7_cnt << 0x17 |
+ tex7_type << 0x18 | tex7_shift << 0x1b);
}
/* 8030E064-8030E234 3089A4 01D0+00 1/0 1/1 0/0 .text
@@ -358,23 +353,22 @@ void J3DGDSetTexCoordGen(GXTexGenType texGenType, GXTexGenSrc texGenSrc) { break;
}
J3DGDWrite_u32(
- proj_type << (31 - GX_XF_TEX_PROJTYPE_END)
- | input_form << (31 - GX_XF_TEX_INPUTFORM_END)
- | texgen_type << (31 - GX_XF_TEX_TEXGENTYPE_END)
- | src_row << (31 - GX_XF_TEX_SRCROW_END)
- | bump_src_tex << (31 - GX_XF_TEX_BUMPSRCTEX_END)
- | bump_src_light << (31 - GX_XF_TEX_BUMPSRCLIGHT_END)
- );
+ proj_type << (31 - GX_XF_TEX_PROJTYPE_END) | input_form << (31 - GX_XF_TEX_INPUTFORM_END) |
+ texgen_type << (31 - GX_XF_TEX_TEXGENTYPE_END) | src_row << (31 - GX_XF_TEX_SRCROW_END) |
+ bump_src_tex << (31 - GX_XF_TEX_BUMPSRCTEX_END) |
+ bump_src_light << (31 - GX_XF_TEX_BUMPSRCLIGHT_END));
}
/* 8030E234-8030E438 308B74 0204+00 0/0 16/16 0/0 .text
* J3DGDSetTexCoordScale2__F13_GXTexCoordIDUsUcUcUsUcUc */
-void J3DGDSetTexCoordScale2(GXTexCoordID param_0, u16 param_1, u8 param_2, u8 param_3,
- u16 param_4, u8 param_5, u8 param_6) {
+void J3DGDSetTexCoordScale2(GXTexCoordID param_0, u16 param_1, u8 param_2, u8 param_3, u16 param_4,
+ u8 param_5, u8 param_6) {
GDOverflowCheck(0xf);
J3DGDWriteBPCmd(0xfe03ffff);
- J3DGDWriteBPCmd((param_1 - 1) | param_2 << 0x10 | param_3 << 0x11 | (param_0 * 2 + 0x30) << 0x18);
- J3DGDWriteBPCmd((param_4 - 1) | param_5 << 0x10 | param_6 << 0x11 | (param_0 * 2 + 0x31) << 0x18);
+ J3DGDWriteBPCmd((param_1 - 1) | param_2 << 0x10 | param_3 << 0x11 |
+ (param_0 * 2 + 0x30) << 0x18);
+ J3DGDWriteBPCmd((param_4 - 1) | param_5 << 0x10 | param_6 << 0x11 |
+ (param_0 * 2 + 0x31) << 0x18);
}
/* 8045090C-80450914 00038C 0008+00 1/1 0/0 0/0 .sdata J3DGDTexMode0Ids */
@@ -413,18 +407,19 @@ static u8 GX2HWFiltConv[6] = { void J3DGDSetTexLookupMode(GXTexMapID param_0, GXTexWrapMode param_1, GXTexWrapMode param_2,
GXTexFilter param_3, GXTexFilter param_4, f32 param_5, f32 param_6,
f32 param_7, u8 param_8, u8 param_9, GXAnisotropy param_10) {
- J3DGDWriteBPCmd(param_1 | param_2 << 2 | (param_4 == GX_LINEAR) << 4
- | GX2HWFiltConv[param_3] << 5 | (param_9 == 0) << 8 | ((int)(param_7 * 32.0f) & 0xff) << 9
- | param_10 << 0x13 | param_8 << 0x15 | J3DGDTexMode0Ids[param_0] << 0x18);
- J3DGDWriteBPCmd(((int)(param_5 * 16.0f) & 0xff) | ((int)(param_6 * 16.0f) & 0xff) << 8
- | J3DGDTexMode1Ids[param_0] << 0x18);
+ J3DGDWriteBPCmd(param_1 | param_2 << 2 | (param_4 == GX_LINEAR) << 4 |
+ GX2HWFiltConv[param_3] << 5 | (param_9 == 0) << 8 |
+ ((int)(param_7 * 32.0f) & 0xff) << 9 | param_10 << 0x13 | param_8 << 0x15 |
+ J3DGDTexMode0Ids[param_0] << 0x18);
+ J3DGDWriteBPCmd(((int)(param_5 * 16.0f) & 0xff) | ((int)(param_6 * 16.0f) & 0xff) << 8 |
+ J3DGDTexMode1Ids[param_0] << 0x18);
}
/* 8030E5D4-8030E67C 308F14 00A8+00 0/0 1/1 0/0 .text
* J3DGDSetTexImgAttr__F11_GXTexMapIDUsUs9_GXTexFmt */
void J3DGDSetTexImgAttr(GXTexMapID param_0, u16 param_1, u16 param_2, GXTexFmt param_3) {
- J3DGDWriteBPCmd((param_1 - 1) | (param_2 - 1) << 0xa | param_3 << 0x14
- | J3DGDTexImage0Ids[param_0] << 0x18);
+ J3DGDWriteBPCmd((param_1 - 1) | (param_2 - 1) << 0xa | param_3 << 0x14 |
+ J3DGDTexImage0Ids[param_0] << 0x18);
}
/* 8030E67C-8030E70C 308FBC 0090+00 0/0 1/1 0/0 .text J3DGDSetTexImgPtr__F11_GXTexMapIDPv
@@ -456,58 +451,53 @@ void J3DGDLoadTlut(void* param_0, u32 param_1, GXTlutSize param_2) { J3DGDWriteBPCmd(0x0f000000);
}
-/* ############################################################################################## */
-/* 80456330-80456334 004930 0004+00 1/1 0/0 0/0 .sdata2 @1233 */
-SECTION_SDATA2 static f32 lit_1233 = 1024.0f;
-
/* 8030EB30-8030EE10 309470 02E0+00 0/0 2/2 0/0 .text J3DGDSetIndTexMtx__F14_GXIndTexMtxIDPA3_fSc
*/
-#ifdef NONMATCHING
-void J3DGDSetIndTexMtx(GXIndTexMtxID mtxID, Mtx3P mtx, s8 param_2) {
+void J3DGDSetIndTexMtx(GXIndTexMtxID id, Mtx3P mtx, s8 exp) {
+ s32 mtx32[6];
u32 idx;
- switch (mtxID) {
+
+ switch (id) {
case GX_ITM_0:
case GX_ITM_1:
case GX_ITM_2:
- idx = mtxID - GX_ITM_0;
+ idx = (u32)(id - GX_ITM_0);
break;
case GX_ITM_S0:
case GX_ITM_S1:
case GX_ITM_S2:
- idx = mtxID - GX_ITM_S0;
+ idx = (u32)(id - GX_ITM_S0);
break;
case GX_ITM_T0:
case GX_ITM_T1:
case GX_ITM_T2:
- idx = mtxID - GX_ITM_T0;
+ idx = (u32)(id - GX_ITM_T0);
break;
- case GX_ITM_3:
- case GX_ITM_S3:
default:
idx = 0;
break;
}
- u32 m00 = (int)(mtx[0][0] * 1024.0f) & 0x7ff;
- u32 m10 = (int)(mtx[1][0] * 1024.0f) & 0x7ff;
- u32 m01 = (int)(mtx[0][1] * 1024.0f) & 0x7ff;
- u32 m11 = (int)(mtx[1][1] * 1024.0f) & 0x7ff;
- u32 m02 = (int)(mtx[0][2] * 1024.0f) & 0x7ff;
- u32 m12 = (int)(mtx[1][2] * 1024.0f) & 0x7ff;
- GDOverflowCheck(0xf);
- J3DGDWriteBPCmd(m00 | m10 << 0xb | ((param_2 + 0x11) & 3) << 0x16 | (idx * 3 + GX_BP_REG_INDMTX0A) << 0x18);
- J3DGDWriteBPCmd(m01 | m11 << 0xb | ((param_2 + 0x11) >> 2 & 3) << 0x16 | (idx * 3 + GX_BP_REG_INDMTX0B) << 0x18);
- J3DGDWriteBPCmd(m02 | m12 << 0xb | ((param_2 + 0x11) >> 4 & 3) << 0x16 | (idx * 3 + GX_BP_REG_INDMTX0C) << 0x18);
-}
-#else
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DGDSetIndTexMtx(_GXIndTexMtxID param_0, f32 (*param_1)[3], s8 param_2) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DGD/J3DGDSetIndTexMtx__F14_GXIndTexMtxIDPA3_fSc.s"
+
+ exp += 17;
+
+ mtx32[0] = (s32)(mtx[0][0] * 1024.0f) & 0x7FF;
+ mtx32[1] = (s32)(mtx[1][0] * 1024.0f) & 0x7FF;
+
+ mtx32[2] = (s32)(mtx[0][1] * 1024.0f) & 0x7FF;
+ mtx32[3] = (s32)(mtx[1][1] * 1024.0f) & 0x7FF;
+
+ mtx32[4] = (s32)(mtx[0][2] * 1024.0f) & 0x7FF;
+ mtx32[5] = (s32)(mtx[1][2] * 1024.0f) & 0x7FF;
+
+ GDOverflowCheck(15);
+
+ J3DGDWriteBPCmd((mtx32[0] << 0) | (mtx32[1] << 11) | (((exp >> 0) & 0x03) << 22) |
+ (0x06 + idx * 3) << 24);
+ J3DGDWriteBPCmd((mtx32[2] << 0) | (mtx32[3] << 11) | (((exp >> 2) & 0x03) << 22) |
+ (0x07 + idx * 3) << 24);
+ J3DGDWriteBPCmd((mtx32[4] << 0) | (mtx32[5] << 11) | (((exp >> 4) & 0x03) << 22) |
+ (0x08 + idx * 3) << 24);
}
-#pragma pop
-#endif
/* 8030EE10-8030EF08 309750 00F8+00 0/0 2/2 0/0 .text
* J3DGDSetIndTexCoordScale__F16_GXIndTexStageID14_GXIndTexScale14_GXIndTexScale14_GXIndTexScale14_GXIndTexScale
@@ -515,20 +505,20 @@ asm void J3DGDSetIndTexMtx(_GXIndTexMtxID param_0, f32 (*param_1)[3], s8 param_2 void J3DGDSetIndTexCoordScale(GXIndTexStageID stage, GXIndTexScale scale0, GXIndTexScale scale1,
GXIndTexScale scale2, GXIndTexScale scale3) {
GDOverflowCheck(5);
- J3DGDWriteBPCmd(scale0 | scale1 << 4 | scale2 << 8 | scale3 << 0xc
- | ((stage >> 1) + GX_BP_REG_RAS1_SS0) << 0x18);
+ J3DGDWriteBPCmd(scale0 | scale1 << 4 | scale2 << 8 | scale3 << 0xc |
+ ((stage >> 1) + GX_BP_REG_RAS1_SS0) << 0x18);
}
/* 8030EF08-8030F108 309848 0200+00 0/0 2/2 0/0 .text
* J3DGDSetIndTexOrder__FUl13_GXTexCoordID11_GXTexMapID13_GXTexCoordID11_GXTexMapID13_GXTexCoordID11_GXTexMapID13_GXTexCoordID11_GXTexMapID
*/
-void J3DGDSetIndTexOrder(u32 count, GXTexCoordID coord0, GXTexMapID map0,
- GXTexCoordID coord1, GXTexMapID map1, GXTexCoordID coord2,
- GXTexMapID map2, GXTexCoordID coord3, GXTexMapID map3) {
+void J3DGDSetIndTexOrder(u32 count, GXTexCoordID coord0, GXTexMapID map0, GXTexCoordID coord1,
+ GXTexMapID map1, GXTexCoordID coord2, GXTexMapID map2, GXTexCoordID coord3,
+ GXTexMapID map3) {
GDOverflowCheck(0xa);
- J3DGDWriteBPCmd(map0 & 7 | (coord0 & 7) << 3 | (map1 & 7) << 6 | (coord1 & 7) << 9
- | (map2 & 7) << 0xc | (coord2 & 7) << 0xf | (map3 & 7) << 0x12 | (coord3 & 7) << 0x15
- | GX_BP_REG_RAS1_IREF << 0x18);
+ J3DGDWriteBPCmd(map0 & 7 | (coord0 & 7) << 3 | (map1 & 7) << 6 | (coord1 & 7) << 9 |
+ (map2 & 7) << 0xc | (coord2 & 7) << 0xf | (map3 & 7) << 0x12 |
+ (coord3 & 7) << 0x15 | GX_BP_REG_RAS1_IREF << 0x18);
u32 imask = 0;
for (u32 i = 0; i < count; i++) {
switch (i) {
@@ -559,12 +549,12 @@ void J3DGDSetTevOrder(GXTevStageID stage, GXTexCoordID coord0, GXTexMapID map0, coord1 = coord1 >= GX_MAXCOORD ? GX_TEXCOORD0 : coord1;
GDOverflowCheck(5);
static u8 c2r[32] = {0, 1, 0, 1, 0, 1, 7, 5, 6, 0, 0, 0, 0, 0, 0, 7,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- J3DGDWriteBPCmd((map0 & 7) | coord0 << 3
- | (map0 != GX_TEXMAP_NULL && !(map0 & GX_TEXMAP_DISABLE)) << 6 | c2r[channel0 & 0xf] << 7
- | (map1 & 7) << 0xc | coord1 << 0xf
- | (map1 != GX_TEXMAP_NULL && !(map1 & GX_TEXMAP_DISABLE)) << 0x12
- | c2r[channel1 & 0xf] << 0x13 | (stage / 2 + GX_BP_REG_RAS1_TREF0) << 0x18);
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ J3DGDWriteBPCmd((map0 & 7) | coord0 << 3 |
+ (map0 != GX_TEXMAP_NULL && !(map0 & GX_TEXMAP_DISABLE)) << 6 |
+ c2r[channel0 & 0xf] << 7 | (map1 & 7) << 0xc | coord1 << 0xf |
+ (map1 != GX_TEXMAP_NULL && !(map1 & GX_TEXMAP_DISABLE)) << 0x12 |
+ c2r[channel1 & 0xf] << 0x13 | (stage / 2 + GX_BP_REG_RAS1_TREF0) << 0x18);
}
/* 8030F294-8030F3FC 309BD4 0168+00 0/0 11/11 0/0 .text
@@ -580,10 +570,10 @@ void J3DGDSetTevKColor(GXTevKColorID id, GXColor color) { /* 8030F3FC-8030F630 309D3C 0234+00 0/0 11/11 0/0 .text
* J3DGDSetTevColorS10__F11_GXTevRegID11_GXColorS10 */
void J3DGDSetTevColorS10(GXTevRegID id, GXColorS10 color) {
- u32 cmd0 = (color.r & 0x7ff) | (color.a & 0x7ff) << 0xc
- | (id * 2 + GX_BP_REG_TEVREG0LO) << 0x18;
- u32 cmd1 = (color.b & 0x7ff) | (color.g & 0x7ff) << 0xc
- | (id * 2 + GX_BP_REG_TEVREG0HI) << 0x18;
+ u32 cmd0 =
+ (color.r & 0x7ff) | (color.a & 0x7ff) << 0xc | (id * 2 + GX_BP_REG_TEVREG0LO) << 0x18;
+ u32 cmd1 =
+ (color.b & 0x7ff) | (color.g & 0x7ff) << 0xc | (id * 2 + GX_BP_REG_TEVREG0HI) << 0x18;
GDOverflowCheck(0x14);
J3DGDWriteBPCmd(cmd0);
J3DGDWriteBPCmd(cmd1);
@@ -626,8 +616,8 @@ void J3DGDSetFog(GXFogType fogType, f32 param_1, f32 param_2, f32 nearZ, f32 far void J3DGDSetFogRangeAdj(u8 param_0, u16 param_1, GXFogAdjTable* table) {
if (param_0 != 0) {
for (int i = 0; i < 0xa; i += 2) {
- J3DGDWriteBPCmd((i / 2 + GX_BP_REG_FOGRANGEK0) << 0x18
- | table->fogVals[i + 1] << 0xc | table->fogVals[i]);
+ J3DGDWriteBPCmd((i / 2 + GX_BP_REG_FOGRANGEK0) << 0x18 | table->fogVals[i + 1] << 0xc |
+ table->fogVals[i]);
}
}
u32 cmd = GX_BP_REG_FOGRANGE << 0x18 | (param_1 + 0x156) | param_0 << 0xa;
@@ -728,13 +718,13 @@ SECTION_SDATA static u8 J3DTexImage2Ids[8] = { /* 8030FD68-8030FDE8 30A6A8 0080+00 0/0 1/1 0/0 .text
* J3DFifoLoadTexCached__F11_GXTexMapIDUl15_GXTexCacheSizeUl15_GXTexCacheSize */
#ifdef NONMATCHING
-void J3DFifoLoadTexCached(GXTexMapID id, u32 param_1, GXTexCacheSize param_2,
- u32 param_3, GXTexCacheSize param_4) {
- J3DFifoLoadBPCmd(param_1 >> 5 | (param_2 + 3) << 0xf | (param_2 + 3) << 0x12
- | J3DTexImage1Ids[id] << 0x18);
+void J3DFifoLoadTexCached(GXTexMapID id, u32 param_1, GXTexCacheSize param_2, u32 param_3,
+ GXTexCacheSize param_4) {
+ J3DFifoLoadBPCmd(param_1 >> 5 | (param_2 + 3) << 0xf | (param_2 + 3) << 0x12 |
+ J3DTexImage1Ids[id] << 0x18);
if (param_4 != GX_TEXCACHE_NONE && param_3 < 0x100000) {
- J3DFifoLoadBPCmd(param_3 >> 5 | (param_4 + 3) << 0xf | (param_4 + 3) << 0x12
- | J3DTexImage2Ids[id] << 0x18);
+ J3DFifoLoadBPCmd(param_3 >> 5 | (param_4 + 3) << 0xf | (param_4 + 3) << 0x12 |
+ J3DTexImage2Ids[id] << 0x18);
}
}
#else
diff --git a/libs/JSystem/J3DGraphBase/J3DMatBlock.cpp b/libs/JSystem/J3DGraphBase/J3DMatBlock.cpp index 8d6b960332..1754afff5e 100644 --- a/libs/JSystem/J3DGraphBase/J3DMatBlock.cpp +++ b/libs/JSystem/J3DGraphBase/J3DMatBlock.cpp @@ -4,16 +4,35 @@ // #include "JSystem/J3DGraphBase/J3DMatBlock.h" +#include "dolphin/gd.h" +#include "JSystem/J3DGraphBase/J3DGD.h" +#include "JSystem/J3DGraphBase/J3DSys.h" #include "dol2asm.h" #include "dolphin/os.h" -// -// Types: -// +inline void loadMatColors(const J3DGXColor* color) { + J3DGDWriteXFCmdHdr(0x100C, 2); + J3DGDWrite_u32(*(u32*)color); + J3DGDWrite_u32(*(u32*)(color + 1)); +} -struct J3DSys { - static u8 sTexCoordScaleTable[64 + 4 /* padding */]; -}; +inline void loadAmbColors(const J3DGXColor* color) { + J3DGDWriteXFCmdHdr(0x100A, 2); + J3DGDWrite_u32(*(u32*)color); + J3DGDWrite_u32(*(u32*)(color + 1)); +} + +inline void loadTexCoordScale(GXTexCoordID coord, const J3DTexCoordScaleInfo& info) { + J3DGDSetTexCoordScale2(coord, info.field_0x00, info.field_0x04 == 1, 0, info.field_0x02, info.field_0x06 == 1, 0); +} + +inline void loadTevColor(u32 reg, const J3DGXColorS10& color) { + J3DGDSetTevColorS10(GXTevRegID(reg + 1), color); +} + +inline void loadTevKColor(u32 reg, const J3DGXColor& color) { + J3DGDSetTevKColor(GXTevKColorID(reg), color); +} // // Forward References: @@ -591,12 +610,10 @@ extern "C" extern void* __vt__10J3DPEBlock[31]; extern "C" extern void* __vt__11J3DIndBlock[19]; extern "C" extern void* __vt__14J3DTexGenBlock[27]; extern "C" extern void* __vt__13J3DColorBlock[36]; -extern "C" extern u8 j3dSys[284]; extern "C" u8 sTexCoordScaleTable__6J3DSys[64 + 4 /* padding */]; extern "C" extern u8 j3dTevSwapTableTable[1024]; extern "C" extern u8 j3dAlphaCmpTable[768]; extern "C" extern u8 j3dZModeTable[96]; -extern "C" extern u8 __GDCurrentDL[4]; extern "C" extern GXColor j3dDefaultColInfo; extern "C" extern u32 j3dDefaultAmbInfo; extern "C" extern GXColorS10 j3dDefaultTevColor; @@ -637,45 +654,34 @@ asm void J3DColorBlockLightOn::initialize() { #pragma pop /* 80317644-80317674 311F84 0030+00 0/0 2/2 0/0 .text initialize__21J3DTexGenBlockPatchedFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTexGenBlockPatched::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__21J3DTexGenBlockPatchedFv.s" +void J3DTexGenBlockPatched::initialize() { + mTexGenNum = 0; + for (u32 i = 0; i < 8; i++) + mTexMtx[i] = NULL; + mTexMtxOffset = 0; } -#pragma pop /* 80317674-803176A4 311FB4 0030+00 0/0 1/1 0/0 .text initialize__15J3DTexGenBlock4Fv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTexGenBlock4::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__15J3DTexGenBlock4Fv.s" +void J3DTexGenBlock4::initialize() { + mTexGenNum = 0; + for (u32 i = 0; i < 4; i++) + mTexMtx[i] = NULL; + mTexMtxOffset = 0; } -#pragma pop /* 803176A4-803176D4 311FE4 0030+00 0/0 1/1 0/0 .text initialize__19J3DTexGenBlockBasicFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTexGenBlockBasic::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__19J3DTexGenBlockBasicFv.s" +void J3DTexGenBlockBasic::initialize() { + mTexGenNum = 0; + for (u32 i = 0; i < 8; i++) + mTexMtx[i] = NULL; + mTexMtxOffset = 0; } -#pragma pop /* 803176D4-803176E0 312014 000C+00 0/0 1/1 0/0 .text initialize__15J3DTevBlockNullFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTevBlockNull::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__15J3DTevBlockNullFv.s" +void J3DTevBlockNull::initialize() { + mTexNoOffset = 0; } -#pragma pop /* 803176E0-803177E8 312020 0108+00 0/0 1/1 0/0 .text initialize__18J3DTevBlockPatchedFv */ @@ -689,14 +695,12 @@ asm void J3DTevBlockPatched::initialize() { #pragma pop /* 803177E8-80317810 312128 0028+00 0/0 1/1 0/0 .text initialize__12J3DTevBlock1Fv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTevBlock1::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__12J3DTevBlock1Fv.s" +void J3DTevBlock1::initialize() { + mTexNo[0] = 0xFFFF; + mTevStage[0].field_0x0 = 0xC0; + mTevStage[0].field_0x4 = 0xC1; + mTexNoOffset = 0; } -#pragma pop /* 80317810-803178EC 312150 00DC+00 0/0 1/1 0/0 .text initialize__12J3DTevBlock2Fv */ #pragma push @@ -729,34 +733,26 @@ asm void J3DTevBlock16::initialize() { #pragma pop /* 80317B28-80317B34 312468 000C+00 0/0 1/1 0/0 .text initialize__15J3DIndBlockFullFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DIndBlockFull::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__15J3DIndBlockFullFv.s" +void J3DIndBlockFull::initialize() { + mIndTexStageNum = 0; } -#pragma pop /* 80317B34-80317B58 312474 0024+00 0/0 1/1 0/0 .text initialize__16J3DPEBlockFogOffFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DPEBlockFogOff::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__16J3DPEBlockFogOffFv.s" +void J3DPEBlockFogOff::initialize() { + mAlphaComp.mID = 0xFFFF; + mZMode.mZModeID = 0xFFFF; + mZCompLoc = 0xFF; + mDither = 1; } -#pragma pop /* 80317B58-80317B84 312498 002C+00 0/0 1/1 0/0 .text initialize__14J3DPEBlockFullFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DPEBlockFull::initialize() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/initialize__14J3DPEBlockFullFv.s" +void J3DPEBlockFull::initialize() { + mAlphaComp.mID = 0xFFFF; + mZMode.mZModeID = 0xFFFF; + mZCompLoc = 0xFF; + mDither = 1; + mFogOffset = 0; } -#pragma pop /* 80317B84-80317B8C 3124C4 0008+00 1/0 0/0 0/0 .text countDLSize__21J3DColorBlockLightOffFv */ s32 J3DColorBlockLightOff::countDLSize() { @@ -905,14 +901,14 @@ asm void J3DColorBlockLightOff::patch() { SECTION_SDATA static u32 SizeOfLoadMatColors = 0x0000000D; /* 80318F00-803190AC 313840 01AC+00 2/0 0/0 0/0 .text patchMatColor__21J3DColorBlockLightOffFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOff::patchMatColor() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/patchMatColor__21J3DColorBlockLightOffFv.s" +void J3DColorBlockLightOff::patchMatColor() { + GDSetCurrOffset(mMatColorOffset); + u8* start = GDGetCurrPointer(); + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); + u8* end = GDGetCurrPointer(); + DCStoreRange(start, end - start); } -#pragma pop /* ############################################################################################## */ /* 80450964-80450968 0003E4 0004+00 2/2 0/0 0/0 .sdata SizeOfLoadAmbColors */ @@ -936,24 +932,20 @@ asm void J3DColorBlockLightOff::patchLight() { #pragma pop /* 803194E8-80319534 313E28 004C+00 1/0 0/0 0/0 .text patch__20J3DColorBlockLightOnFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOn::patch() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/patch__20J3DColorBlockLightOnFv.s" +void J3DColorBlockLightOn::patch() { + patchMatColor(); + patchLight(); } -#pragma pop /* 80319534-803196E0 313E74 01AC+00 1/0 0/0 0/0 .text patchMatColor__20J3DColorBlockLightOnFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOn::patchMatColor() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/patchMatColor__20J3DColorBlockLightOnFv.s" +void J3DColorBlockLightOn::patchMatColor() { + GDSetCurrOffset(mMatColorOffset); + u8* start = GDGetCurrPointer(); + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); + u8* end = GDGetCurrPointer(); + DCStoreRange(start, end - start); } -#pragma pop /* 803196E0-80319B4C 314020 046C+00 1/0 0/0 0/0 .text patchLight__20J3DColorBlockLightOnFv */ #pragma push @@ -966,24 +958,18 @@ asm void J3DColorBlockLightOn::patchLight() { #pragma pop /* 80319B4C-80319BB4 31448C 0068+00 2/0 0/0 0/0 .text diff__21J3DColorBlockLightOffFUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOff::diff(u32 param_0) { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/diff__21J3DColorBlockLightOffFUl.s" +void J3DColorBlockLightOff::diff(u32 flag) { + if (flag & 0x1) + diffMatColor(); + if (flag & 0x2) + diffColorChan(); } -#pragma pop /* 80319BB4-80319D30 3144F4 017C+00 2/0 0/0 0/0 .text diffMatColor__21J3DColorBlockLightOffFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOff::diffMatColor() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/diffMatColor__21J3DColorBlockLightOffFv.s" +void J3DColorBlockLightOff::diffMatColor() { + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); } -#pragma pop /* 80319D30-8031A13C 314670 040C+00 2/0 0/0 0/0 .text diffColorChan__21J3DColorBlockLightOffFv */ #pragma push @@ -996,34 +982,31 @@ asm void J3DColorBlockLightOff::diffColorChan() { #pragma pop /* 8031A13C-8031A1DC 314A7C 00A0+00 1/0 0/0 0/0 .text diff__20J3DColorBlockLightOnFUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOn::diff(u32 param_0) { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/diff__20J3DColorBlockLightOnFUl.s" +void J3DColorBlockLightOn::diff(u32 flag) { + if (flag & 4) + diffAmbColor(); + + if (flag & 1) + diffMatColor(); + + if (flag & 2) + diffColorChan(); + + if ((flag >> 4) & 0x0f) + diffLightObj((flag >> 4) & 0x0f); } -#pragma pop /* 8031A1DC-8031A358 314B1C 017C+00 1/0 0/0 0/0 .text diffAmbColor__20J3DColorBlockLightOnFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOn::diffAmbColor() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/diffAmbColor__20J3DColorBlockLightOnFv.s" +void J3DColorBlockLightOn::diffAmbColor() { + GDOverflowCheck(SizeOfLoadAmbColors); + loadAmbColors(mAmbColor); } -#pragma pop /* 8031A358-8031A4D4 314C98 017C+00 1/0 0/0 0/0 .text diffMatColor__20J3DColorBlockLightOnFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DColorBlockLightOn::diffMatColor() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/diffMatColor__20J3DColorBlockLightOnFv.s" +void J3DColorBlockLightOn::diffMatColor() { + GDOverflowCheck(SizeOfLoadMatColors); + loadMatColors(mMatColor); } -#pragma pop /* 8031A4D4-8031A8E0 314E14 040C+00 1/0 0/0 0/0 .text diffColorChan__20J3DColorBlockLightOnFv */ #pragma push @@ -1046,34 +1029,43 @@ asm void J3DColorBlockLightOn::diffLightObj(u32 param_0) { #pragma pop /* 8031A948-8031A9E8 315288 00A0+00 1/0 0/0 0/0 .text load__15J3DTexGenBlock4Fv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTexGenBlock4::load() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/load__15J3DTexGenBlock4Fv.s" +void J3DTexGenBlock4::load() { + mTexMtxOffset = GDGetCurrOffset(); + for (u32 i = 0; i < 4; i++) { + if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) { + mTexMtx[i]->load(i); + } + } + if (mTexGenNum != 0) { + loadTexCoordGens(mTexGenNum, mTexCoord); + } } -#pragma pop /* 8031A9E8-8031AA88 315328 00A0+00 1/0 0/0 0/0 .text load__19J3DTexGenBlockBasicFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTexGenBlockBasic::load() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/load__19J3DTexGenBlockBasicFv.s" +void J3DTexGenBlockBasic::load() { + mTexMtxOffset = GDGetCurrOffset(); + for (u32 i = 0; i < 8; i++) { + if (mTexMtx[i] && mTexCoord[i].getTexGenMtx() != GX_IDENTITY) { + mTexMtx[i]->load(i); + } + } + if (mTexGenNum != 0) { + loadTexCoordGens(mTexGenNum, mTexCoord); + } } -#pragma pop /* 8031AA88-8031AB18 3153C8 0090+00 1/0 0/0 0/0 .text patch__21J3DTexGenBlockPatchedFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DTexGenBlockPatched::patch() { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DMatBlock/patch__21J3DTexGenBlockPatchedFv.s" +void J3DTexGenBlockPatched::patch() { + GDSetCurrOffset(mTexMtxOffset); + u8* start = GDGetCurrPointer(); + for (u32 i = 0; i < 8; i++) { + if (mTexMtx[i]) { + mTexMtx[i]->load(i); + } + } + u8* end = GDGetCurrPointer(); + DCStoreRange(start, end - start); } -#pragma pop /* 8031AB18-8031ABC0 315458 00A8+00 1/0 0/0 0/0 .text patch__15J3DTexGenBlock4Fv */ #pragma push diff --git a/libs/JSystem/J3DGraphBase/J3DMaterial.cpp b/libs/JSystem/J3DGraphBase/J3DMaterial.cpp index 04e1367dac..ad853d22e0 100644 --- a/libs/JSystem/J3DGraphBase/J3DMaterial.cpp +++ b/libs/JSystem/J3DGraphBase/J3DMaterial.cpp @@ -491,37 +491,30 @@ J3DIndBlock* J3DMaterial::createIndBlock(int param_0) { /* 80315F60-80316100 3108A0 01A0+00 0/0 3/3 0/0 .text createPEBlock__11J3DMaterialFUlUl
*/
-// rv is in r5 for some reason
-#ifdef NONMATCHING
-J3DPEBlock* J3DMaterial::createPEBlock(u32 param_0, u32 param_1) {
+J3DPEBlock* J3DMaterial::createPEBlock(u32 createFlag, u32 materialMode) {
J3DPEBlock* rv = NULL;
- if (param_0 == 0) {
- if (param_1 & 1) {
- return new J3DPEBlockOpa();
- } else if (param_1 & 2) {
- return new J3DPEBlockTexEdge();
- } else if (param_1 & 4) {
- return new J3DPEBlockXlu();
+
+ if (createFlag == 0) {
+ if (materialMode & 1) {
+ rv = new J3DPEBlockOpa();
+ return rv;
+ } else if (materialMode & 2) {
+ rv = new J3DPEBlockTexEdge();
+ return rv;
+ } else if (materialMode & 4) {
+ rv = new J3DPEBlockXlu();
+ return rv;
}
}
- if (param_0 == 0x10000000) {
+ if (createFlag == 0x10000000) {
rv = new J3DPEBlockFull();
- } else if (param_0 == 0x20000000) {
+ } else if (createFlag == 0x20000000) {
rv = new J3DPEBlockFogOff();
}
+
return rv;
}
-#else
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm J3DPEBlock* J3DMaterial::createPEBlock(u32 param_0, u32 param_1) {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DMaterial/createPEBlock__11J3DMaterialFUlUl.s"
-}
-#pragma pop
-#endif
/* 80316100-80316150 310A40 0050+00 0/0 2/2 0/0 .text calcSizeColorBlock__11J3DMaterialFUl */
u32 J3DMaterial::calcSizeColorBlock(u32 param_0) {
diff --git a/libs/JSystem/J3DGraphBase/J3DPacket.cpp b/libs/JSystem/J3DGraphBase/J3DPacket.cpp index efb578acc3..79c510b0c0 100644 --- a/libs/JSystem/J3DGraphBase/J3DPacket.cpp +++ b/libs/JSystem/J3DGraphBase/J3DPacket.cpp @@ -1,31 +1,11 @@ -// -// Generated By: dol2asm -// Translation Unit: J3DPacket -// - #include "JSystem/J3DGraphBase/J3DPacket.h" #include "JSystem/J3DGraphAnimator/J3DModel.h" #include "JSystem/J3DGraphBase/J3DDrawBuffer.h" #include "JSystem/J3DGraphBase/J3DMaterial.h" #include "JSystem/JKernel/JKRHeap.h" -#include "string.h" -#include "dol2asm.h" #include "dolphin/os/OSCache.h" #include "dolphin/os/OSInterrupt.h" -#include "dolphin/types.h" -#include "global.h" - -// -// Forward References: -// - -// -// External References: -// - -// -// Declarations: -// +#include "string.h" J3DError J3DDisplayListObj::newDisplayList(u32 capacity) { mCapacity = ALIGN_NEXT(capacity, 0x20); @@ -138,12 +118,12 @@ void J3DPacket::addChildPacket(J3DPacket* pPacket) { /* ############################################################################################## */ /* 803CD900-803CD920 02AA20 0020+00 1/1 0/0 0/0 .data sDifferedRegister */ -SECTION_DATA static u32 sDifferedRegister[8] = { +static u32 sDifferedRegister[8] = { 0x00000004, 0x00000001, 0x00000002, 0x01000000, 0x10000000, 0x20000000, 0x02000000, 0x08000000, }; /* 803CD920-803CD940 02AA40 0020+00 1/1 0/0 0/0 .data sSizeOfDiffered */ -SECTION_DATA static s32 sSizeOfDiffered[8] = { +static s32 sSizeOfDiffered[8] = { 13, 13, 21, 120, 55, 15, 19, 45, }; @@ -353,7 +333,9 @@ void J3DShapePacket::prepareDraw() const { mpShape->offFlag(J3DShpFlag_SkinPosCpu); } - if (mpModel->checkFlag(J3DMdlFlag_SkinNrmCpu) && mpShape->checkFlag(J3DShpFlag_EnableLod) == false) { + if (mpModel->checkFlag(J3DMdlFlag_SkinNrmCpu) && + mpShape->checkFlag(J3DShpFlag_EnableLod) == false) + { mpShape->onFlag(J3DShpFlag_SkinNrmCpu); } else { mpShape->offFlag(J3DShpFlag_SkinNrmCpu); diff --git a/libs/JSystem/J3DGraphBase/J3DShape.cpp b/libs/JSystem/J3DGraphBase/J3DShape.cpp index ee1981e32e..59ec27c645 100644 --- a/libs/JSystem/J3DGraphBase/J3DShape.cpp +++ b/libs/JSystem/J3DGraphBase/J3DShape.cpp @@ -1,30 +1,13 @@ -// -// Generated By: dol2asm -// Translation Unit: J3DShape -// - #include "JSystem/J3DGraphBase/J3DShape.h" #include "JSystem/J3DGraphBase/J3DPacket.h" #include "JSystem/J3DGraphBase/J3DVertex.h" -#include "dolphin/gd/GDGeometry.h" +#include "dolphin/gd.h" #include "dolphin/os.h" -#include "dolphin/types.h" - -// -// Forward References: -// - -// -// External References: -// void J3DGDSetVtxAttrFmtv(_GXVtxFmt, GXVtxAttrFmtList const*, bool); void J3DFifoLoadPosMtxImm(Mtx, u32); void J3DFifoLoadNrmMtxImm(Mtx, u32); -// -// Declarations: -// enum { kVcdVatDLSize = 0xC0, diff --git a/libs/JSystem/J3DGraphBase/J3DTevs.cpp b/libs/JSystem/J3DGraphBase/J3DTevs.cpp index e8196589b0..040d734260 100644 --- a/libs/JSystem/J3DGraphBase/J3DTevs.cpp +++ b/libs/JSystem/J3DGraphBase/J3DTevs.cpp @@ -80,25 +80,13 @@ extern "C" u8 sTexCoordScaleTable__6J3DSys[64 + 4 /* padding */]; //
/* 80323590-80323644 31DED0 00B4+00 0/0 3/3 0/0 .text load__11J3DLightObjCFUl */
-// missing instruction
-#ifdef NONMATCHING
-void J3DLightObj::load(u32 param_0) const {
+void J3DLightObj::load(u32 lightIdx) const {
GDOverflowCheck(0x48);
- J3DGDSetLightPos(GXLightID(param_0 * 2), mInfo.mLightPosition.x, mInfo.mLightPosition.y, mInfo.mLightPosition.z);
- J3DGDSetLightAttn(GXLightID(param_0 * 2), mInfo.mCosAtten.x, mInfo.mCosAtten.y, mInfo.mCosAtten.z, mInfo.mDistAtten.x, mInfo.mDistAtten.y, mInfo.mDistAtten.z);
- J3DGDSetLightColor(GXLightID(param_0 * 2), mInfo.mColor);
- J3DGDSetLightDir(GXLightID(param_0 * 2), mInfo.mLightDirection.x, mInfo.mLightDirection.y, mInfo.mLightDirection.z);
+ J3DGDSetLightPos(GXLightID(1 << lightIdx), mInfo.mLightPosition.x, mInfo.mLightPosition.y, mInfo.mLightPosition.z);
+ J3DGDSetLightAttn(GXLightID(1 << lightIdx), mInfo.mCosAtten.x, mInfo.mCosAtten.y, mInfo.mCosAtten.z, mInfo.mDistAtten.x, mInfo.mDistAtten.y, mInfo.mDistAtten.z);
+ J3DGDSetLightColor(GXLightID(1 << lightIdx), mInfo.mColor);
+ J3DGDSetLightDir(GXLightID(1 << lightIdx), mInfo.mLightDirection.x, mInfo.mLightDirection.y, mInfo.mLightDirection.z);
}
-#else
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void J3DLightObj::load(u32 param_0) const {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DTevs/load__11J3DLightObjCFUl.s"
-}
-#pragma pop
-#endif
/* 80323644-803238C4 31DF84 0280+00 0/0 3/3 0/0 .text loadTexCoordGens__FUlP11J3DTexCoord
*/
@@ -489,33 +477,33 @@ COMPILER_STRIP_GATE(0x803A1FF8, &lit_1197); static u8 j3dTexCoordTable[7623 + 1 /* padding */];
/* 80324194-8032423C 31EAD4 00A8+00 0/0 1/1 0/0 .text makeTexCoordTable__Fv */
-// regswap
-#ifdef NONMATCHING
void makeTexCoordTable() {
- u8 bytes[] = { 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x2d, 0x30, 0x33, 0x36, 0x39, 0x3c };
+ u8 texMtx[] = {
+ GX_TEXMTX0,
+ GX_TEXMTX1,
+ GX_TEXMTX2,
+ GX_TEXMTX3,
+ GX_TEXMTX4,
+ GX_TEXMTX5,
+ GX_TEXMTX6,
+ GX_TEXMTX7,
+ GX_TEXMTX8,
+ GX_TEXMTX9,
+ GX_IDENTITY,
+ };
u8* table = j3dTexCoordTable;
for (u32 i = 0; i < 11; i++) {
for (u32 j = 0; j < 21; j++) {
- for (int k = 0; k < 11; k++) {
- u32 idx = i * 0xe7 + j * 11 + k;
- table[idx * 3] = i;
+ for (int k = 0; k < ARRAY_SIZE(texMtx); k++) {
+ u32 idx = j * 11 + i * 0xe7 + k;
+ table[idx * 3 + 0] = i;
table[idx * 3 + 1] = j;
- table[idx * 3 + 2] = bytes[k];
+ table[idx * 3 + 2] = texMtx[k];
}
}
}
}
-#else
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void makeTexCoordTable() {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DTevs/makeTexCoordTable__Fv.s"
-}
-#pragma pop
-#endif
/* ############################################################################################## */
/* 80436A60-80436E60 063780 0400+00 1/1 3/3 0/0 .bss j3dTevSwapTableTable */
@@ -547,31 +535,19 @@ extern u8 j3dZModeTable[96]; u8 j3dZModeTable[96];
/* 803242A8-80324314 31EBE8 006C+00 0/0 1/1 0/0 .text makeZModeTable__Fv */
-// regswap
-#ifdef NONMATCHING
void makeZModeTable() {
u8* table = j3dZModeTable;
for (int i = 0; i < 2; i++) {
for (u32 j = 0; j < 8; j++) {
for (int k = 0; k < 2; k++) {
- u32 idx = i * 16 + j * 2 + k;
- table[idx * 3] = i;
+ u32 idx = j * 2 + i * 16 + k;
+ table[idx * 3 + 0] = i;
table[idx * 3 + 1] = j;
table[idx * 3 + 2] = k;
}
}
}
}
-#else
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void makeZModeTable() {
- nofralloc
-#include "asm/JSystem/J3DGraphBase/J3DTevs/makeZModeTable__Fv.s"
-}
-#pragma pop
-#endif
/* 80324314-80324358 31EC54 0044+00 0/0 1/1 0/0 .text makeTevSwapTable__Fv */
void makeTevSwapTable() {
diff --git a/libs/JSystem/J3DGraphBase/J3DTransform.cpp b/libs/JSystem/J3DGraphBase/J3DTransform.cpp index 520e90bb05..2d8ddc9977 100644 --- a/libs/JSystem/J3DGraphBase/J3DTransform.cpp +++ b/libs/JSystem/J3DGraphBase/J3DTransform.cpp @@ -4,13 +4,10 @@ // #include "JSystem/J3DGraphBase/J3DTransform.h" +#include "JSystem/J3DGraphBase/J3DStruct.h" +#include "JSystem/JMath/JMATrigonometric.h" #include "dol2asm.h" - -// -// Types: -// - -struct J3DTextureSRTInfo {}; +#include "dolphin/base/PPCArch.h" // // Forward References: @@ -44,23 +41,19 @@ extern "C" u8 sincosTable___5JMath[65536]; // /* 80311630-80311638 -00001 0008+00 0/0 0/0 0/0 .text __MTGQR7__FUl */ -asm void __MTGQR7(u32 param_0) { +void __MTGQR7(register u32 v) { // clang-format off - nofralloc - mtspr 0x397, r3 - blr + asm { + mtspr GQR7, v + } // clang-format on } /* 80311638-80311670 30BF78 0038+00 0/0 2/2 0/0 .text J3DGQRSetup7__FUlUlUlUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DGQRSetup7(u32 param_0, u32 param_1, u32 param_2, u32 param_3) { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DTransform/J3DGQRSetup7__FUlUlUlUl.s" +void J3DGQRSetup7(u32 r0, u32 r1, u32 r2, u32 r3) { + u32 v = (((r0 << 8) + r1) << 16) | ((r2 << 8) + r3); + __MTGQR7(v); } -#pragma pop /* ############################################################################################## */ /* 80456378-8045637C 004978 0004+00 6/6 0/0 0/0 .sdata2 @435 */ @@ -72,6 +65,44 @@ SECTION_SDATA2 static u8 lit_435[4] = { }; /* 80311670-80311760 30BFB0 00F0+00 0/0 2/2 0/0 .text J3DCalcBBoardMtx__FPA4_f */ +// this uses a non-standard sqrtf, not sure why or how its supposed to be setup +#ifdef NONMATCHING +static inline f32 sqrtf2(f32 x) { + if (x > 0.0f) { + f32 guess = (f32)__frsqrte(x); + return (f32)(x * guess); + } + return x; +} + +void J3DCalcBBoardMtx(Mtx mtx) { + f32 x = (mtx[0][0] * mtx[0][0]) + (mtx[1][0] * mtx[1][0]) + (mtx[2][0] * mtx[2][0]); + f32 y = (mtx[0][1] * mtx[0][1]) + (mtx[1][1] * mtx[1][1]) + (mtx[2][1] * mtx[2][1]); + f32 z = (mtx[0][2] * mtx[0][2]) + (mtx[1][2] * mtx[1][2]) + (mtx[2][2] * mtx[2][2]); + + if (x > 0.0f) { + x *= sqrtf2(x); + } + if (y > 0.0f) { + y *= sqrtf2(y); + } + if (z > 0.0f) { + z *= sqrtf2(z); + } + + mtx[0][0] = x; + mtx[0][1] = 0.0f; + mtx[0][2] = 0.0f; + + mtx[1][0] = 0.0f; + mtx[1][1] = y; + mtx[1][2] = 0.0f; + + mtx[2][0] = 0.0f; + mtx[2][1] = 0.0f; + mtx[2][2] = z; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -80,6 +111,7 @@ asm void J3DCalcBBoardMtx(f32 (*param_0)[4]) { #include "asm/JSystem/J3DGraphBase/J3DTransform/J3DCalcBBoardMtx__FPA4_f.s" } #pragma pop +#endif /* ############################################################################################## */ /* 803A1E30-803A1E50 02E490 0020+00 0/0 1/1 0/0 .rodata j3dDefaultTransformInfo */ @@ -121,25 +153,58 @@ asm void J3DPSCalcInverseTranspose(f32 (*param_0)[4], f32 (*param_1)[3]) { /* 80311964-80311A24 30C2A4 00C0+00 0/0 2/2 2/2 .text * J3DGetTranslateRotateMtx__FRC16J3DTransformInfoPA4_f */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DGetTranslateRotateMtx(J3DTransformInfo const& param_0, f32 (*param_1)[4]) { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DTransform/J3DGetTranslateRotateMtx__FRC16J3DTransformInfoPA4_f.s" +void J3DGetTranslateRotateMtx(const J3DTransformInfo& tx, Mtx dst) { + f32 sx = JMASSin(tx.mRotation.x), cx = JMASCos(tx.mRotation.x); + f32 sy = JMASSin(tx.mRotation.y), cy = JMASCos(tx.mRotation.y); + f32 sz = JMASSin(tx.mRotation.z), cz = JMASCos(tx.mRotation.z); + + dst[2][0] = -sy; + dst[0][0] = cz * cy; + dst[1][0] = sz * cy; + dst[2][1] = cy * sx; + dst[2][2] = cy * cx; + + f32 cxsz = cx * sz; + f32 sxcz = sx * cz; + dst[0][1] = sxcz * sy - cxsz; + dst[1][2] = cxsz * sy - sxcz; + + f32 sxsz = sx * sz; + f32 cxcz = cx * cz; + dst[0][2] = cxcz * sy + sxsz; + dst[1][1] = sxsz * sy + cxcz; + + dst[0][3] = tx.mTranslate.x; + dst[1][3] = tx.mTranslate.y; + dst[2][3] = tx.mTranslate.z; } -#pragma pop /* 80311A24-80311ACC 30C364 00A8+00 0/0 1/1 0/0 .text J3DGetTranslateRotateMtx__FsssfffPA4_f */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void J3DGetTranslateRotateMtx(s16 param_0, s16 param_1, s16 param_2, f32 param_3, f32 param_4, - f32 param_5, f32 (*param_6)[4]) { - nofralloc -#include "asm/JSystem/J3DGraphBase/J3DTransform/J3DGetTranslateRotateMtx__FsssfffPA4_f.s" +void J3DGetTranslateRotateMtx(s16 rx, s16 ry, s16 rz, f32 tx, f32 ty, f32 tz, Mtx dst) { + f32 sx = JMASSin(rx), cx = JMASCos(rx); + f32 sy = JMASSin(ry), cy = JMASCos(ry); + f32 sz = JMASSin(rz), cz = JMASCos(rz); + + dst[2][0] = -sy; + dst[0][0] = cz * cy; + dst[1][0] = sz * cy; + dst[2][1] = cy * sx; + dst[2][2] = cy * cx; + + f32 cxsz = cx * sz; + f32 sxcz = sx * cz; + dst[0][1] = sxcz * sy - cxsz; + dst[1][2] = cxsz * sy - sxcz; + + f32 sxsz = sx * sz; + f32 cxcz = cx * cz; + dst[0][2] = cxcz * sy + sxsz; + dst[1][1] = sxsz * sy + cxcz; + + dst[0][3] = tx; + dst[1][3] = ty; + dst[2][3] = tz; } -#pragma pop /* ############################################################################################## */ /* 8045637C-80456380 00497C 0004+00 4/4 0/0 0/0 .sdata2 @526 */ @@ -147,6 +212,32 @@ SECTION_SDATA2 static f32 lit_526 = 1.0f; /* 80311ACC-80311B80 30C40C 00B4+00 0/0 3/3 0/0 .text * J3DGetTextureMtx__FRC17J3DTextureSRTInfoRC3VecPA4_f */ +// matches with literals +#ifdef NONMATCHING +void J3DGetTextureMtx(const J3DTextureSRTInfo& srt, const Vec& center, Mtx dst) { + f32 sr = JMASSin(srt.mRotation), cr = JMASCos(srt.mRotation); + + f32 cx = srt.mScaleX * cr; + f32 sx = srt.mScaleX * sr; + f32 sy = srt.mScaleY * sr; + f32 cy = srt.mScaleY * cr; + + dst[0][0] = cx; + dst[0][1] = -sx; + dst[0][2] = (-cx * center.x + sx * center.y) + center.x + srt.mTranslationX; + + dst[1][0] = sy; + dst[1][1] = cy; + dst[1][2] = (-sy * center.x - cy * center.y) + center.y + srt.mTranslationY; + + dst[2][3] = 0.0f; + dst[2][1] = 0.0f; + dst[2][0] = 0.0f; + dst[1][3] = 0.0f; + dst[0][3] = 0.0f; + dst[2][2] = 1.0f; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -155,9 +246,36 @@ asm void J3DGetTextureMtx(J3DTextureSRTInfo const& param_0, Vec const& param_1, #include "asm/JSystem/J3DGraphBase/J3DTransform/J3DGetTextureMtx__FRC17J3DTextureSRTInfoRC3VecPA4_f.s" } #pragma pop +#endif /* 80311B80-80311C34 30C4C0 00B4+00 0/0 3/3 0/0 .text * J3DGetTextureMtxOld__FRC17J3DTextureSRTInfoRC3VecPA4_f */ +// matches with literals +#ifdef NONMATCHING +void J3DGetTextureMtxOld(const J3DTextureSRTInfo& srt, const Vec& center, Mtx dst) { + f32 sr = JMASSin(srt.mRotation), cr = JMASCos(srt.mRotation); + + f32 cx = srt.mScaleX * cr; + f32 sx = srt.mScaleX * sr; + f32 sy = srt.mScaleY * sr; + f32 cy = srt.mScaleY * cr; + + dst[0][0] = cx; + dst[0][1] = -sx; + dst[0][3] = (-cx * center.x + sx * center.y) + center.x + srt.mTranslationX; + + dst[1][0] = sy; + dst[1][1] = cy; + dst[1][3] = (-sy * center.x - cy * center.y) + center.y + srt.mTranslationY; + + dst[2][3] = 0.0f; + dst[2][1] = 0.0f; + dst[2][0] = 0.0f; + dst[1][2] = 0.0f; + dst[0][2] = 0.0f; + dst[2][2] = 1.0f; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -167,6 +285,7 @@ asm void J3DGetTextureMtxOld(J3DTextureSRTInfo const& param_0, Vec const& param_ #include "asm/JSystem/J3DGraphBase/J3DTransform/J3DGetTextureMtxOld__FRC17J3DTextureSRTInfoRC3VecPA4_f.s" } #pragma pop +#endif /* ############################################################################################## */ /* 80456380-80456388 004980 0004+04 2/2 0/0 0/0 .sdata2 @557 */ @@ -178,6 +297,29 @@ SECTION_SDATA2 static f32 lit_557[1 + 1 /* padding */] = { /* 80311C34-80311CE4 30C574 00B0+00 0/0 3/3 0/0 .text * J3DGetTextureMtxMaya__FRC17J3DTextureSRTInfoPA4_f */ +// matches with literals +#ifdef NONMATCHING +void J3DGetTextureMtxMaya(const J3DTextureSRTInfo& srt, Mtx dst) { + f32 sr = JMASSin(srt.mRotation), cr = JMASCos(srt.mRotation); + f32 tx = srt.mTranslationX - 0.5f; + f32 ty = srt.mTranslationY - 0.5f; + + dst[0][0] = srt.mScaleX * cr; + dst[0][1] = srt.mScaleY * sr; + dst[0][2] = tx * cr - sr * (ty + srt.mScaleY) + 0.5f; + + dst[1][0] = -srt.mScaleX * sr; + dst[1][1] = srt.mScaleY * cr; + dst[1][2] = -tx * sr - cr * (ty + srt.mScaleY) + 0.5f; + + dst[2][3] = 0.0f; + dst[2][1] = 0.0f; + dst[2][0] = 0.0f; + dst[1][3] = 0.0f; + dst[0][3] = 0.0f; + dst[2][2] = 1.0f; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -186,9 +328,33 @@ asm void J3DGetTextureMtxMaya(J3DTextureSRTInfo const& param_0, f32 (*param_1)[4 #include "asm/JSystem/J3DGraphBase/J3DTransform/J3DGetTextureMtxMaya__FRC17J3DTextureSRTInfoPA4_f.s" } #pragma pop +#endif /* 80311CE4-80311D94 30C624 00B0+00 0/0 3/3 0/0 .text * J3DGetTextureMtxMayaOld__FRC17J3DTextureSRTInfoPA4_f */ +// matches with literals +#ifdef NONMATCHING +void J3DGetTextureMtxMayaOld(const J3DTextureSRTInfo& srt, Mtx dst) { + f32 sr = JMASSin(srt.mRotation), cr = JMASCos(srt.mRotation); + f32 tx = srt.mTranslationX - 0.5f; + f32 ty = srt.mTranslationY - 0.5f; + + dst[0][0] = srt.mScaleX * cr; + dst[0][1] = srt.mScaleY * sr; + dst[0][3] = tx * cr - sr * (ty + srt.mScaleY) + 0.5f; + + dst[1][0] = -srt.mScaleX * sr; + dst[1][1] = srt.mScaleY * cr; + dst[1][3] = -tx * sr - cr * (ty + srt.mScaleY) + 0.5f; + + dst[2][3] = 0.0f; + dst[2][1] = 0.0f; + dst[2][0] = 0.0f; + dst[1][2] = 0.0f; + dst[0][2] = 0.0f; + dst[2][2] = 1.0f; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -197,8 +363,46 @@ asm void J3DGetTextureMtxMayaOld(J3DTextureSRTInfo const& param_0, f32 (*param_1 #include "asm/JSystem/J3DGraphBase/J3DTransform/J3DGetTextureMtxMayaOld__FRC17J3DTextureSRTInfoPA4_f.s" } #pragma pop +#endif /* 80311D94-80311DF8 30C6D4 0064+00 0/0 2/2 0/0 .text J3DScaleNrmMtx__FPA4_fRC3Vec */ +#ifdef NONMATCHING +void J3DScaleNrmMtx(register Mtx mtx, const register Vec& scl) { + register f32 mtx_xy, mtx_z_, scl_xy, scl_z_; + + asm { + /* Row 0 */ + psq_l scl_xy, 0(scl), 0, 0 + psq_l mtx_xy, 0(mtx), 0, 0 + lfs scl_z_, 8(scl) + lfs mtx_z_, 8(mtx) + ps_mul f4, mtx_xy, scl_xy + psq_st f4, 0(mtx), 0, 0 + fmuls f4, mtx_z_, scl_z_ + stfs f4, 8(mtx) + + /* Row 1 */ + psq_l scl_xy, 0(scl), 0, 0 + psq_l mtx_xy, 16(mtx), 0, 0 + lfs scl_z_, 8(scl) + lfs mtx_z_, 24(mtx) + ps_mul f4, mtx_xy, scl_xy + psq_st f4, 16(mtx), 0, 0 + fmuls f4, mtx_z_, scl_z_ + stfs f4, 24(mtx) + + /* Row 2 */ + psq_l scl_xy, 0(scl), 0, 0 + psq_l mtx_xy, 32(mtx), 0, 0 + lfs scl_z_, 8(scl) + lfs mtx_z_, 40(mtx) + ps_mul f4, mtx_xy, scl_xy + psq_st f4, 32(mtx), 0, 0 + fmuls f4, mtx_z_, scl_z_ + stfs f4, 40(mtx) + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -207,6 +411,7 @@ asm void J3DScaleNrmMtx(f32 (*param_0)[4], Vec const& param_1) { #include "asm/JSystem/J3DGraphBase/J3DTransform/J3DScaleNrmMtx__FPA4_fRC3Vec.s" } #pragma pop +#endif /* 80311DF8-80311E4C 30C738 0054+00 0/0 5/5 0/0 .text J3DScaleNrmMtx33__FPA3_fRC3Vec */ #pragma push @@ -248,5 +453,6 @@ asm void J3DPSMtxArrayConcat(f32 (*param_0)[4], f32 (*param_1)[4], f32 (*param_2 /* ############################################################################################## */ /* 803CD8F8-803CD900 02AA18 0008+00 0/0 2/2 0/0 .data PSMulUnit01 */ SECTION_DATA extern f32 PSMulUnit01[2] = { - 0.0f, -1.0f, + 0.0f, + -1.0f, }; |
