libpsys

annotate 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
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_ */