Shmup/src/starfieldshader.cpp

98 lines
2.0 KiB
C++

#include <azur/gint/render.h>
#include "MyAzurShaders.h"
#include <cstdlib>
#include <cstdio>
#include <gint/rtc.h>
#include <gint/usb.h>
#include <gint/usb-ff-bulk.h>
uint8_t AZRP_SHADER_STARFIELD = -1;
#define NBPARTS 100
struct particle
{
int x,y,s,c,frag,off;
};
particle datastar[NBPARTS];
__attribute__((constructor))
static void register_shader(void)
{
extern azrp_shader_t azrp_shader_starfield;
AZRP_SHADER_STARFIELD = azrp_register_shader(azrp_shader_starfield);
}
void azrp_shader_starfield_configure(void)
{
azrp_set_uniforms(AZRP_SHADER_STARFIELD, (void *)azrp_width);
}
struct command {
uint8_t shader_id;
uint8_t current_frag;
particle *data;
};
void azrp_starfield_init( void )
{
srand(rtc_ticks());
for(int i=0; i<NBPARTS; i++)
{
datastar[i].x = rand( ) % 396;
datastar[i].y = rand( ) % 224;
datastar[i].s = 1 + rand( ) % 4;
datastar[i].c = 0xFFFF;
datastar[i].frag = datastar[i].y / 16;
datastar[i].off = datastar[i].y & 15;
}
}
void azrp_starfield( void )
{
prof_enter(azrp_perf_cmdgen);
struct command cmd;
cmd.shader_id = AZRP_SHADER_STARFIELD;
cmd.current_frag = 0;
cmd.data = datastar;
for(int i=0; i<NBPARTS; i++)
{
datastar[i].y = (datastar[i].y + datastar[i].s) % 224;
datastar[i].frag = datastar[i].y / 16;
datastar[i].off = datastar[i].y & 15;
}
int fragmin = 0;
int fragcount = (223 >> 4) + 1;
azrp_queue_command(&cmd, sizeof cmd, fragmin, fragcount);
prof_leave(azrp_perf_cmdgen);
}
void azrp_shader_starfield( void *uniforms, void *comnd, void *fragment )
{
struct command *cmd = (struct command *) comnd;
uint16_t *frag = (uint16_t *) fragment;
particle *data = cmd->data;
for(int i=0; i<NBPARTS; i++)
if (cmd->current_frag == data[i].frag)
{
frag[azrp_width * data[i].off + data[i].x] = data[i].c;
}
cmd->current_frag++;
}