summaryrefslogtreecommitdiff
path: root/libphysics/tick.c
diff options
context:
space:
mode:
authoresquizo <esquizo+noreply@esquizo.net>2026-05-18 21:44:30 -0300
committeresquizo <esquizo+noreply@esquizo.net>2026-05-18 21:44:30 -0300
commit55677cd9e31943f43bc01515ce29325e6b053c40 (patch)
tree61ffa3e432012cbba100a3a060b157288e43e1fe /libphysics/tick.c
parentdf8e49f5019b6f33a30d4c9372a18d8d372d6af2 (diff)
libphysics: otimização por blockmaps
bug: o object não pode ser maior do que o BLOCK_SIZE, definido no dat.h
Diffstat (limited to 'libphysics/tick.c')
-rw-r--r--libphysics/tick.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/libphysics/tick.c b/libphysics/tick.c
index 0d57a8d..8477ff7 100644
--- a/libphysics/tick.c
+++ b/libphysics/tick.c
@@ -10,6 +10,9 @@ static void tick(void);
static void mapcollision(Body *);
static void bodycollision(Body *);
+static void bodycollisionmap(Body *);
+static void bodycollisionmapsub(Body *, BlockmapNode *);
+
#define TILE_SIZE 16
void
@@ -45,13 +48,14 @@ tick(void)
vec2_add_scaled(b->vel, b->vel, b->accel, PHX_TICK_TIME);
}
+ phxmakeblkmap();
for(int i = 0; i < phxbodypoolsize; i++) {
Body *b = phxbodypool + i;
if(!b->active)
continue;
mapcollision(b);
- bodycollision(b);
+ bodycollisionmap(b);
}
for(int i = 0; i < phxbodypoolsize; i++) {
@@ -136,3 +140,44 @@ bodycollision(Body *a)
}
}
}
+
+void
+bodycollisionmap(Body *a)
+{
+ for(int y = -1; y <= 1; y++)
+ for(int x = -1; x <= 1; x++) {
+ bodycollisionmapsub(a, phxnodelist(
+ a->pos[0] + x * BLOCK_SIZE,
+ a->pos[1] + y * BLOCK_SIZE
+ ));
+ }
+}
+
+void
+bodycollisionmapsub(Body *a, BlockmapNode *n)
+{
+ CollisionEvent event;
+ while(n) {
+ Body *b = phxbodypool + n->id;
+
+ 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);
+ }
+
+ n = n->next;
+ }
+}