diff options
| author | esquizo <esquizo+noreply@esquizo.net> | 2026-05-21 20:45:02 -0300 |
|---|---|---|
| committer | esquizo <esquizo+noreply@esquizo.net> | 2026-05-21 20:45:02 -0300 |
| commit | 5f0603d171fc0411f46548bf4b2aa219693139a2 (patch) | |
| tree | ac8e687bf65e13d1d0442af5aa9964410a0c505a | |
| parent | 26e55acd6d11d472fce44aad2f012e7d5755430d (diff) | |
libphysics: feito o pipeline de resolução de colisões
| -rw-r--r-- | libphysics/tick.c | 84 |
1 files changed, 48 insertions, 36 deletions
diff --git a/libphysics/tick.c b/libphysics/tick.c index 23f7fa0..a875915 100644 --- a/libphysics/tick.c +++ b/libphysics/tick.c @@ -4,7 +4,13 @@ #include "dat.h" -#define PHX_TICK_TIME (1.0 / 480.0) +#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 *); @@ -13,7 +19,11 @@ static void bodycollision(Body *); static void bodycollisionmap(Body *); static void bodycollisionmapsub(Body *, BlockmapNode *); -#define TILE_SIZE 16 +static void enqueuetest(TestCollision *t); +static void resolve(void); + +static TestCollision testcollision[TEST_BUFFER_SIZE]; +static int testcollisioncount; void phxtick(float delta) @@ -74,10 +84,16 @@ tick(void) Body *b = phxbodypool + i; if(!b->active) continue; - mapcollision(b); + } + + for(int i = 0; i < phxbodypoolsize; i++) { + Body *b = phxbodypool + i; + if(!b->active) + continue; bodycollisionmap(b); } + resolve(); for(int i = 0; i < phxbodypoolsize; i++) { Body *b = phxbodypool + i; @@ -135,34 +151,6 @@ mapcollision(Body *a) } void -bodycollision(Body *a) -{ - CollisionEvent event; - for(Body *b = a + 1; b < (a + phxbodypoolsize); b++) { - if(!b->active) - continue; - - if(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 = a - phxbodypool; - event.body2 = b - phxbodypool; - phxenqevent(&event); - } - } -} - -void bodycollisionmap(Body *a) { for(int y = -1; y <= 1; y++) @@ -177,9 +165,34 @@ bodycollisionmap(Body *a) void bodycollisionmapsub(Body *a, BlockmapNode *n) { - CollisionEvent event; while(n) { Body *b = phxbodypool + n->id; + enqueuetest(&(TestCollision) { + .a = a - phxbodypool, + .b = b - phxbodypool + }); + n = n->next; + } +} + +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); @@ -193,11 +206,10 @@ bodycollisionmapsub(Body *a, BlockmapNode *n) vec2_sub_scaled(a->pos, a->pos, p, 0.5); vec2_sub_scaled(b->pos, b->pos, p, -0.5); - event.body1 = a - phxbodypool; - event.body2 = b - phxbodypool; + event.body1 = c->a; + event.body2 = c->b; phxenqevent(&event); } - - n = n->next; } + testcollisioncount = 0; } |
