summaryrefslogtreecommitdiff
path: root/libphysics/tick.c
diff options
context:
space:
mode:
Diffstat (limited to 'libphysics/tick.c')
-rw-r--r--libphysics/tick.c45
1 files changed, 6 insertions, 39 deletions
diff --git a/libphysics/tick.c b/libphysics/tick.c
index a875915..3ba60f8 100644
--- a/libphysics/tick.c
+++ b/libphysics/tick.c
@@ -7,11 +7,6 @@
#define TILE_SIZE 16
#define TEST_BUFFER_SIZE 0x10000
-typedef struct TestCollision TestCollision;
-struct TestCollision {
- BodyID a, b;
-};
-
static void tick(void);
static void mapcollision(Body *);
static void bodycollision(Body *);
@@ -20,7 +15,6 @@ static void bodycollisionmap(Body *);
static void bodycollisionmapsub(Body *, BlockmapNode *);
static void enqueuetest(TestCollision *t);
-static void resolve(void);
static TestCollision testcollision[TEST_BUFFER_SIZE];
static int testcollisioncount;
@@ -87,13 +81,14 @@ tick(void)
mapcollision(b);
}
+ testcollisioncount = 0;
for(int i = 0; i < phxbodypoolsize; i++) {
Body *b = phxbodypool + i;
if(!b->active)
continue;
bodycollisionmap(b);
}
- resolve();
+ __phxnarrowphase(testcollisioncount, testcollision);
for(int i = 0; i < phxbodypoolsize; i++) {
Body *b = phxbodypool + i;
@@ -179,37 +174,9 @@ void
enqueuetest(TestCollision *t)
{
testcollision[testcollisioncount++] = *t;
- if(testcollisioncount >= TEST_BUFFER_SIZE)
- resolve();
-}
-
-void
-resolve(void)
-{
- CollisionEvent event;
-
- for(int i = 0; i < testcollisioncount; i++) {
- TestCollision *c = testcollision + i;
- Body *a = c->a + phxbodypool;
- Body *b = c->b + phxbodypool;
-
- if(a < b && phxaabbcheck(a, b)) {
- float p[2], n[2], rvel[2], j;
- phxaabbresolv(a, b, p, n);
-
- vec2_sub(rvel, a->vel, b->vel);
- j = vec2_dot(rvel, n);
-
- vec2_sub_scaled(a->vel, a->vel, n, 0.5);
- vec2_sub_scaled(b->vel, b->vel, n, -0.5);
-
- vec2_sub_scaled(a->pos, a->pos, p, 0.5);
- vec2_sub_scaled(b->pos, b->pos, p, -0.5);
-
- event.body1 = c->a;
- event.body2 = c->b;
- phxenqevent(&event);
- }
+ if(testcollisioncount >= TEST_BUFFER_SIZE) {
+ __phxnarrowphase(testcollisioncount, testcollision);
+ testcollisioncount = 0;
}
- testcollisioncount = 0;
}
+