summaryrefslogtreecommitdiff
path: root/libphysics/tick.c
diff options
context:
space:
mode:
authoresquizo <esquizo+noreply@esquizo.net>2026-05-21 20:45:02 -0300
committeresquizo <esquizo+noreply@esquizo.net>2026-05-21 20:45:02 -0300
commit5f0603d171fc0411f46548bf4b2aa219693139a2 (patch)
treeac8e687bf65e13d1d0442af5aa9964410a0c505a /libphysics/tick.c
parent26e55acd6d11d472fce44aad2f012e7d5755430d (diff)
libphysics: feito o pipeline de resolução de colisões
Diffstat (limited to 'libphysics/tick.c')
-rw-r--r--libphysics/tick.c84
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;
}