#include "context.h" static inline C3D_Effect* getEffect() { C3D_Context* ctx = C3Di_GetContext(); ctx->flags |= C3DiF_Effect; return &ctx->effect; } void C3D_DepthMap(float zScale, float zOffset) { C3D_Effect* e = getEffect(); e->zScale = f32tof24(zScale); e->zOffset = f32tof24(zOffset); } void C3D_CullFace(GPU_CULLMODE mode) { C3D_Effect* e = getEffect(); e->cullMode = mode; } void C3D_StencilTest(bool enable, GPU_TESTFUNC function, int ref, int inputMask, int writeMask) { C3D_Effect* e = getEffect(); e->stencilMode = (!!enable) | ((function & 7) << 4) | (writeMask << 8) | (ref << 16) | (inputMask << 24); } void C3D_StencilOp(GPU_STENCILOP sfail, GPU_STENCILOP dfail, GPU_STENCILOP pass) { C3D_Effect* e = getEffect(); e->stencilOp = sfail | (dfail << 4) | (pass << 8); } void C3D_BlendingColor(u32 color) { C3D_Effect* e = getEffect(); e->blendClr = color; } void C3D_DepthTest(bool enable, GPU_TESTFUNC function, GPU_WRITEMASK writemask) { C3D_Effect* e = getEffect(); e->depthTest = (!!enable) | ((function & 7) << 4) | (writemask << 8); } void C3D_AlphaTest(bool enable, GPU_TESTFUNC function, int ref) { C3D_Effect* e = getEffect(); e->alphaTest = (!!enable) | ((function & 7) << 4) | (ref << 8); } void C3D_AlphaBlend(GPU_BLENDEQUATION colorEq, GPU_BLENDEQUATION alphaEq, GPU_BLENDFACTOR srcClr, GPU_BLENDFACTOR dstClr, GPU_BLENDFACTOR srcAlpha, GPU_BLENDFACTOR dstAlpha) { C3D_Effect* e = getEffect(); e->alphaBlend = colorEq | (alphaEq << 8) | (srcClr << 16) | (dstClr << 20) | (srcAlpha << 24) | (dstAlpha << 28); e->fragOpMode &= ~0xFF00; e->fragOpMode |= 0x0100; } void C3D_ColorLogicOp(GPU_LOGICOP op) { C3D_Effect* e = getEffect(); e->fragOpMode &= ~0xFF00; e->clrLogicOp = op; } void C3D_FragOpMode(GPU_FRAGOPMODE mode) { C3D_Effect* e = getEffect(); e->fragOpMode &= ~0xFF00FF; e->fragOpMode |= 0xE40000 | mode; } void C3Di_EffectBind(C3D_Effect* e) { GPUCMD_AddWrite(GPUREG_006D, 0x00000001); GPUCMD_AddWrite(GPUREG_FACECULLING_CONFIG, e->cullMode & 0x3); GPUCMD_AddIncrementalWrites(GPUREG_DEPTHMAP_SCALE, (u32*)&e->zScale, 2); GPUCMD_AddIncrementalWrites(GPUREG_ALPHATEST_CONFIG, (u32*)&e->alphaTest, 4); GPUCMD_AddWrite(GPUREG_BLEND_COLOR, e->blendClr); GPUCMD_AddWrite(GPUREG_BLEND_CONFIG, e->alphaBlend); GPUCMD_AddWrite(GPUREG_LOGICOP_CONFIG, e->clrLogicOp); GPUCMD_AddMaskedWrite(GPUREG_BLEND_ENABLE, 2, e->fragOpMode); // Disable early depth test? GPUCMD_AddMaskedWrite(GPUREG_0062, 1, 0); GPUCMD_AddWrite(GPUREG_0118, 0); }