fix closest points janky when shape edges aligned

This commit is contained in:
jacob 2024-08-30 19:57:34 -05:00
parent 657d8206fc
commit d735ff8fc8
3 changed files with 13 additions and 8 deletions

View File

@ -85,6 +85,7 @@ GLOBAL READONLY enum user_bind_kind g_binds[SYS_BTN_COUNT] = {
[SYS_BTN_S] = USER_BIND_KIND_MOVE_DOWN,
[SYS_BTN_A] = USER_BIND_KIND_MOVE_LEFT,
[SYS_BTN_D] = USER_BIND_KIND_MOVE_RIGHT,
[SYS_BTN_ALT] = USER_BIND_KIND_WALK,
[SYS_BTN_M1] = USER_BIND_KIND_FIRE,
/* Testing */
@ -1143,6 +1144,7 @@ INTERNAL void user_update(void)
{
/* Queue player move cmd */
f32 move_speed = G.bind_states[USER_BIND_KIND_WALK].is_held ? 0.25f : 1.0f;
struct v2 input_move_dir = { 0 };
{
for (enum user_bind_kind bind = 0; bind < (i32)ARRAY_COUNT(G.bind_states); ++bind) {
@ -1175,7 +1177,7 @@ INTERNAL void user_update(void)
}
input_move_dir = xform_basis_invert_mul_v2(G.world_view, input_move_dir); /* Make move dir relative to world view */
input_move_dir = v2_norm(input_move_dir);
input_move_dir = v2_mul(v2_norm(input_move_dir), move_speed);
}
struct v2 input_aim_pos = G.world_cursor;
if (!G.debug_camera) {

View File

@ -18,6 +18,7 @@ enum user_bind_kind {
USER_BIND_KIND_MOVE_DOWN,
USER_BIND_KIND_MOVE_LEFT,
USER_BIND_KIND_MOVE_RIGHT,
USER_BIND_KIND_WALK,
USER_BIND_KIND_FIRE,
/* Testing */

View File

@ -191,6 +191,9 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
struct v2 shape1_p = V2(0, 0);
u32 step = 0;
/* TODO: Verify epsilon */
f32 unique_epsilon = 0.00001;
/* Simplex */
struct gjk_extended_simplex s = { 0 };
@ -201,7 +204,6 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
s.a = m;
s.len = 1;
struct v2 prev_point = V2(F32_NAN, F32_NAN);
while (true) {
/* Second point is support point towards origin */
if (s.len == 1) {
@ -221,7 +223,9 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
if (step++ >= max_steps) goto abort;
m = menkowski_point(poly0, poly1, dir);
if (v2_eq(m.p, prev_point) || v2_eq(m.p, s.a.p) || v2_eq(m.p, s.b.p) || v2_eq(m.p, s.c.p)) {
if (math_fabs(v2_wedge(v2_sub(s.b.p, s.a.p), v2_sub(m.p, s.a.p))) < unique_epsilon) {
/* New point is already on the current line */
break;
}
@ -279,8 +283,6 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
s.a = s.c;
s.len = 1;
}
prev_point = m.p;
}
if (colliding) {
@ -337,11 +339,12 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
/* Check unique */
/* TODO: Better */
/* TODO: Epsilon or iteration limit */
{
b32 unique = true;
for (u32 i = 0; i < proto_count; ++i) {
if (v2_eq(m.p, proto[i].p)) {
struct v2 edge_start = proto[i].p;
struct v2 edge_end = i < proto_count - 1 ? proto[i + 1].p : proto[0].p;
if (math_fabs(v2_wedge(v2_sub(edge_end, edge_start), v2_sub(m.p, edge_start))) < unique_epsilon) {
unique = false;
break;
}
@ -365,7 +368,6 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
}
proto[pen_pe_index] = m;
}
}
{