1#ifndef NW4R_G3D_PLATFORM_GPU_H
2#define NW4R_G3D_PLATFORM_GPU_H
3#include <nw4r/types_nw4r.h>
7#include <revolution/GX.h>
14static const u8 cm2hw[] = {0b0000, 0b0010, 0b0001, 0b0011};
16inline void LoadBPCmd(ulong reg) {
17 GXCmd1u8(GX_FIFO_CMD_LOAD_BP_REG);
21inline void LoadCPCmd(u8 addr, ulong value) {
22 GXCmd1u8(GX_FIFO_CMD_LOAD_CP_REG);
27inline void LoadXFCmd(u16 addr, ulong value) {
28 GXCmd1u8(GX_FIFO_CMD_LOAD_XF_REG);
34inline void LoadXFCmdHdr(u16 addr, u8 len) {
35 GXCmd1u8(GX_FIFO_CMD_LOAD_XF_REG);
40void GDSetGenMode2(u8 numTexGens, u8 numChans, u8 numTevs, u8 numInds,
43inline void GDSetGenMode2Ex_BP(u8 numTexGens, u8 numChans, u8 numTevs,
44 u8 numInds, GXCullMode cullMode) {
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);
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);
67void GDSetCullMode(GXCullMode cullMode);
69void GDSetTexCoordScale2(GXTexCoordID coord, u16 scaleS, GXBool biasS,
70 GXBool wrapS, u16 scaleT, GXBool biasT, GXBool wrapT);
72void GDSetIndTexMtx(ulong
id,
const math::MTX34& rMtx);
74void GDResetCurrentMtx();
75void GDSetCurrentMtx(
const ulong* pIdArray);
77void GDLoadTexMtxImm3x3(
const math::MTX33& rMtx, ulong
id);
79inline void GDSetChanCtrl(GXChannelID chan, ulong param, ulong lightMask) {
80 param &= ~(GX_XF_COLOR0CNTRL_LMASKLO_MASK | GX_XF_COLOR0CNTRL_LMASKHI_MASK);
82 param |= (lightMask & 0b1111) << GX_XF_COLOR0CNTRL_LMASKLO_SHIFT |
83 ((lightMask >> 4) & 0b1111) << GX_XF_COLOR0CNTRL_LMASKHI_SHIFT;
85 LoadXFCmd(GX_XF_REG_COLOR0CNTRL + (chan & 3), param);
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);
92 param |= (lightMask & 0b1111) << GX_XF_COLOR0CNTRL_LMASKLO_SHIFT |
93 ((lightMask >> 4) & 0b1111) << GX_XF_COLOR0CNTRL_LMASKHI_SHIFT;
95 LoadXFCmd(GX_XF_REG_COLOR0CNTRL + (chan & 3), param);
98inline void GDSetChanAmbColor(GXChannelID chan, GXColor color) {
99 LoadXFCmd(GX_XF_REG_AMBIENT0 + chan, *
reinterpret_cast<ulong*
>(&color));
102inline void GDSetChanMatColor(GXChannelID chan, GXColor color) {
103 LoadXFCmd(GX_XF_REG_MATERIAL0 + chan, *
reinterpret_cast<ulong*
>(&color));
3D graphics drawing library.