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.