diff --git a/src/user.c b/src/user.c index 42a6a876..7fe6c5d4 100644 --- a/src/user.c +++ b/src/user.c @@ -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) { diff --git a/src/user.h b/src/user.h index 36021de1..27939616 100644 --- a/src/user.h +++ b/src/user.h @@ -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 */ diff --git a/src/util.c b/src/util.c index d3a11533..bac0ec64 100644 --- a/src/util.c +++ b/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; } - } {