libpsys

view src/psys.h @ 3:133094e2f5a5

reorganizing
author John Tsiombikas <nuclear@mutantstargoat.com>
date Mon, 26 Sep 2011 18:20:11 +0300
parents 6e5342a2529a
children 613d2bf3ea1f
line source
1 #ifndef LIBPSYS_H_
2 #define LIBPSYS_H_
4 #include <vmath.h>
5 #include <anim/anim.h>
6 #include "rndval.h"
8 struct anm_track_vec3 {
9 struct anm_track x, y, z;
10 };
12 struct psys_plane {
13 plane_t p;
14 float elasticity;
15 struct psys_plane *next;
16 };
18 struct psys_particle;
20 struct psys_emitter {
21 float last_update;
23 unsigned int tex;
25 struct anm_node prs;
26 struct anm_track_vec3 pos_range;
28 struct anm_track rate;
29 struct anm_track life, life_range;
30 struct anm_track size, size_range;
31 struct anm_track_vec3 dir, dir_range;
32 struct anm_track_vec3 grav;
34 float drag; /* I don't think this needs to animate */
36 /* list of active particles */
37 struct psys_particle *plist;
39 /* list of collision planes */
40 struct col_plane *planes;
42 /* custom spawn closure */
43 void *spawn_cls;
44 psys_spawn_func_t spawn;
46 /* custom particle update closure */
47 void *upd_cls;
48 psys_update_func_t update;
50 /* custom draw closure */
51 void *draw_cls;
52 psys_draw_func_t draw;
53 psys_draw_start_func_t draw_start;
54 psys_draw_end_func_t draw_end;
56 /* calculated on update */
57 vec3_t cur_pos, cur_pos_range;
58 quat_t cur_rot;
59 float cur_rate, cur_life;
60 float cur_size, cur_size_range;
61 vec3_t cur_dir;
62 vec3_t cur_grav;
64 /* partial spawn accumulator */
65 float spawn_acc;
66 };
69 struct psys_particle {
70 vec3_t pos, vel;
71 float life, size;
73 struct psys_particle *next;
74 };
77 typedef int (*psys_spawn_func_t)(struct psys_emitter*, struct psys_particle*, void*);
78 typedef void (*psys_update_func_t)(struct psys_emitter*, struct psys_particle*, float, float, void*);
80 typedef void (*psys_draw_func_t)(struct psys_emitter*, struct psys_particle*, void*);
81 typedef void (*psys_draw_start_func_t)(struct psys_emitter*, void*);
82 typedef void (*psys_draw_end_func_t)(struct psys_emitter*, void*);
85 struct psys_emitter *psys_create(void);
86 void psys_free(struct psys_emitter *em);
88 int psys_init(struct psys_emitter *em);
89 void psys_destroy(struct psys_emitter *em);
91 /* set properties */
92 void psys_set_texture(struct psys_emitter *em, unsigned int tex);
94 void psys_set_pos(struct psys_emitter *em, vec3_t pos, vec3_t range, float tm);
95 void psys_set_rot(struct psys_emitter *em, quat_t rot, float tm);
96 void psys_set_pivot(struct psys_emitter *em, vec3_t pivot);
98 void psys_set_rate(struct psys_emitter *em, float rate, float tm);
99 void psys_set_life(struct psys_emitter *em, float life, float range, float tm);
100 void psys_set_size(struct psys_emitter *em, float size, float range, float tm);
101 void psys_set_dir(struct psys_emitter *em, vec3_t dir, vec3_t range, float tm);
102 void psys_set_grav(struct psys_emitter *em, vec3_t grav, float tm);
104 void psys_clear_collision_planes(struct psys_emitter *em);
105 int psys_add_collision_plane(struct psys_emitter *em, plane_t plane, float elast);
107 void psys_add_particle(struct psys_emitter *em, struct psys_particle *p);
109 void psys_spawn_func(struct psys_emitter *em, psys_spawn_func_t func, void *cls);
110 void psys_update_func(struct psys_emitter *em, psys_update_func_t func, void *cls);
111 void psys_draw_func(struct psys_emitter *em, psys_draw_func_t draw,
112 psys_draw_start_func_t start, psys_draw_end_func_t end, void *cls);
114 /* update and render */
116 void psys_update(struct psys_emitter *em, float tm);
117 void psys_draw(struct psys_emitter *em);
119 #endif /* LIBPSYS_H_ */