libpsys

diff src/psys.c @ 2:6e5342a2529a

more stuff done
author John Tsiombikas <nuclear@mutantstargoat.com>
date Sun, 25 Sep 2011 04:26:51 +0300
parents 874a942853ad
children 133094e2f5a5
line diff
     1.1 --- a/src/psys.c	Sat Sep 24 20:44:42 2011 +0300
     1.2 +++ b/src/psys.c	Sun Sep 25 04:26:51 2011 +0300
     1.3 @@ -94,6 +94,11 @@
     1.4  	destroy_v3track(&em->dir);
     1.5  }
     1.6  
     1.7 +void psys_set_texture(struct psys_emitter *em, unsigned int tex)
     1.8 +{
     1.9 +	em->tex = tex;
    1.10 +}
    1.11 +
    1.12  void psys_set_pos(struct psys_emitter *em, vec3_t pos, float tm)
    1.13  {
    1.14  	anm_set_position(&em->prs, pos, ANM_SEC2TM(tm));
    1.15 @@ -184,6 +189,11 @@
    1.16  }
    1.17  
    1.18  /* --- query current state --- */
    1.19 +unsigned int psys_get_texture(struct psys_emitter *em)
    1.20 +{
    1.21 +	return em->tex;
    1.22 +}
    1.23 +
    1.24  vec3_t psys_get_pos(struct psys_emitter *em)
    1.25  {
    1.26  	return em->cur_pos;
    1.27 @@ -218,7 +228,7 @@
    1.28  
    1.29  void psys_update(struct psys_emitter *em, float tm)
    1.30  {
    1.31 -	float dt, spawn_dt;
    1.32 +	float dt, spawn_dt, spawn_tm;
    1.33  	int i, spawn_count;
    1.34  	struct psys_particle *p, pdummy;
    1.35  	anm_time_t atm;
    1.36 @@ -231,21 +241,23 @@
    1.37  	dt = tm - em->last_update;
    1.38  
    1.39  	/* how many particles to spawn for this interval ? */
    1.40 -	spawn_count = em->cur_rate * dt;
    1.41 +	em->spawn_acc += em->cur_rate * dt;
    1.42 +	if(em->spawn_acc >= 1.0) {
    1.43 +		spawn_count = em->spawn_acc;
    1.44 +		em->spawn_acc = fmod(em->spawn_acc, 1.0);
    1.45 +	} else {
    1.46 +		spawn_count = 0;
    1.47 +	}
    1.48  
    1.49 -#ifndef SUB_UPDATE_POS
    1.50 -	em->cur_pos = anm_get_position(&em->prs, atm);
    1.51 -#endif
    1.52  	em->cur_dir = get_v3value(&em->dir, atm);
    1.53  	em->cur_life = anm_get_value(&em->life, atm);
    1.54  	em->cur_grav = get_v3value(&em->grav, atm);
    1.55  
    1.56  	spawn_dt = dt / (float)spawn_count;
    1.57 +	spawn_tm = em->last_update;
    1.58  	for(i=0; i<spawn_count; i++) {
    1.59 -#ifdef SUB_UPDATE_POS
    1.60  		/* update emitter position for this spawning */
    1.61 -		em->cur_pos = anm_get_position(&em->prs, ANM_SEC2TM(em->last_update + spawn_dt));
    1.62 -#endif
    1.63 +		em->cur_pos = anm_get_position(&em->prs, ANM_SEC2TM(spawn_tm));
    1.64  
    1.65  		if(!(p = palloc())) {
    1.66  			return;
    1.67 @@ -253,6 +265,7 @@
    1.68  		if(em->spawn(em, p, em->spawn_cls) == -1) {
    1.69  			pfree(p);
    1.70  		}
    1.71 +		spawn_tm += spawn_dt;
    1.72  	}
    1.73  
    1.74  	/* update all particles */
    1.75 @@ -275,6 +288,8 @@
    1.76  		}
    1.77  	}
    1.78  	em->plist = pdummy.next;
    1.79 +
    1.80 +	em->last_update = tm;
    1.81  }
    1.82  
    1.83  void psys_draw(struct psys_emitter *em)
    1.84 @@ -322,6 +337,8 @@
    1.85  	p->pos.x += p->vel.x * dt;
    1.86  	p->pos.y += p->vel.y * dt;
    1.87  	p->pos.z += p->vel.z * dt;
    1.88 +
    1.89 +	p->life -= dt;
    1.90  }
    1.91  
    1.92  /* --- v3track helper --- */