# HG changeset patch # User John Tsiombikas # Date 1347419060 -10800 # Node ID dfd3a413ef9e7e6a60324f9b842615045d77682a # Parent c45c42c3d32e4f1a9aa7d8a4332c65b718d59a78 particle system 1 diff -r c45c42c3d32e -r dfd3a413ef9e prototype/src/level.cc --- a/prototype/src/level.cc Thu Aug 30 06:08:22 2012 +0300 +++ b/prototype/src/level.cc Wed Sep 12 06:04:20 2012 +0300 @@ -208,13 +208,27 @@ GridCell::GridCell(Tile *tile) { if(tile) { - tiles.push_back(tile); + add_tile(tile); } } void GridCell::add_tile(Tile *tile) { + if(!tile) { + return; + } + tiles.push_back(tile); + + /* instanciate any particle systems */ + const struct psys_attributes **psattr = tile->get_unique_psys(); + int num_psattr = tile->get_unique_psys_count(); + + for(int i=0; iattr = *psattr[i]; + psys.push_back(emitter); + } } void GridCell::update(unsigned long msec, float dt) @@ -222,6 +236,9 @@ for(auto tile : tiles) { tile->update(msec, dt); } + for(auto ps : psys) { + psys_update(ps, (float)msec / 1000.0f); + } } void GridCell::draw(unsigned int draw_mask) const @@ -237,3 +254,13 @@ tile->draw_lights(draw_mask); } } + +void GridCell::draw_post(unsigned int draw_mask) const +{ + for(auto tile : tiles) { + tile->draw_post(draw_mask); + } + for(auto ps : psys) { + psys_draw(ps); + } +} diff -r c45c42c3d32e -r dfd3a413ef9e prototype/src/level.h --- a/prototype/src/level.h Thu Aug 30 06:08:22 2012 +0300 +++ b/prototype/src/level.h Wed Sep 12 06:04:20 2012 +0300 @@ -3,6 +3,7 @@ #include #include "vmath/vmath.h" +#include "psys/psys.h" class GridCell; class Tile; @@ -43,6 +44,9 @@ // each grid-cell might contain multiple tiles. std::vector tiles; + // particle systems + std::vector psys; + public: GridCell(Tile *tile = 0); diff -r c45c42c3d32e -r dfd3a413ef9e prototype/src/tile.cc --- a/prototype/src/tile.cc Thu Aug 30 06:08:22 2012 +0300 +++ b/prototype/src/tile.cc Wed Sep 12 06:04:20 2012 +0300 @@ -34,6 +34,16 @@ } } +const struct psys_attributes **get_unique_psys() const +{ + return &psattr[0]; +} + +int get_unique_psys_count() const +{ + return (int)psattr.size(); +} + bool Tile::load(const char *fname) { if(!fname) { diff -r c45c42c3d32e -r dfd3a413ef9e prototype/src/tile.h --- a/prototype/src/tile.h Thu Aug 30 06:08:22 2012 +0300 +++ b/prototype/src/tile.h Wed Sep 12 06:04:20 2012 +0300 @@ -25,7 +25,10 @@ std::vector meshes; std::vector mesh_side, light_side; std::vector lights; + // attributes for gridcell-unique particle systems std::vector psattr; + // global particle systems (simulated once, drawn for each tile instance). + std::vector psys_global; int load_lights(const aiScene *scn); int load_meshes(const aiScene *scn, const std::map &nmap); @@ -34,12 +37,16 @@ Tile(TileSet *tileset = 0); ~Tile(); + const struct psys_attributes **get_unique_psys() const; + int get_unique_psys_count() const; + bool load(const char *fname); void update(unsigned long msec, float dt); void draw(unsigned int drawmask) const; void draw_lights(unsigned int drawmask) const; + void draw_psys(unsigned int drawmask) const; };