NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
g3d_gpu.h
1#ifndef NW4R_G3D_PLATFORM_GPU_H
2#define NW4R_G3D_PLATFORM_GPU_H
3#include <nw4r/types_nw4r.h>
4
5#include <nw4r/math.h>
6
7#include <revolution/GX.h>
8
9namespace nw4r {
10namespace g3d {
11namespace fifo {
12
13// Swap bits to get hardware representation
14static const u8 cm2hw[] = {0b0000, 0b0010, 0b0001, 0b0011};
15
16inline void LoadBPCmd(ulong reg) {
17 GXCmd1u8(GX_FIFO_CMD_LOAD_BP_REG);
18 GXCmd1u32(reg);
19}
20
21inline void LoadCPCmd(u8 addr, ulong value) {
22 GXCmd1u8(GX_FIFO_CMD_LOAD_CP_REG);
23 GXCmd1u8(addr);
24 GXCmd1u32(value);
25}
26
27inline void LoadXFCmd(u16 addr, ulong value) {
28 GXCmd1u8(GX_FIFO_CMD_LOAD_XF_REG);
29 GXCmd1u16(0); // No size (single write)
30 GXCmd1u16(addr);
31 GXCmd1u32(value);
32}
33
34inline void LoadXFCmdHdr(u16 addr, u8 len) {
35 GXCmd1u8(GX_FIFO_CMD_LOAD_XF_REG);
36 GXCmd1u16(len - 1);
37 GXCmd1u16(addr);
38}
39
40void GDSetGenMode2(u8 numTexGens, u8 numChans, u8 numTevs, u8 numInds,
41 GXCullMode cullMode);
42
43inline void GDSetGenMode2Ex_BP(u8 numTexGens, u8 numChans, u8 numTevs,
44 u8 numInds, GXCullMode cullMode) {
45
46 // clang-format off
47 // @note NUMCOLORS is actually three bits
48 LoadBPCmd(GX_BP_REG_SSMASK << GX_BP_OPCODE_SHIFT |
49 GX_BP_GENMODE_NUMTEX_MASK |
50 0b11 << GX_BP_GENMODE_NUMCOLORS_SHIFT |
51 GX_BP_GENMODE_NUMTEVSTAGES_MASK |
52 GX_BP_GENMODE_CULLMODE_MASK |
53 GX_BP_GENMODE_NUMINDSTAGES_MASK);
54 // clang-format on
55
56 // clang-format off
57 LoadBPCmd(
58 numTexGens << GX_BP_GENMODE_NUMTEX_SHIFT |
59 numChans << GX_BP_GENMODE_NUMCOLORS_SHIFT |
60 numTevs - 1 << GX_BP_GENMODE_NUMTEVSTAGES_SHIFT |
61 cm2hw[cullMode] << GX_BP_GENMODE_CULLMODE_SHIFT |
62 numInds << GX_BP_GENMODE_NUMINDSTAGES_SHIFT |
63 GX_BP_REG_GENMODE << GX_BP_OPCODE_SHIFT);
64 // clang-format on
65}
66
67void GDSetCullMode(GXCullMode cullMode);
68
69void GDSetTexCoordScale2(GXTexCoordID coord, u16 scaleS, GXBool biasS,
70 GXBool wrapS, u16 scaleT, GXBool biasT, GXBool wrapT);
71
72void GDSetIndTexMtx(ulong id, const math::MTX34& rMtx);
73
74void GDResetCurrentMtx();
75void GDSetCurrentMtx(const ulong* pIdArray);
76
77void GDLoadTexMtxImm3x3(const math::MTX33& rMtx, ulong id);
78
79inline void GDSetChanCtrl(GXChannelID chan, ulong param, ulong lightMask) {
80 param &= ~(GX_XF_COLOR0CNTRL_LMASKLO_MASK | GX_XF_COLOR0CNTRL_LMASKHI_MASK);
81
82 param |= (lightMask & 0b1111) << GX_XF_COLOR0CNTRL_LMASKLO_SHIFT |
83 ((lightMask >> 4) & 0b1111) << GX_XF_COLOR0CNTRL_LMASKHI_SHIFT;
84
85 LoadXFCmd(GX_XF_REG_COLOR0CNTRL + (chan & 3), param);
86}
87
88inline void GDSetChanCtrlLightOff(GXChannelID chan, ulong param, ulong lightMask) {
89 param &= ~(GX_XF_COLOR0CNTRL_LMASKLO_MASK | GX_XF_COLOR0CNTRL_LMASKHI_MASK |
90 GX_XF_COLOR0CNTRL_LIGHT_MASK);
91
92 param |= (lightMask & 0b1111) << GX_XF_COLOR0CNTRL_LMASKLO_SHIFT |
93 ((lightMask >> 4) & 0b1111) << GX_XF_COLOR0CNTRL_LMASKHI_SHIFT;
94
95 LoadXFCmd(GX_XF_REG_COLOR0CNTRL + (chan & 3), param);
96}
97
98inline void GDSetChanAmbColor(GXChannelID chan, GXColor color) {
99 LoadXFCmd(GX_XF_REG_AMBIENT0 + chan, *reinterpret_cast<ulong*>(&color));
100}
101
102inline void GDSetChanMatColor(GXChannelID chan, GXColor color) {
103 LoadXFCmd(GX_XF_REG_MATERIAL0 + chan, *reinterpret_cast<ulong*>(&color));
104}
105
106} // namespace fifo
107} // namespace g3d
108} // namespace nw4r
109
110#endif
3D graphics drawing library.
Definition g3d_3dsmax.h:10