libpsys

diff src/psys.c @ 9:9c24273f211b

first test is done
author John Tsiombikas <nuclear@mutantstargoat.com>
date Wed, 28 Sep 2011 03:42:01 +0300
parents a10f19674147
children fbccc3c0d43e
line diff
     1.1 --- a/src/psys.c	Tue Sep 27 21:47:27 2011 +0300
     1.2 +++ b/src/psys.c	Wed Sep 28 03:42:01 2011 +0300
     1.3 @@ -204,6 +204,7 @@
     1.4  			struct psys_particle *tmp = p->next;
     1.5  			p->next = p->next->next;
     1.6  			pfree(tmp);
     1.7 +			em->pcount--;
     1.8  		} else {
     1.9  			p = p->next;
    1.10  		}
    1.11 @@ -211,6 +212,8 @@
    1.12  	em->plist = pdummy.next;
    1.13  
    1.14  	em->last_update = tm;
    1.15 +
    1.16 +	printf("particles: %5d\r", em->pcount);
    1.17  }
    1.18  
    1.19  void psys_draw(struct psys_emitter *em)
    1.20 @@ -240,8 +243,10 @@
    1.21  
    1.22  	p->pos = psys_eval_rnd3(&rpos);
    1.23  	p->vel = psys_eval_anm_rnd3(&em->attr.dir, PSYS_EVAL_CUR);
    1.24 -	p->size = psys_eval_anm_rnd(&em->attr.size, PSYS_EVAL_CUR);
    1.25 -	p->life = psys_eval_anm_rnd(&em->attr.life, PSYS_EVAL_CUR);
    1.26 +	p->base_size = psys_eval_anm_rnd(&em->attr.size, PSYS_EVAL_CUR);
    1.27 +	p->max_life = p->life = psys_eval_anm_rnd(&em->attr.life, PSYS_EVAL_CUR);
    1.28 +
    1.29 +	p->pattr = &em->attr.part_attr;
    1.30  
    1.31  	psys_add_particle(em, p);
    1.32  	return 0;
    1.33 @@ -250,6 +255,7 @@
    1.34  static void update_particle(struct psys_emitter *em, struct psys_particle *p, float tm, float dt, void *cls)
    1.35  {
    1.36  	vec3_t accel, grav;
    1.37 +	anm_time_t t;
    1.38  
    1.39  	grav = psys_get_cur_value3(&em->attr.grav);
    1.40  
    1.41 @@ -265,6 +271,13 @@
    1.42  	p->pos.y += p->vel.y * dt;
    1.43  	p->pos.z += p->vel.z * dt;
    1.44  
    1.45 +	/* update particle attributes */
    1.46 +	t = (anm_time_t)(1000.0 * (p->max_life - p->life) / p->max_life);
    1.47 +
    1.48 +	p->color = psys_get_value3(&p->pattr->color, t);
    1.49 +	p->alpha = psys_get_value(&p->pattr->alpha, t);
    1.50 +	p->size = p->base_size * psys_get_value(&p->pattr->size, t);
    1.51 +
    1.52  	p->life -= dt;
    1.53  }
    1.54