7c56567e777884904249e7e33cead7bfe6af0cfa
[dosdemo] / tools / ropesim / src / ropesim.h
1 #ifndef ROPESIM_H_
2 #define ROPESIM_H_
3
4 #include "cgmath/cgmath.h"
5
6 struct rsim_mass {
7         cgm_vec3 p;
8         cgm_vec3 v;
9         cgm_vec3 f;
10         float m;
11         int fixed;
12
13         /* used for stringing fixed masses together */
14         struct rsim_mass *next;
15 };
16
17 struct rsim_spring {
18         float rest_len, k;
19         struct rsim_mass *mass[2];
20 };
21
22 struct rsim_rope {
23         struct rsim_mass *masses;
24         int num_masses;
25         struct rsim_spring *springs;
26         int num_springs;
27
28         /* elements of the masses array which are fixed */
29         struct rsim_mass *fixedlist;
30
31         struct rsim_rope *next;
32 };
33
34 struct rsim_world {
35         struct rsim_rope *ropes;        /* list of ropes to simulate */
36
37         cgm_vec3 grav, extforce;
38         float damping;
39
40         float udt;      /* microstepping delta (valid if > 0) */
41         float udelta_acc;       /* dt leftover accumulator for microstepping */
42 };
43
44 int rsim_init(struct rsim_world *rsim);
45 void rsim_destroy(struct rsim_world *rsim);
46
47 int rsim_add_rope(struct rsim_world *rsim, struct rsim_rope *rope);
48
49 void rsim_step(struct rsim_world *rsim, float dt);
50
51 struct rsim_rope *rsim_alloc_rope(int nmasses, int nsprings);
52 void rsim_free_rope(struct rsim_rope *rope);
53 int rsim_init_rope(struct rsim_rope *rope, int nmasses, int nsprings);
54 void rsim_destroy_rope(struct rsim_rope *rope);
55
56 int rsim_freeze_rope_mass(struct rsim_rope *rope, struct rsim_mass *m);
57 int rsim_unfreeze_rope_mass(struct rsim_rope *rope, struct rsim_mass *m);
58
59 #endif  /* ROPESIM_H_ */