/**************************************************************************** * Restore GX to 2D mode drawing ***************************************************************************/ void ReSetup_GX(void) { // channel control GX_SetNumChans(1); GX_SetChanCtrl(GX_COLOR0A0,GX_DISABLE,GX_SRC_REG,GX_SRC_VTX,GX_LIGHTNULL,GX_DF_NONE,GX_AF_NONE); // texture gen. GX_SetNumTexGens(1); GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); // texture environment GX_SetNumTevStages(1); GX_SetNumIndStages(0); GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GX_SetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0); GX_SetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_1_4); GX_SetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_1); GX_SetTevDirect(GX_TEVSTAGE0); // swap table GX_SetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); GX_SetTevSwapModeTable(GX_TEV_SWAP1, GX_CH_RED, GX_CH_RED, GX_CH_RED, GX_CH_ALPHA); GX_SetTevSwapModeTable(GX_TEV_SWAP2, GX_CH_GREEN, GX_CH_GREEN, GX_CH_GREEN, GX_CH_ALPHA); GX_SetTevSwapModeTable(GX_TEV_SWAP3, GX_CH_BLUE, GX_CH_BLUE, GX_CH_BLUE, GX_CH_ALPHA); // alpha compare and blend mode GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET); }
void Textbox::SetupGX(const BannerResources& resources) const { GX_ClearVtxDesc(); GX_InvVtxCache(); GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); // channel control GX_SetNumChans(1); GX_SetChanCtrl(GX_COLOR0A0,GX_DISABLE,GX_SRC_REG,GX_SRC_VTX,GX_LIGHTNULL,GX_DF_NONE,GX_AF_NONE); // texture gen. GX_SetNumTexGens(1); GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); // texture environment GX_SetNumTevStages(1); GX_SetNumIndStages(0); GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GX_SetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0); GX_SetTevKColorSel(GX_TEVSTAGE0, GX_TEV_KCSEL_1_4); GX_SetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_1); GX_SetTevDirect(GX_TEVSTAGE0); // swap table GX_SetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); GX_SetTevSwapModeTable(GX_TEV_SWAP1, GX_CH_RED, GX_CH_RED, GX_CH_RED, GX_CH_ALPHA); GX_SetTevSwapModeTable(GX_TEV_SWAP2, GX_CH_GREEN, GX_CH_GREEN, GX_CH_GREEN, GX_CH_ALPHA); GX_SetTevSwapModeTable(GX_TEV_SWAP3, GX_CH_BLUE, GX_CH_BLUE, GX_CH_BLUE, GX_CH_ALPHA); // alpha compare and blend mode GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET); if(header->material_index < resources.materials.size()) { const Material::Header *matHead = resources.materials[header->material_index]->GetHeader(); if(!matHead) return; //GX_SetFog(0, 0.0f, 0.0f, 0.0f, 0.0f, (GXColor){0xff, 0xff, 0xff, 0xff}); GX_SetTevSwapModeTable(0, 0, 1, 2, 3); //GX_SetZTexture(0, 0x11, 0); GX_SetNumChans(1 ); GX_SetChanCtrl(4, 0, 0, 1, 0, 0, 2); GX_SetChanCtrl(5, 0, 0, 0, 0, 0, 2); GX_SetNumTexGens(1); GX_SetTexCoordGen2(0, 1, 4, 0x3c, 0, 0x7D); GX_SetNumIndStages(0); GX_SetBlendMode(1, 4, 5, 0xf); GX_SetNumTevStages(2); GX_SetTevDirect(0); GX_SetTevDirect(1); GX_SetTevSwapMode(0, 0, 0); GX_SetTevSwapMode(1, 0, 0); GX_SetTevOrder(0, 0, 0, 0xff); for( int i = 0; i < 2; i++ ) { // Devkitppc_r27 internal compiler error //GX_SetTevColor(i + 1, (GXColor){ LIMIT(matHead->color_regs[i].r, 0, 0xFF), // LIMIT(matHead->color_regs[i].g, 0, 0xFF), // LIMIT(matHead->color_regs[i].b, 0, 0xFF), // LIMIT(matHead->color_regs[i].a, 0, 0xFF) }); u8 r = (u8) LIMIT(matHead->color_regs[i].r, 0, 0xFF); u8 g = (u8) LIMIT(matHead->color_regs[i].g, 0, 0xFF); u8 b = (u8) LIMIT(matHead->color_regs[i].b, 0, 0xFF); u8 a = (u8) LIMIT(matHead->color_regs[i].a, 0, 0xFF); GX_SetTevColor((u8) (i + 1), (GXColor){r,g,b,a}); } GX_SetTevColorIn(0, 2, 4, 8, 0xf); GX_SetTevAlphaIn(0, 1, 2, 4, 7); GX_SetTevColorOp(0, 0, 0, 0, 1, 0); GX_SetTevAlphaOp(0, 0, 0, 0, 1, 0); GX_SetTevOrder(1, 0xff, 0xff, 4); GX_SetTevColorIn(1, 0xf, 0, 0xa, 0xf); GX_SetTevAlphaIn(1, 7, 0, 5, 7); GX_SetTevColorOp(1, 0, 0, 0, 1, 0); GX_SetTevAlphaOp(1, 0, 0, 0, 1, 0); } }
inline void Material::ApplyIndStages(void) const { for( int i = 0; i < flags->ind_srt; i++ ) { const IndSrt &ind = ind_srt[i]; const float rotate_rad = DegToRad(ind.rotate); // maybe add a look up table float cosF = cosf(rotate_rad); float sinF = sinf(rotate_rad); int scale_exp = 0; f32 mtx23[2][3]; f32 mtxabs23[2][3]; mtx23[0][0] = ind.scale_x * cosF; mtx23[0][1] = ind.scale_y * -sinF; mtx23[0][2] = ind.translate_x; mtx23[1][0] = ind.scale_x * sinF; mtx23[1][1] = ind.scale_y * cosF; mtx23[1][2] = ind.translate_y; // create matrix with abs values // compiler will optimize the loops for(int n = 0; n < 2; n++) for(int m = 0; m < 3; m++) mtxabs23[n][m] = fabs(mtx23[n][m]); // hardcore clamping going on here if( (mtxabs23[0][0] >= 1.0f) || (mtxabs23[0][1] >= 1.0f) || (mtxabs23[0][2] >= 1.0f) || (mtxabs23[1][0] >= 1.0f) || (mtxabs23[1][1] >= 1.0f) || (mtxabs23[1][2] >= 1.0f)) { while( scale_exp < 0x2E && ((mtxabs23[0][0] >= 1.0f) || (mtxabs23[0][1] >= 1.0f) || (mtxabs23[0][2] >= 1.0f) || (mtxabs23[1][0] >= 1.0f) || (mtxabs23[1][1] >= 1.0f) || (mtxabs23[1][2] >= 1.0f))) { for(int n = 0; n < 2; n++) { for(int m = 0; m < 3; m++) { mtx23[n][m] *= 0.5f; mtxabs23[n][m] *= 0.5f; } } scale_exp++; } } else if( (mtxabs23[0][0] < 0.5f) && (mtxabs23[0][1] < 0.5f) && (mtxabs23[0][2] < 0.5f) && (mtxabs23[1][0] < 0.5f) && (mtxabs23[1][1] < 0.5f) && (mtxabs23[1][2] < 0.5f)) { while( scale_exp > -0x11 && (mtxabs23[0][0] < 0.5f) && (mtxabs23[0][1] < 0.5f) && (mtxabs23[0][2] < 0.5f) && (mtxabs23[1][0] < 0.5f) && (mtxabs23[1][1] < 0.5f) && (mtxabs23[1][2] < 0.5f)) { for(int n = 0; n < 2; n++) { for(int m = 0; m < 3; m++) { mtx23[n][m] *= 2.0f; mtxabs23[n][m] *= 2.0f; } } scale_exp--; } } GX_SetIndTexMatrix(GX_ITM_0 + i, mtx23, scale_exp); } for( int i = 0; i < flags->ind_stage; i++ ) { const IndStage &stage = ind_stage[i]; GX_SetIndTexOrder(i, stage.texcoord, stage.tex_map); GX_SetIndTexCoordScale(i, stage.scale_s, stage.scale_t); } GX_SetNumIndStages(flags->ind_stage); }