61 lines
1.3 KiB
C++
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);
|
|
}
|