#include "afterburner.h" #include #include #include 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); }