libpsys
diff src/psys.c @ 5:613d2bf3ea1f
almost finished with the reorg
author | John Tsiombikas <nuclear@mutantstargoat.com> |
---|---|
date | Tue, 27 Sep 2011 07:42:32 +0300 |
parents | 0fe624ffcb4f |
children | 3c0a306c5f01 |
line diff
1.1 --- a/src/psys.c Mon Sep 26 18:25:18 2011 +0300 1.2 +++ b/src/psys.c Tue Sep 27 07:42:32 2011 +0300 1.3 @@ -3,19 +3,12 @@ 1.4 #include <assert.h> 1.5 #include <pthread.h> 1.6 #include <vmath.h> 1.7 -#include "psys_impl.h" 1.8 +#include "psys.h" 1.9 +#include "psys_gl.h" 1.10 1.11 static int spawn(struct psys_emitter *em, struct psys_particle *p, void *cls); 1.12 static void update_particle(struct psys_emitter *em, struct psys_particle *p, float tm, float dt, void *cls); 1.13 1.14 -static int init_anm_track_vec3(struct anm_track_vec3 *v3t); 1.15 -static void destroy_anm_track_vec3(struct anm_track_vec3 *v3t); 1.16 -static void set_v3value(struct anm_track_vec3 *v3t, anm_time_t tm, vec3_t v); 1.17 -static vec3_t get_v3value(struct anm_track_vec3 *v3t, anm_time_t tm); 1.18 - 1.19 -static float random_val(float x, float range); 1.20 -static vec3_t random_vec3(vec3_t v, vec3_t range); 1.21 - 1.22 /* particle pool */ 1.23 static struct psys_particle *ppool; 1.24 static int ppool_size; 1.25 @@ -50,26 +43,13 @@ 1.26 { 1.27 memset(em, 0, sizeof *em); 1.28 1.29 - if(anm_init_node(&em->prs) == -1) 1.30 - goto err; 1.31 - if(init_anm_track_vec3(&em->pos_range) == -1) 1.32 - goto err; 1.33 - if(anm_init_track(&em->rate) == -1) 1.34 - goto err; 1.35 - if(anm_init_track(&em->life) == -1) 1.36 - goto err; 1.37 - if(anm_init_track(&em->life_range) == -1) 1.38 - goto err; 1.39 - if(anm_init_track(&em->size) == -1) 1.40 - goto err; 1.41 - if(anm_init_track(&em->size_range) == -1) 1.42 - goto err; 1.43 - if(init_anm_track_vec3(&em->dir) == -1) 1.44 - goto err; 1.45 - if(init_anm_track_vec3(&em->dir_range) == -1) 1.46 - goto err; 1.47 - if(init_anm_track_vec3(&em->grav) == -1) 1.48 - goto err; 1.49 + if(anm_init_node(&em->prs) == -1) { 1.50 + return -1; 1.51 + } 1.52 + if(psys_init_attr(&em->attr) == -1) { 1.53 + anm_destroy_node(&em->prs); 1.54 + return -1; 1.55 + } 1.56 1.57 em->spawn = spawn; 1.58 em->update = update_particle; 1.59 @@ -77,11 +57,7 @@ 1.60 em->draw = psys_gl_draw; 1.61 em->draw_start = psys_gl_draw_start; 1.62 em->draw_end = psys_gl_draw_end; 1.63 - 1.64 return 0; 1.65 -err: 1.66 - psys_destroy(em); 1.67 - return -1; 1.68 } 1.69 1.70 void psys_destroy(struct psys_emitter *em) 1.71 @@ -95,26 +71,12 @@ 1.72 pfree(tmp); 1.73 } 1.74 1.75 - anm_destroy_node(&em->prs); 1.76 - destroy_anm_track_vec3(&em->pos_range); 1.77 - anm_destroy_track(&em->rate); 1.78 - anm_destroy_track(&em->life); 1.79 - anm_destroy_track(&em->size); 1.80 - anm_destroy_track(&em->size_range); 1.81 - destroy_anm_track_vec3(&em->dir); 1.82 - destroy_anm_track_vec3(&em->dir_range); 1.83 - destroy_anm_track_vec3(&em->grav); 1.84 + psys_destroy_attr(&em->attr); 1.85 } 1.86 1.87 -void psys_set_texture(struct psys_emitter *em, unsigned int tex) 1.88 -{ 1.89 - em->tex = tex; 1.90 -} 1.91 - 1.92 -void psys_set_pos(struct psys_emitter *em, vec3_t pos, vec3_t range, float tm) 1.93 +void psys_set_pos(struct psys_emitter *em, vec3_t pos, float tm) 1.94 { 1.95 anm_set_position(&em->prs, pos, ANM_SEC2TM(tm)); 1.96 - set_v3value(&em->pos_range, ANM_SEC2TM(tm), range); 1.97 } 1.98 1.99 void psys_set_rot(struct psys_emitter *em, quat_t rot, float tm) 1.100 @@ -127,42 +89,13 @@ 1.101 anm_set_pivot(&em->prs, pivot); 1.102 } 1.103 1.104 -void psys_set_rate(struct psys_emitter *em, float rate, float tm) 1.105 -{ 1.106 - anm_set_value(&em->rate, ANM_SEC2TM(tm), rate); 1.107 -} 1.108 - 1.109 -void psys_set_life(struct psys_emitter *em, float life, float range, float tm) 1.110 -{ 1.111 - anm_set_value(&em->life, ANM_SEC2TM(tm), life); 1.112 - anm_set_value(&em->life_range, ANM_SEC2TM(tm), range); 1.113 -} 1.114 - 1.115 -void psys_set_size(struct psys_emitter *em, float size, float range, float tm) 1.116 -{ 1.117 - anm_set_value(&em->size, ANM_SEC2TM(tm), size); 1.118 - anm_set_value(&em->size_range, ANM_SEC2TM(tm), range); 1.119 -} 1.120 - 1.121 -void psys_set_dir(struct psys_emitter *em, vec3_t dir, vec3_t range, float tm) 1.122 -{ 1.123 - set_v3value(&em->dir, ANM_SEC2TM(tm), dir); 1.124 - set_v3value(&em->dir_range, ANM_SEC2TM(tm), range); 1.125 -} 1.126 - 1.127 -void psys_set_grav(struct psys_emitter *em, vec3_t grav, float tm) 1.128 -{ 1.129 - set_v3value(&em->grav, ANM_SEC2TM(tm), grav); 1.130 -} 1.131 - 1.132 - 1.133 void psys_clear_collision_planes(struct psys_emitter *em) 1.134 { 1.135 - struct col_plane *plane; 1.136 + struct psys_plane *plane; 1.137 1.138 plane = em->planes; 1.139 while(plane) { 1.140 - struct col_plane *tmp = plane; 1.141 + struct psys_plane *tmp = plane; 1.142 plane = plane->next; 1.143 free(tmp); 1.144 } 1.145 @@ -170,7 +103,7 @@ 1.146 1.147 int psys_add_collision_plane(struct psys_emitter *em, plane_t plane, float elast) 1.148 { 1.149 - struct col_plane *node; 1.150 + struct psys_plane *node; 1.151 1.152 if(!(node = malloc(sizeof *node))) { 1.153 return -1; 1.154 @@ -186,6 +119,8 @@ 1.155 { 1.156 p->next = em->plist; 1.157 em->plist = p; 1.158 + 1.159 + em->pcount++; 1.160 } 1.161 1.162 void psys_spawn_func(struct psys_emitter *em, psys_spawn_func_t func, void *cls) 1.163 @@ -216,17 +151,19 @@ 1.164 float dt, spawn_dt, spawn_tm; 1.165 int i, spawn_count; 1.166 struct psys_particle *p, pdummy; 1.167 - anm_time_t atm; 1.168 + anm_time_t atm = ANM_SEC2TM(tm); 1.169 1.170 assert(em->spawn && em->update); 1.171 1.172 - atm = ANM_SEC2TM(tm); 1.173 + dt = tm - em->last_update; 1.174 + if(dt <= 0.0) { 1.175 + return; 1.176 + } 1.177 1.178 - em->cur_rate = anm_get_value(&em->rate, atm); 1.179 - dt = tm - em->last_update; 1.180 + psys_eval_attr(&em->attr, atm); 1.181 1.182 /* how many particles to spawn for this interval ? */ 1.183 - em->spawn_acc += em->cur_rate * dt; 1.184 + em->spawn_acc += psys_get_cur_value(&em->attr.rate) * dt; 1.185 if(em->spawn_acc >= 1.0) { 1.186 spawn_count = em->spawn_acc; 1.187 em->spawn_acc = fmod(em->spawn_acc, 1.0); 1.188 @@ -234,13 +171,13 @@ 1.189 spawn_count = 0; 1.190 } 1.191 1.192 - em->cur_dir = get_v3value(&em->dir, atm); 1.193 - em->cur_life = anm_get_value(&em->life, atm); 1.194 - em->cur_grav = get_v3value(&em->grav, atm); 1.195 - 1.196 spawn_dt = dt / (float)spawn_count; 1.197 spawn_tm = em->last_update; 1.198 for(i=0; i<spawn_count; i++) { 1.199 + if(em->pcount >= em->attr.max_particles) { 1.200 + break; 1.201 + } 1.202 + 1.203 /* update emitter position for this spawning */ 1.204 em->cur_pos = anm_get_position(&em->prs, ANM_SEC2TM(spawn_tm)); 1.205 1.206 @@ -298,10 +235,14 @@ 1.207 1.208 static int spawn(struct psys_emitter *em, struct psys_particle *p, void *cls) 1.209 { 1.210 - p->pos = random_vec3(em->cur_pos, em->cur_pos_range); 1.211 - p->vel = random_vec3(em->cur_dir, em->dir_range); 1.212 - p->size = random_val(em->cur_size, em->cur_size_range); 1.213 - p->life = em->cur_life; 1.214 + struct psys_rnd3 rpos; 1.215 + rpos.value = em->cur_pos; 1.216 + rpos.range = psys_get_cur_value3(&em->attr.spawn_range); 1.217 + 1.218 + p->pos = psys_eval_rnd3(&rpos); 1.219 + p->vel = psys_eval_anm_rnd3(&em->attr.dir, PSYS_EVAL_CUR); 1.220 + p->size = psys_eval_anm_rnd(&em->attr.size, PSYS_EVAL_CUR); 1.221 + p->life = psys_eval_anm_rnd(&em->attr.life, PSYS_EVAL_CUR); 1.222 1.223 psys_add_particle(em, p); 1.224 return 0; 1.225 @@ -309,11 +250,13 @@ 1.226 1.227 static void update_particle(struct psys_emitter *em, struct psys_particle *p, float tm, float dt, void *cls) 1.228 { 1.229 - vec3_t accel; 1.230 + vec3_t accel, grav; 1.231 1.232 - accel.x = em->cur_grav.x - p->vel.x * em->drag; 1.233 - accel.y = em->cur_grav.y - p->vel.y * em->drag; 1.234 - accel.z = em->cur_grav.z - p->vel.z * em->drag; 1.235 + grav = psys_get_cur_value3(&em->attr.grav); 1.236 + 1.237 + accel.x = grav.x - p->vel.x * em->attr.drag; 1.238 + accel.y = grav.y - p->vel.y * em->attr.drag; 1.239 + accel.z = grav.z - p->vel.z * em->attr.drag; 1.240 1.241 p->vel.x += accel.x * dt; 1.242 p->vel.y += accel.y * dt; 1.243 @@ -326,48 +269,6 @@ 1.244 p->life -= dt; 1.245 } 1.246 1.247 -/* --- anm_track_vec3 helper --- */ 1.248 - 1.249 -int init_anm_track_vec3(struct anm_track_vec3 *v3t) 1.250 -{ 1.251 - if(anm_init_track(&v3t->x) == -1) { 1.252 - return -1; 1.253 - } 1.254 - if(anm_init_track(&v3t->y) == -1) { 1.255 - anm_destroy_track(&v3t->x); 1.256 - return -1; 1.257 - } 1.258 - if(anm_init_track(&v3t->z) == -1) { 1.259 - anm_destroy_track(&v3t->x); 1.260 - anm_destroy_track(&v3t->y); 1.261 - return -1; 1.262 - } 1.263 - return 0; 1.264 -} 1.265 - 1.266 -static void destroy_anm_track_vec3(struct anm_track_vec3 *v3t) 1.267 -{ 1.268 - anm_destroy_track(&v3t->x); 1.269 - anm_destroy_track(&v3t->y); 1.270 - anm_destroy_track(&v3t->z); 1.271 -} 1.272 - 1.273 -static void set_v3value(struct anm_track_vec3 *v3t, anm_time_t tm, vec3_t v) 1.274 -{ 1.275 - anm_set_value(&v3t->x, tm, v.x); 1.276 - anm_set_value(&v3t->y, tm, v.y); 1.277 - anm_set_value(&v3t->z, tm, v.z); 1.278 -} 1.279 - 1.280 -static vec3_t get_v3value(struct anm_track_vec3 *v3t, anm_time_t tm) 1.281 -{ 1.282 - vec3_t v; 1.283 - v.x = anm_get_value(&v3t->x, tm); 1.284 - v.y = anm_get_value(&v3t->y, tm); 1.285 - v.z = anm_get_value(&v3t->z, tm); 1.286 - return v; 1.287 -} 1.288 - 1.289 /* --- particle allocation pool --- */ 1.290 1.291 static struct psys_particle *palloc(void) 1.292 @@ -384,10 +285,6 @@ 1.293 } 1.294 pthread_mutex_unlock(&pool_lock); 1.295 1.296 - if(p) { 1.297 - memset(p, 0, sizeof *p); 1.298 - /*reset_pattr(&p->attr);*/ 1.299 - } 1.300 return p; 1.301 } 1.302 1.303 @@ -399,17 +296,3 @@ 1.304 ppool_size++; 1.305 pthread_mutex_unlock(&pool_lock); 1.306 } 1.307 - 1.308 -static float random_val(float x, float range) 1.309 -{ 1.310 - return x + range * (float)rand() / (float)RAND_MAX - 0.5 * range; 1.311 -} 1.312 - 1.313 -static vec3_t random_vec3(vec3_t v, vec3_t range) 1.314 -{ 1.315 - vec3_t res; 1.316 - res.x = random_val(v.x, range.x); 1.317 - res.y = random_val(v.y, range.y); 1.318 - res.z = random_val(v.z, range.z); 1.319 - return res; 1.320 -}