summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/physics.h20
-rw-r--r--libphysics/body.c42
-rw-r--r--libphysics/test/vis.c10
-rw-r--r--libphysics/tick.c4
4 files changed, 38 insertions, 38 deletions
diff --git a/include/physics.h b/include/physics.h
index 8a43915..5c4f377 100644
--- a/include/physics.h
+++ b/include/physics.h
@@ -1,3 +1,5 @@
+typedef int BodyID;
+
typedef enum {
BTYPE_AABB,
BTYPE_TILEMAP,
@@ -5,21 +7,21 @@ typedef enum {
typedef struct Body Body;
typedef struct CollisionEvent {
- Body *body1;
- Body *body2;
+ BodyID body1;
+ BodyID body2;
} CollisionEvent;
-Body *phxnew(BodyType type);
-void phxdel(Body *);
+BodyID phxnew(BodyType type);
+void phxdel(BodyID);
void phxsetmap(int w, int h, int *tiles);
-void phxsetpos(Body *, float x, float y);
-void phxsetsize(Body *, float w, float h);
-void phxapplyaccel(Body *, float f[2]);
+void phxsetpos(BodyID, float x, float y);
+void phxsetsize(BodyID, float w, float h);
+void phxapplyaccel(BodyID, float f[2]);
-void phxgetpos(Body *, float pos[2]);
-void phxgetsize(Body *, float size[2]);
+void phxgetpos(BodyID, float pos[2]);
+void phxgetsize(BodyID, float size[2]);
int phxnextcollevent(CollisionEvent *ev);
void phxtick(float delta);
diff --git a/libphysics/body.c b/libphysics/body.c
index 4ea05bd..51a352d 100644
--- a/libphysics/body.c
+++ b/libphysics/body.c
@@ -9,59 +9,57 @@
Body phxbodypool[POOL_SIZE];
int phxbodypoolsize;
-static Body *allocbody(void);
+static BodyID allocbody(void);
-Body *
+BodyID
phxnew(BodyType type)
{
- Body *b;
+ BodyID b;
- if((b = allocbody()) == NULL)
+ if((b = allocbody()) == -1)
return b;
- b->type = type;
+ phxbodypool[b].type = type;
return b;
}
void
-phxdel(Body *b)
+phxdel(BodyID id)
{
- b->active = 0;
+ phxbodypool[id].active = 0;
}
void
-phxsetpos(Body *b, float x, float y)
+phxsetpos(BodyID b, float x, float y)
{
- b->pos[0] = x;
- b->pos[1] = y;
+ vec2_dup(phxbodypool[b].pos, (vec2){ x, y });
}
void
-phxsetsize(Body *b, float w, float h)
+phxsetsize(BodyID b, float w, float h)
{
- b->size[0] = w;
- b->size[1] = h;
+ vec2_dup(phxbodypool[b].size, (vec2){ w, h });
}
void
-phxgetpos(Body *b, float p[2])
+phxgetpos(BodyID b, float p[2])
{
- vec2_dup(p, b->pos);
+ vec2_dup(p, phxbodypool[b].pos);
}
void
-phxgetsize(Body *b, float p[2])
+phxgetsize(BodyID b, float p[2])
{
- vec2_dup(p, b->size);
+ vec2_dup(p, phxbodypool[b].size);
}
void
-phxapplyaccel(Body *b, float a[2])
+phxapplyaccel(BodyID b, float a[2])
{
- vec2_add(b->accel, b->accel, a);
+ vec2_add(phxbodypool[b].accel, phxbodypool[b].accel, a);
}
-Body *
+BodyID
allocbody(void)
{
int i;
@@ -72,10 +70,10 @@ allocbody(void)
if(i >= phxbodypoolsize) {
if(phxbodypoolsize == POOL_SIZE)
- return NULL;
+ return -1;
i = phxbodypoolsize++;
}
phxbodypool[i].active = 1;
- return phxbodypool + i;
+ return i;
}
diff --git a/libphysics/test/vis.c b/libphysics/test/vis.c
index 7d6466a..3111005 100644
--- a/libphysics/test/vis.c
+++ b/libphysics/test/vis.c
@@ -45,11 +45,12 @@ main()
#define FLOAT_RAND (2 * (rand() / (float)RAND_MAX) - 1)
for(int i = 0; i < SBODY; i++) {
- Body *b = phxnew(BTYPE_AABB);
- assert(b != NULL);
+ BodyID b = phxnew(BTYPE_AABB);
+ assert(b != -1);
+
phxsetpos(b, rand() % 800, rand() % 600);
phxsetsize(b, 16.0, 16.0);
- phxapplyaccel(b, (float[]){ 100000 * FLOAT_RAND, 100000 * FLOAT_RAND });
+ phxapplyaccel(b, (float[]){ 30000 * FLOAT_RAND, 30000 * FLOAT_RAND });
}
phxsetmap(8, 8, (int[]) {
@@ -75,7 +76,7 @@ main()
old_ticks = new_ticks;
phxtick(delta);
while(phxnextcollevent(&event)) {
- printf("Collision with %p and %p\n", event.body1, event.body2);
+ printf("Collision with %d and %d\n", event.body1, event.body2);
}
render();
@@ -106,7 +107,6 @@ render(void)
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer);
-
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0xFF, 0xFF);
for(int y = 0; y < phxmapheight; y++)
for(int x = 0; x < phxmapwidth; x++) {
diff --git a/libphysics/tick.c b/libphysics/tick.c
index c6399ab..0d57a8d 100644
--- a/libphysics/tick.c
+++ b/libphysics/tick.c
@@ -130,8 +130,8 @@ bodycollision(Body *a)
vec2_sub_scaled(a->pos, a->pos, p, 0.5);
vec2_sub_scaled(b->pos, b->pos, p, -0.5);
- event.body1 = a;
- event.body2 = b;
+ event.body1 = a - phxbodypool;
+ event.body2 = b - phxbodypool;
phxenqevent(&event);
}
}