diff --git a/include/c3d/texenv.h b/include/c3d/texenv.h index 4d40392..8f9ac7d 100644 --- a/include/c3d/texenv.h +++ b/include/c3d/texenv.h @@ -4,20 +4,22 @@ typedef struct { u16 srcRgb, srcAlpha; - u16 opRgb, opAlpha; + union + { + u32 opAll; + struct { u32 opRgb:12, opAlpha:12; }; + }; u16 funcRgb, funcAlpha; u32 color; u16 scaleRgb, scaleAlpha; } C3D_TexEnv; -enum +typedef enum { C3D_RGB = BIT(0), C3D_Alpha = BIT(1), C3D_Both = C3D_RGB | C3D_Alpha, -}; - -void TexEnv_Init(C3D_TexEnv* env); +} C3D_TexEnvMode; C3D_TexEnv* C3D_GetTexEnv(int id); void C3D_SetTexEnv(int id, C3D_TexEnv* env); @@ -26,29 +28,71 @@ void C3D_DirtyTexEnv(C3D_TexEnv* env); void C3D_TexEnvBufUpdate(int mode, int mask); void C3D_TexEnvBufColor(u32 color); -static inline void C3D_TexEnvSrc(C3D_TexEnv* env, int mode, int s1, int s2, int s3) +static inline void C3D_TexEnvInit(C3D_TexEnv* env) { - int param = GPU_TEVSOURCES(s1, s2, s3); - if (mode & C3D_RGB) + env->srcRgb = GPU_TEVSOURCES(GPU_PREVIOUS, 0, 0); + env->srcAlpha = env->srcRgb; + env->opAll = 0; + env->funcRgb = GPU_REPLACE; + env->funcAlpha = env->funcRgb; + env->color = 0xFFFFFFFF; + env->scaleRgb = GPU_TEVSCALE_1; + env->scaleAlpha = GPU_TEVSCALE_1; +} + +#ifdef __cplusplus +#define _C3D_DEFAULT(x) = x +#else +#define _C3D_DEFAULT(x) +#endif + +C3D_DEPRECATED static inline void TexEnv_Init(C3D_TexEnv* env) +{ + C3D_TexEnvInit(env); +} + +static inline void C3D_TexEnvSrc(C3D_TexEnv* env, C3D_TexEnvMode mode, + GPU_TEVSRC s1, + GPU_TEVSRC s2 _C3D_DEFAULT(GPU_PRIMARY_COLOR), + GPU_TEVSRC s3 _C3D_DEFAULT(GPU_PRIMARY_COLOR)) +{ + int param = GPU_TEVSOURCES((int)s1, (int)s2, (int)s3); + if ((int)mode & C3D_RGB) env->srcRgb = param; - if (mode & C3D_Alpha) + if ((int)mode & C3D_Alpha) env->srcAlpha = param; } -static inline void C3D_TexEnvOp(C3D_TexEnv* env, int mode, int o1, int o2, int o3) +C3D_DEPRECATED static inline void C3D_TexEnvOp(C3D_TexEnv* env, C3D_TexEnvMode mode, int o1, int o2, int o3) { int param = GPU_TEVOPERANDS(o1, o2, o3); - if (mode & C3D_RGB) + if ((int)mode & C3D_RGB) env->opRgb = param; - if (mode & C3D_Alpha) + if ((int)mode & C3D_Alpha) env->opAlpha = param; } -static inline void C3D_TexEnvFunc(C3D_TexEnv* env, int mode, int param) +static inline void C3D_TexEnvOpRgb(C3D_TexEnv* env, + GPU_TEVOP_RGB o1, + GPU_TEVOP_RGB o2 _C3D_DEFAULT(GPU_TEVOP_RGB_SRC_COLOR), + GPU_TEVOP_RGB o3 _C3D_DEFAULT(GPU_TEVOP_RGB_SRC_COLOR)) { - if (mode & C3D_RGB) + env->opRgb = GPU_TEVOPERANDS((int)o1, (int)o2, (int)o3); +} + +static inline void C3D_TexEnvOpAlpha(C3D_TexEnv* env, + GPU_TEVOP_A o1, + GPU_TEVOP_A o2 _C3D_DEFAULT(GPU_TEVOP_A_SRC_ALPHA), + GPU_TEVOP_A o3 _C3D_DEFAULT(GPU_TEVOP_A_SRC_ALPHA)) +{ + env->opAlpha = GPU_TEVOPERANDS((int)o1, (int)o2, (int)o3); +} + +static inline void C3D_TexEnvFunc(C3D_TexEnv* env, C3D_TexEnvMode mode, GPU_COMBINEFUNC param) +{ + if ((int)mode & C3D_RGB) env->funcRgb = param; - if (mode & C3D_Alpha) + if ((int)mode & C3D_Alpha) env->funcAlpha = param; } @@ -57,10 +101,12 @@ static inline void C3D_TexEnvColor(C3D_TexEnv* env, u32 color) env->color = color; } -static inline void C3D_TexEnvScale(C3D_TexEnv* env, int mode, int param) +static inline void C3D_TexEnvScale(C3D_TexEnv* env, int mode, GPU_TEVSCALE param) { if (mode & C3D_RGB) env->scaleRgb = param; if (mode & C3D_Alpha) env->scaleAlpha = param; } + +#undef _C3D_DEFAULT diff --git a/source/base.c b/source/base.c index c4af435..aadd007 100644 --- a/source/base.c +++ b/source/base.c @@ -124,7 +124,7 @@ bool C3D_Init(size_t cmdBufSize) ctx->tex[i] = NULL; for (i = 0; i < 6; i ++) - TexEnv_Init(&ctx->texEnv[i]); + C3D_TexEnvInit(&ctx->texEnv[i]); ctx->fixedAttribDirty = 0; ctx->fixedAttribEverDirty = 0; diff --git a/source/texenv.c b/source/texenv.c index d788f8a..32a72e9 100644 --- a/source/texenv.c +++ b/source/texenv.c @@ -1,18 +1,5 @@ #include "internal.h" -void TexEnv_Init(C3D_TexEnv* env) -{ - env->srcRgb = GPU_TEVSOURCES(GPU_PREVIOUS, 0, 0); - env->srcAlpha = env->srcRgb; - env->opRgb = GPU_TEVOPERANDS(0,0,0); - env->opAlpha = env->opRgb; - env->funcRgb = GPU_REPLACE; - env->funcAlpha = env->funcRgb; - env->color = 0xFFFFFFFF; - env->scaleRgb = GPU_TEVSCALE_1; - env->scaleAlpha = GPU_TEVSCALE_1; -} - C3D_TexEnv* C3D_GetTexEnv(int id) { C3D_Context* ctx = C3Di_GetContext(); @@ -31,8 +18,11 @@ void C3D_SetTexEnv(int id, C3D_TexEnv* env) if (!(ctx->flags & C3DiF_Active)) return; - memcpy(&ctx->texEnv[id], env, sizeof(*env)); ctx->flags |= C3DiF_TexEnv(id); + if (env) + memcpy(&ctx->texEnv[id], env, sizeof(*env)); + else + C3D_TexEnvInit(&ctx->texEnv[id]); } void C3D_DirtyTexEnv(C3D_TexEnv* env)