fix closest points janky when shape edges aligned
This commit is contained in:
parent
657d8206fc
commit
d735ff8fc8
@ -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) {
|
||||
|
||||
@ -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 */
|
||||
|
||||
16
src/util.c
16
src/util.c
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user