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 +}