chaos-drop/src/backend/gint/shader_vfx.cc

58 lines
1.3 KiB
C++

#include "../../chaos-drop.h"
#include <azur/gint/render.h>
uint8_t CD_VFX_SHADER_ID = -1;
struct cd_vfx_cmd
{
/* Shader ID for Azur */
uint8_t shader_id;
uint8_t _;
uint16_t effect;
};
void cd_vfx_shader(void *uniforms, void *cmd0, void *fragment0)
{
int N = (int)uniforms;
struct cd_vfx_cmd *cmd = (struct cd_vfx_cmd *)cmd0;
uint32_t *fragment = (uint32_t *)fragment0;
if(cmd->effect == CD_VFX_DARKEN) {
for(int i = 0; i < N; i++)
fragment[i] = (fragment[i] & 0xf7def7de) >> 1;
}
else if(cmd->effect == CD_VFX_WHITEN) {
for(int i = 0; i < N; i++)
fragment[i] = ~((~fragment[i] & 0xf7def7de) >> 1);
}
else if(cmd->effect == CD_VFX_INVERT) {
for(int i = 0; i < N; i++)
fragment[i] = ~fragment[i];
}
}
GCONSTRUCTOR
static void register_shader(void)
{
CD_VFX_SHADER_ID = azrp_register_shader(cd_vfx_shader);
}
void cd_vfx(int effect)
{
prof_enter(azrp_perf_cmdgen);
struct cd_vfx_cmd cmd;
cmd.shader_id = CD_VFX_SHADER_ID;
cmd.effect = effect;
azrp_queue_command(&cmd, sizeof cmd, 0, azrp_frag_count);
prof_leave(azrp_perf_cmdgen);
}
void cd_vfx_configure(void)
{
uint32_t value = (azrp_frag_height * azrp_width) / 2;
azrp_set_uniforms(CD_VFX_SHADER_ID, (void *)value);
}