dungeon_crawler

diff prototype/src/tile.cc @ 46:f3030df27110

debugging the particles
author John Tsiombikas <nuclear@mutantstargoat.com>
date Thu, 13 Sep 2012 06:33:51 +0300
parents dfd3a413ef9e
children aa9e28670ae2
line diff
     1.1 --- a/prototype/src/tile.cc	Wed Sep 12 06:04:20 2012 +0300
     1.2 +++ b/prototype/src/tile.cc	Thu Sep 13 06:33:51 2012 +0300
     1.3 @@ -1,4 +1,5 @@
     1.4  #include <stdio.h>
     1.5 +#include <ctype.h>
     1.6  #include <map>
     1.7  #include "opengl.h"
     1.8  #include <assimp/cimport.h>
     1.9 @@ -7,6 +8,7 @@
    1.10  #include "tile.h"
    1.11  #include "tileset.h"
    1.12  #include "renderer.h"
    1.13 +#include "datapath.h"
    1.14  
    1.15  using std::map;
    1.16  
    1.17 @@ -18,6 +20,7 @@
    1.18  Tile::Tile(TileSet *tileset)
    1.19  {
    1.20  	tset = tileset;
    1.21 +	last_upd = LONG_MIN;
    1.22  }
    1.23  
    1.24  Tile::~Tile()
    1.25 @@ -28,18 +31,20 @@
    1.26  	for(auto lt : lights) {
    1.27  		delete lt;
    1.28  	}
    1.29 -	for(auto ps : psattr) {
    1.30 -		psys_destroy_attr(ps);
    1.31 -		delete ps;
    1.32 +	for(auto psa : psattr) {
    1.33 +		psys_free_attr(psa);
    1.34 +	}
    1.35 +	for(auto ps : psys_global) {
    1.36 +		psys_free(ps);
    1.37  	}
    1.38  }
    1.39  
    1.40 -const struct psys_attributes **get_unique_psys() const
    1.41 +const struct psys_attributes * const *Tile::get_unique_psys() const
    1.42  {
    1.43  	return &psattr[0];
    1.44  }
    1.45  
    1.46 -int get_unique_psys_count() const
    1.47 +int Tile::get_unique_psys_count() const
    1.48  {
    1.49  	return (int)psattr.size();
    1.50  }
    1.51 @@ -85,7 +90,10 @@
    1.52  
    1.53  void Tile::update(unsigned long msec, float dt)
    1.54  {
    1.55 -	// TODO particle system update
    1.56 +	// update particle systems
    1.57 +	for(auto ps : psys_global) {
    1.58 +		psys_update(ps, (float)msec / 1000.0f);
    1.59 +	}
    1.60  }
    1.61  
    1.62  void Tile::draw(unsigned int draw_mask) const
    1.63 @@ -106,6 +114,16 @@
    1.64  	}
    1.65  }
    1.66  
    1.67 +void Tile::draw_post(unsigned int draw_mask) const
    1.68 +{
    1.69 +	// draw global particle systems (simulated once)
    1.70 +	for(size_t i=0; i<psys_global.size(); i++) {
    1.71 +		if(psys_side[i] & draw_mask) {
    1.72 +			psys_draw(psys_global[i]);
    1.73 +		}
    1.74 +	}
    1.75 +}
    1.76 +
    1.77  /*
    1.78  int Tile::load_lights(const aiScene *scn)
    1.79  {
    1.80 @@ -214,6 +232,17 @@
    1.81  			}
    1.82  			delete mesh;
    1.83  
    1.84 +			// ... ALSO add a fire particle system :) save me jebus
    1.85 +			struct psys_emitter *ps = psys_create();
    1.86 +			if(ps && psys_load_attr(&ps->attr, datafile_path("fire.psys")) == 0) {
    1.87 +				Vector3 lpos = lt->get_position();
    1.88 +				psys_set_pos(ps, v3_cons(lpos.x, lpos.y, lpos.z), 0);
    1.89 +				psys_global.push_back(ps);
    1.90 +				psys_side.push_back(side);
    1.91 +			} else {
    1.92 +				fprintf(stderr, "failed to create global particle system\n");
    1.93 +			}
    1.94 +
    1.95  		} else {
    1.96  			meshes.push_back(mesh);
    1.97  			mesh_side.push_back(side);