Merge pull request 'Integration of a basic starfield shader based on static table' (#2) from dev into master

Reviewed-on: https://gitea.planet-casio.com/Slyvtt/Shmup/pulls/2
This commit is contained in:
Sylvain PILLOT 2023-01-14 13:06:58 +01:00
commit 3251d16dc0
4 changed files with 126 additions and 11 deletions

View File

@ -18,6 +18,7 @@ set(SOURCES
src/starfield.cpp
src/pixelshader.cpp
src/pixellistshader.cpp
src/starfieldshader.cpp
# ...
)
set(ASSETS_cg

View File

@ -1,6 +1,16 @@
#ifndef MYAZURSHADERS_H
#define MYAZURSHADERS_H
#include "starfield.h"
#include <vector>
void azrp_pixel(int x1, int y1, int color);
void azrp_pixellist(std::vector<Pixel*> const &list, int fragnum );
void azrp_pixellist(std::vector<Pixel*> const &list, int fragnum );
void azrp_starfield( void );
void azrp_starfield_init( void );
#endif //MYAZURSHADERS_H

View File

@ -48,10 +48,10 @@ uint8_t texttodraw=1;
void Create_Starfield( void )
/*void Create_Starfield( void )
{
MyStarField = new Starfield();
}
}*/
void Create_Explosion( void )
{
@ -73,6 +73,7 @@ void Create_Explosion( void )
static void update( float dt )
{
// all update stuff depending on time will be done here
for(unsigned int i=0; i<MyParticles.size(); i++)
{
MyParticles[i]->Update( dt );
@ -85,7 +86,8 @@ static void update( float dt )
}
}
MyStarField->Update( dt );
//MyStarField->Update( dt );
}
@ -110,6 +112,8 @@ static void get_inputs( void )
if(keydown(KEY_F3)) {texttodraw=2;}
if(keydown(KEY_F4)) {texttodraw=3;}
if(keydown(KEY_F6)) {azrp_starfield_init();}
}
@ -129,9 +133,9 @@ int main(void)
azrp_shader_image_rgb16_configure();
azrp_shader_image_p8_configure();
azrp_shader_image_p4_configure();
azrp_shader_triangle_configure();
Create_Starfield();
azrp_starfield_init();
usb_interface_t const *interfaces[] = { &usb_ff_bulk, NULL };
@ -189,8 +193,9 @@ int main(void)
for(auto& p : MyParticles)
p->Render();
MyStarField->Render();
azrp_starfield();
azrp_update();
}
@ -225,11 +230,12 @@ int main(void)
if (textoutput && usb_is_open())
{
char texttosend[1024];
for(unsigned int i=0; i<MyStarField->MyStars.size(); i++)
/*for(unsigned int i=0; i<NBPARTS; i++)
{
sprintf( texttosend, "Star %d : x=%d : y=%d : s=%d : c=%d", i, MyStarField->MyStars[i]->x, (int) MyStarField->MyStars[i]->y, MyStarField->MyStars[i]->size, MyStarField->MyStars[i]->color );
sprintf( texttosend, "Star %d : x=%d : y=%d : f=%d : s=%d : c=%d", i, datastar[i].x, datastar[i].y, datastar[i].s, datastar[i].frag, datastar[i].c );
usb_fxlink_text(texttosend, 0);
}
}*/
textoutput = false;
}

98
src/starfieldshader.cpp Normal file
View File

@ -0,0 +1,98 @@
#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++;
}