AfterBurner/src/horizon.cpp

61 lines
1.3 KiB
C++

#include "afterburner.h"
#include <azur/gint/render.h>
#include <num/num.h>
#include <math.h>
using namespace libnum;
uint8_t AB_HORIZON_SHADER_ID = -1;
struct ab_horizon_cmd
{
/* Shader ID for Azur */
uint8_t shader_id;
uint8_t _[3];
/* Variation in value for a single move of +1x */
num dx;
/* Variation in value for a row move of -198x and +1y */
num drow;
/* Palette, supporting indexes 0...255 */
uint16_t *palette;
/* Current horizon value */
num current;
};
extern "C" {
extern azrp_shader_t ab_horizon_shader;
}
GCONSTRUCTOR
static void register_shader(void)
{
AB_HORIZON_SHADER_ID = azrp_register_shader(ab_horizon_shader);
}
void ab_horizon(int cx, int cy, float alpha, uint16_t *palette)
{
prof_enter(azrp_perf_cmdgen);
num sin_alpha = sinf(alpha);
num cos_alpha = cosf(alpha);
num dx = -sin_alpha;
num dy = -cos_alpha;
struct ab_horizon_cmd cmd;
cmd.shader_id = AB_HORIZON_SHADER_ID;
cmd.current = dx * -cx + dy *-cy;
cmd.dx = dx;
cmd.drow = -198*dx + dy;
cmd.palette = palette;
azrp_queue_command(&cmd, sizeof cmd, 0, azrp_frag_count);
prof_leave(azrp_perf_cmdgen);
}
void ab_horizon_configure(void)
{
uint32_t value = (azrp_width << 16) | azrp_frag_height;
azrp_set_uniforms(AB_HORIZON_SHADER_ID, (void *)value);
}