From 5f0603d171fc0411f46548bf4b2aa219693139a2 Mon Sep 17 00:00:00 2001 From: esquizo Date: Thu, 21 May 2026 20:45:02 -0300 Subject: libphysics: feito o pipeline de resolução de colisões MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libphysics/tick.c | 84 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 36 deletions(-) (limited to 'libphysics/tick.c') 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; @@ -134,34 +150,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) { @@ -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; } -- cgit v1.2.3