From 52c18741bdb15e1ad36253f7dec4991f3246920e Mon Sep 17 00:00:00 2001 From: Slyvtt Date: Sun, 15 Jan 2023 17:38:37 +0100 Subject: [PATCH] Improvement of std::vector with dynamic allocation of particle* --- CMakeLists.txt | 3 - src/main.cpp | 2 +- src/starfieldshader.cpp | 247 ++++++++++++++++++++++++---------------- 3 files changed, 149 insertions(+), 103 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e2dea1..da6aa6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 # ... ) diff --git a/src/main.cpp b/src/main.cpp index 3842d1f..be2c1f4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,7 +22,7 @@ #include "utilities.h" #include "particles.h" -#include "starfield.h" + #include #include diff --git a/src/starfieldshader.cpp b/src/starfieldshader.cpp index 7ad9811..b02529b 100644 --- a/src/starfieldshader.cpp +++ b/src/starfieldshader.cpp @@ -10,47 +10,6 @@ #include -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 pixels; -std::vector 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 pixels; +std::vector 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; ix = 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; iy = (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; inbpixel; 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++; } \ No newline at end of file