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 --- */