Improvement of std::vector with dynamic allocation of particle*
This commit is contained in:
parent
f33cb39837
commit
52c18741bd
|
@ -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
|
||||
# ...
|
||||
)
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
#include "utilities.h"
|
||||
#include "particles.h"
|
||||
#include "starfield.h"
|
||||
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
|
|
@ -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++;
|
||||
}
|
Loading…
Reference in New Issue