citro3d/include/c3d/texenv.h

99 lines
2.2 KiB
C
Raw Normal View History

2014-12-20 21:34:19 +01:00
#pragma once
#include "types.h"
typedef struct
{
u16 srcRgb, srcAlpha;
union
{
u32 opAll;
struct { u32 opRgb:12, opAlpha:12; };
};
2014-12-20 21:34:19 +01:00
u16 funcRgb, funcAlpha;
u32 color;
2015-09-10 13:47:16 +02:00
u16 scaleRgb, scaleAlpha;
2014-12-20 21:34:19 +01:00
} C3D_TexEnv;
typedef enum
2014-12-20 21:34:19 +01:00
{
C3D_RGB = BIT(0),
C3D_Alpha = BIT(1),
C3D_Both = C3D_RGB | C3D_Alpha,
} C3D_TexEnvMode;
2014-12-20 21:34:19 +01:00
C3D_TexEnv* C3D_GetTexEnv(int id);
void C3D_SetTexEnv(int id, C3D_TexEnv* env);
2017-04-26 16:34:59 +02:00
void C3D_DirtyTexEnv(C3D_TexEnv* env);
2014-12-20 21:34:19 +01:00
2015-09-10 13:47:16 +02:00
void C3D_TexEnvBufUpdate(int mode, int mask);
void C3D_TexEnvBufColor(u32 color);
static inline void C3D_TexEnvInit(C3D_TexEnv* env)
2014-12-20 21:34:19 +01:00
{
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
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)
2014-12-20 21:34:19 +01:00
env->srcRgb = param;
if ((int)mode & C3D_Alpha)
2014-12-20 21:34:19 +01:00
env->srcAlpha = 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))
2014-12-20 21:34:19 +01:00
{
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)
2014-12-20 21:34:19 +01:00
env->funcRgb = param;
if ((int)mode & C3D_Alpha)
2014-12-20 21:34:19 +01:00
env->funcAlpha = param;
}
static inline void C3D_TexEnvColor(C3D_TexEnv* env, u32 color)
{
env->color = color;
}
2015-09-10 13:47:16 +02:00
static inline void C3D_TexEnvScale(C3D_TexEnv* env, int mode, GPU_TEVSCALE param)
2015-09-10 13:47:16 +02:00
{
if (mode & C3D_RGB)
env->scaleRgb = param;
if (mode & C3D_Alpha)
env->scaleAlpha = param;
}
#undef _C3D_DEFAULT