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