Handle wrapping in physics_separation()

This commit is contained in:
Camden Dixie O'Brien
2025-10-18 10:58:18 +01:00
parent 536ee74b61
commit 74113c32b4

View File

@@ -4,6 +4,7 @@
#include "renderer.h"
#include <assert.h>
#include <math.h>
#include <string.h>
typedef struct {
@@ -97,16 +98,38 @@ void physics_escape(unsigned entity)
escape_entity = entity;
}
static void pos_views(vec2_t a, vec2_t b, vec2_t out[4])
{
const float dx = 2 * aspect;
const float dy = 2;
out[0] = b;
out[1] = (vec2_t) { b.x + copysign(dx, a.x), b.y };
out[2] = (vec2_t) { b.x, b.y + copysign(dy, a.y) };
out[3] = (vec2_t) { b.x + copysign(dx, a.x), b.y + copysign(dy, a.y) };
}
physics_sep_t physics_separation(unsigned a, unsigned b)
{
const physics_t *pa = physics_get(a);
const physics_t *pb = physics_get(b);
const vec2_t disp = vec2_sub(pb->pos, pa->pos);
const vec2_t norm = vec2_norm(disp);
vec2_t pos[4];
pos_views(pa->pos, pb->pos, pos);
float min_dist = INFINITY;
vec2_t min_disp;
for (unsigned i = 0; i < 4; ++i) {
const vec2_t disp = vec2_sub(pos[i], pa->pos);
const float dist = vec2_len(disp);
if (dist < min_dist) {
min_disp = disp;
min_dist = dist;
}
}
const vec2_t norm = vec2_norm(min_disp);
return (physics_sep_t) {
.dist = vec2_len(disp),
.dist = min_dist,
.norm = norm,
.va = vec2_dot(pa->vel, norm),
.vb = vec2_dot(pb->vel, norm),