Improvement of std::vector with dynamic allocation of particle*

This commit is contained in:
Sylvain PILLOT 2023-01-15 17:38:37 +01:00
parent f33cb39837
commit 52c18741bd
3 changed files with 149 additions and 103 deletions

View File

@ -15,9 +15,6 @@ set(SOURCES
src/main.cpp
src/utilities.cpp
src/particles.cpp
src/starfield.cpp
src/pixelshader.cpp
src/pixellistshader.cpp
src/starfieldshader.cpp
# ...
)

View File

@ -22,7 +22,7 @@
#include "utilities.h"
#include "particles.h"
#include "starfield.h"
#include <vector>
#include <algorithm>

View File

@ -10,47 +10,6 @@
#include <vector>
uint8_t AZRP_SHADER_STARFIELD = -1;
#define NBPARTS 100
struct particle
{
int x, y, s, c, frag, off;
};
struct star
{
int x, y, s, n, t;
};
std::vector<particle> pixels;
std::vector<star> starfield;
__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;
uint8_t nbpixel;
particle *data;
};
#define DARKSKY 0x2106
@ -71,47 +30,81 @@ struct command {
#define ORANGE3 0xDB83
uint8_t AZRP_SHADER_STARFIELD = -1;
struct particle
{
int x, y, s, c, frag, off;
particle( int _x, int _y, int _s, int _c, int _f, int _o ) : x(_x), y(_y), s(_s), c(_c), frag(_f), off(_o) {};
};
struct star
{
int x, y, s, n, t;
star( int _x, int _y, int _s, int _n, int _t ) : x(_x), y(_y), s(_s), n(_n), t(_t) {};
star() {};
};
std::vector<particle*> pixels;
std::vector<star*> starfield;
__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);
}
void azrp_starfield_init( uint8_t nbstars )
{
srand(rtc_ticks());
star temp;
for(int i=0; i<nbstars; i++)
{
temp.x = rand( ) % 394;
temp.y = rand( ) % 222;
temp.s = 1 + rand( ) % 3; // 1,2,3 : speed of the star
temp.n = 1 + rand( ) % 4; // 1,2,3,4 : size of the star
temp.t = 1 + rand( ) % 12; // 1..12 : colorcode of the star
star *temp = new star();
temp->x = rand( ) % 394;
temp->y = rand( ) % 222;
temp->s = 1 + rand( ) % 3; // 1,2,3 : speed of the star
temp->n = 1 + rand( ) % 4; // 1,2,3,4 : size of the star
temp->t = 1 + rand( ) % 12; // 1..12 : colorcode of the star
starfield.push_back( temp );
}
particle ptemp;
for(auto& s : starfield)
{
uint16_t col1, col2, col3;
if (s.t==1 || s.t==2)
if (s->t==1 || s->t==2)
{
col1 = BLUE1;
col2 = BLUE2;
col3 = BLUE3;
}
else if (s.t==3 || s.t==4)
else if (s->t==3 || s->t==4)
{
col1 = PINK1;
col2 = PINK2;
col3 = PINK3;
}
else if (s.t==5 || s.t==6)
else if (s->t==5 || s->t==6)
{
col1 = GREEN1;
col2 = GREEN2;
col3 = GREEN3;
}
else if (s.t==7 || s.t==8)
else if (s->t==7 || s->t==8)
{
col1 = ORANGE1;
col2 = ORANGE2;
@ -127,73 +120,128 @@ void azrp_starfield_init( uint8_t nbstars )
particle *ptemp;
if (s.n==2)
if (s->n==2)
{
ptemp = { s.x, s.y, s.s, col2, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y, s.s, col2, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y, s->s, col2, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y, s->s, col2, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = { s.x, s.y+1, s.s, col2, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y+1, s.s, col2, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y+1, s->s, col2, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y+1, s->s, col2, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
}
else if (s.n==3)
else if (s->n==3)
{
ptemp = { s.x, s.y, s.s, DARKSKY, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y, s.s, col3, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y, s.s, DARKSKY, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y, s->s, DARKSKY, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y, s->s, col3, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y, s->s, DARKSKY, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = { s.x, s.y+1, s.s, col3, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y+1, s.s, col2, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y+1, s.s, col3, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y+1, s->s, col3, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y+1, s->s, col2, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y+1, s->s, col3, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = { s.x, s.y+2, s.s, DARKSKY, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y+2, s.s, col3, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y+2, s.s, DARKSKY, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y+2, s->s, DARKSKY, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y+2, s->s, col3, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y+2, s->s, DARKSKY, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
}
else if (s.n==4)
else if (s->n==4)
{
ptemp = { s.x+1, s.y, s.s, col1, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y, s.s, col1, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = { s.x+3, s.y, s.s, col1, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y, s->s, col1, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y, s->s, col1, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+3, s->y, s->s, col1, s->y/16, s->y&15 );
pixels.push_back( ptemp );
ptemp = { s.x, s.y+1, s.s, col1, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y+1, s.s, col2, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y+1, s.s, col2, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+3, s.y+1, s.s, col2, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+4, s.y+1, s.s, col1, (s.y+1)/16, (s.y+1)&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y+1, s->s, col1, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y+1, s->s, col2, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y+1, s->s, col2, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+3, s->y+1, s->s, col2, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+4, s->y+1, s->s, col1, (s->y+1)/16, (s->y+1)&15 );
pixels.push_back( ptemp );
ptemp = { s.x, s.y+2, s.s, col1, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y+2, s.s, col2, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y+2, s.s, col3, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+3, s.y+2, s.s, col2, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+4, s.y+2, s.s, col1, (s.y+2)/16, (s.y+2)&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y+2, s->s, col1, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y+2, s->s, col2, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y+2, s->s, col3, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+3, s->y+2, s->s, col2, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+4, s->y+2, s->s, col1, (s->y+2)/16, (s->y+2)&15 );
pixels.push_back( ptemp );
ptemp = { s.x, s.y+3, s.s, col1, (s.y+3)/16, (s.y+3)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+1, s.y+3, s.s, col2, (s.y+3)/16, (s.y+3)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y+3, s.s, col2, (s.y+3)/16, (s.y+3)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+3, s.y+3, s.s, col2, (s.y+3)/16, (s.y+3)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+4, s.y+3, s.s, col1, (s.y+3)/16, (s.y+3)&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y+3, s->s, col1, (s->y+3)/16, (s->y+3)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y+3, s->s, col2, (s->y+3)/16, (s->y+3)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y+3, s->s, col2, (s->y+3)/16, (s->y+3)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+3, s->y+3, s->s, col2, (s->y+3)/16, (s->y+3)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+4, s->y+3, s->s, col1, (s->y+3)/16, (s->y+3)&15 );
pixels.push_back( ptemp );
ptemp = { s.x+1, s.y+4, s.s, col1, (s.y+4)/16, (s.y+4)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+2, s.y+4, s.s, col1, (s.y+4)/16, (s.y+4)&15 }; pixels.push_back( ptemp );
ptemp = { s.x+3, s.y+4, s.s, col1, (s.y+4)/16, (s.y+4)&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x+1, s->y+4, s->s, col1, (s->y+4)/16, (s->y+4)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+2, s->y+4, s->s, col1, (s->y+4)/16, (s->y+4)&15 );
pixels.push_back( ptemp );
ptemp = new particle( s->x+3, s->y+4, s->s, col1, (s->y+4)/16, (s->y+4)&15 );
pixels.push_back( ptemp );
}
else
{
ptemp = { s.x, s.y, s.s, col3, s.y/16, s.y&15 }; pixels.push_back( ptemp );
ptemp = new particle( s->x, s->y, s->s, col3, s->y/16, s->y&15 );
pixels.push_back( ptemp );
}
}
for(auto&s : starfield)
delete(s);
starfield.clear();
}
void azrp_starfield_close( void )
{
for(auto&p : pixels)
delete(p);
pixels.clear();
for(auto&s : starfield)
delete(s);
starfield.clear();
}
struct command {
uint8_t shader_id;
uint8_t current_frag;
uint8_t nbpixel;
particle **data;
};
void azrp_starfield( void )
{
prof_enter(azrp_perf_cmdgen);
@ -206,12 +254,11 @@ void azrp_starfield( void )
for(int i=0; i<pixels.size(); i++)
{
pixels[i].y = (pixels[i].y + pixels[i].s) % 224;
pixels[i].frag = pixels[i].y / 16;
pixels[i].off = pixels[i].y & 15;
pixels[i]->y = (pixels[i]->y + pixels[i]->s) % 224;
pixels[i]->frag = pixels[i]->y / 16;
pixels[i]->off = pixels[i]->y & 15;
}
int fragmin = 0;
int fragcount = (223 >> 4) + 1;
@ -224,13 +271,15 @@ 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<cmd->nbpixel; i++)
if (cmd->current_frag == data[i].frag)
{
particle *data = cmd->data[i];
if (cmd->current_frag == data->frag)
{
frag[azrp_width * data[i].off + data[i].x] = data[i].c;
frag[azrp_width * data->off + data->x] = data->c;
}
}
cmd->current_frag++;
}