summaryrefslogtreecommitdiff
path: root/libphysics/body.c
diff options
context:
space:
mode:
Diffstat (limited to 'libphysics/body.c')
-rw-r--r--libphysics/body.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/libphysics/body.c b/libphysics/body.c
new file mode 100644
index 0000000..4ea05bd
--- /dev/null
+++ b/libphysics/body.c
@@ -0,0 +1,81 @@
+#include <vecmath.h>
+#include <physics.h>
+#include <stdlib.h>
+
+#include "dat.h"
+
+#define POOL_SIZE 2048
+
+Body phxbodypool[POOL_SIZE];
+int phxbodypoolsize;
+
+static Body *allocbody(void);
+
+Body *
+phxnew(BodyType type)
+{
+ Body *b;
+
+ if((b = allocbody()) == NULL)
+ return b;
+
+ b->type = type;
+ return b;
+}
+
+void
+phxdel(Body *b)
+{
+ b->active = 0;
+}
+
+void
+phxsetpos(Body *b, float x, float y)
+{
+ b->pos[0] = x;
+ b->pos[1] = y;
+}
+
+void
+phxsetsize(Body *b, float w, float h)
+{
+ b->size[0] = w;
+ b->size[1] = h;
+}
+
+void
+phxgetpos(Body *b, float p[2])
+{
+ vec2_dup(p, b->pos);
+}
+
+void
+phxgetsize(Body *b, float p[2])
+{
+ vec2_dup(p, b->size);
+}
+
+void
+phxapplyaccel(Body *b, float a[2])
+{
+ vec2_add(b->accel, b->accel, a);
+}
+
+Body *
+allocbody(void)
+{
+ int i;
+ for(i = 0; i < phxbodypoolsize; i++) {
+ if(!phxbodypool[i].active)
+ break;
+ }
+
+ if(i >= phxbodypoolsize) {
+ if(phxbodypoolsize == POOL_SIZE)
+ return NULL;
+ i = phxbodypoolsize++;
+ }
+
+ phxbodypool[i].active = 1;
+ return phxbodypool + i;
+}