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