libpsys

diff src/psys.c @ 3:133094e2f5a5

reorganizing
author John Tsiombikas <nuclear@mutantstargoat.com>
date Mon, 26 Sep 2011 18:20:11 +0300
parents 6e5342a2529a
children 0fe624ffcb4f
line diff
     1.1 --- a/src/psys.c	Sun Sep 25 04:26:51 2011 +0300
     1.2 +++ b/src/psys.c	Mon Sep 26 18:20:11 2011 +0300
     1.3 @@ -13,6 +13,9 @@
     1.4  static void set_v3value(struct v3track *v3t, anm_time_t tm, vec3_t v);
     1.5  static vec3_t get_v3value(struct v3track *v3t, anm_time_t tm);
     1.6  
     1.7 +static float random_val(float x, float range);
     1.8 +static vec3_t random_vec3(vec3_t v, vec3_t range);
     1.9 +
    1.10  /* particle pool */
    1.11  static struct psys_particle *ppool;
    1.12  static int ppool_size;
    1.13 @@ -47,26 +50,26 @@
    1.14  {
    1.15  	memset(em, 0, sizeof *em);
    1.16  
    1.17 -	if(anm_init_node(&em->prs) == -1) {
    1.18 -		psys_destroy(em);
    1.19 -		return -1;
    1.20 -	}
    1.21 -	if(anm_init_track(&em->rate) == -1) {
    1.22 -		psys_destroy(em);
    1.23 -		return -1;
    1.24 -	}
    1.25 -	if(anm_init_track(&em->life) == -1) {
    1.26 -		psys_destroy(em);
    1.27 -		return -1;
    1.28 -	}
    1.29 -	if(init_v3track(&em->dir) == -1) {
    1.30 -		psys_destroy(em);
    1.31 -		return -1;
    1.32 -	}
    1.33 -	if(init_v3track(&em->grav) == -1) {
    1.34 -		psys_destroy(em);
    1.35 -		return -1;
    1.36 -	}
    1.37 +	if(anm_init_node(&em->prs) == -1)
    1.38 +		goto err;
    1.39 +	if(init_v3track(&em->pos_range) == -1)
    1.40 +		goto err;
    1.41 +	if(anm_init_track(&em->rate) == -1)
    1.42 +		goto err;
    1.43 +	if(anm_init_track(&em->life) == -1)
    1.44 +		goto err;
    1.45 +	if(anm_init_track(&em->life_range) == -1)
    1.46 +		goto err;
    1.47 +	if(anm_init_track(&em->size) == -1)
    1.48 +		goto err;
    1.49 +	if(anm_init_track(&em->size_range) == -1)
    1.50 +		goto err;
    1.51 +	if(init_v3track(&em->dir) == -1)
    1.52 +		goto err;
    1.53 +	if(init_v3track(&em->dir_range) == -1)
    1.54 +		goto err;
    1.55 +	if(init_v3track(&em->grav) == -1)
    1.56 +		goto err;
    1.57  
    1.58  	em->spawn = spawn;
    1.59  	em->update = update_particle;
    1.60 @@ -76,6 +79,9 @@
    1.61  	em->draw_end = psys_gl_draw_end;
    1.62  
    1.63  	return 0;
    1.64 +err:
    1.65 +	psys_destroy(em);
    1.66 +	return -1;
    1.67  }
    1.68  
    1.69  void psys_destroy(struct psys_emitter *em)
    1.70 @@ -90,8 +96,14 @@
    1.71  	}
    1.72  
    1.73  	anm_destroy_node(&em->prs);
    1.74 +	destroy_v3track(&em->pos_range);
    1.75  	anm_destroy_track(&em->rate);
    1.76 +	anm_destroy_track(&em->life);
    1.77 +	anm_destroy_track(&em->size);
    1.78 +	anm_destroy_track(&em->size_range);
    1.79  	destroy_v3track(&em->dir);
    1.80 +	destroy_v3track(&em->dir_range);
    1.81 +	destroy_v3track(&em->grav);
    1.82  }
    1.83  
    1.84  void psys_set_texture(struct psys_emitter *em, unsigned int tex)
    1.85 @@ -99,9 +111,10 @@
    1.86  	em->tex = tex;
    1.87  }
    1.88  
    1.89 -void psys_set_pos(struct psys_emitter *em, vec3_t pos, float tm)
    1.90 +void psys_set_pos(struct psys_emitter *em, vec3_t pos, vec3_t range, float tm)
    1.91  {
    1.92  	anm_set_position(&em->prs, pos, ANM_SEC2TM(tm));
    1.93 +	set_v3value(&em->pos_range, ANM_SEC2TM(tm), range);
    1.94  }
    1.95  
    1.96  void psys_set_rot(struct psys_emitter *em, quat_t rot, float tm)
    1.97 @@ -119,14 +132,22 @@
    1.98  	anm_set_value(&em->rate, ANM_SEC2TM(tm), rate);
    1.99  }
   1.100  
   1.101 -void psys_set_life(struct psys_emitter *em, float life, float tm)
   1.102 +void psys_set_life(struct psys_emitter *em, float life, float range, float tm)
   1.103  {
   1.104  	anm_set_value(&em->life, ANM_SEC2TM(tm), life);
   1.105 +	anm_set_value(&em->life_range, ANM_SEC2TM(tm), range);
   1.106  }
   1.107  
   1.108 -void psys_set_dir(struct psys_emitter *em, vec3_t dir, float tm)
   1.109 +void psys_set_size(struct psys_emitter *em, float size, float range, float tm)
   1.110 +{
   1.111 +	anm_set_value(&em->size, ANM_SEC2TM(tm), size);
   1.112 +	anm_set_value(&em->size_range, ANM_SEC2TM(tm), range);
   1.113 +}
   1.114 +
   1.115 +void psys_set_dir(struct psys_emitter *em, vec3_t dir, vec3_t range, float tm)
   1.116  {
   1.117  	set_v3value(&em->dir, ANM_SEC2TM(tm), dir);
   1.118 +	set_v3value(&em->dir_range, ANM_SEC2TM(tm), range);
   1.119  }
   1.120  
   1.121  void psys_set_grav(struct psys_emitter *em, vec3_t grav, float tm)
   1.122 @@ -313,9 +334,9 @@
   1.123  
   1.124  static int spawn(struct psys_emitter *em, struct psys_particle *p, void *cls)
   1.125  {
   1.126 -	p->pos = em->cur_pos;
   1.127 -	p->vel = em->cur_dir;
   1.128 -	p->size = 1.0;
   1.129 +	p->pos = random_vec3(em->cur_pos, em->cur_pos_range);
   1.130 +	p->vel = random_vec3(em->cur_dir, em->dir_range);
   1.131 +	p->size = random_val(em->cur_size, em->cur_size_range);
   1.132  	p->life = em->cur_life;
   1.133  
   1.134  	psys_add_particle(em, p);
   1.135 @@ -414,3 +435,17 @@
   1.136  	ppool_size++;
   1.137  	pthread_mutex_unlock(&pool_lock);
   1.138  }
   1.139 +
   1.140 +static float random_val(float x, float range)
   1.141 +{
   1.142 +	return x + range * (float)rand() / (float)RAND_MAX - 0.5 * range;
   1.143 +}
   1.144 +
   1.145 +static vec3_t random_vec3(vec3_t v, vec3_t range)
   1.146 +{
   1.147 +	vec3_t res;
   1.148 +	res.x = random_val(v.x, range.x);
   1.149 +	res.y = random_val(v.y, range.y);
   1.150 +	res.z = random_val(v.z, range.z);
   1.151 +	return res;
   1.152 +}