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_S] = USER_BIND_KIND_MOVE_DOWN,
|
||||||
[SYS_BTN_A] = USER_BIND_KIND_MOVE_LEFT,
|
[SYS_BTN_A] = USER_BIND_KIND_MOVE_LEFT,
|
||||||
[SYS_BTN_D] = USER_BIND_KIND_MOVE_RIGHT,
|
[SYS_BTN_D] = USER_BIND_KIND_MOVE_RIGHT,
|
||||||
|
[SYS_BTN_ALT] = USER_BIND_KIND_WALK,
|
||||||
[SYS_BTN_M1] = USER_BIND_KIND_FIRE,
|
[SYS_BTN_M1] = USER_BIND_KIND_FIRE,
|
||||||
|
|
||||||
/* Testing */
|
/* Testing */
|
||||||
@ -1143,6 +1144,7 @@ INTERNAL void user_update(void)
|
|||||||
|
|
||||||
{
|
{
|
||||||
/* Queue player move cmd */
|
/* 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 };
|
struct v2 input_move_dir = { 0 };
|
||||||
{
|
{
|
||||||
for (enum user_bind_kind bind = 0; bind < (i32)ARRAY_COUNT(G.bind_states); ++bind) {
|
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 = 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;
|
struct v2 input_aim_pos = G.world_cursor;
|
||||||
if (!G.debug_camera) {
|
if (!G.debug_camera) {
|
||||||
|
|||||||
@ -18,6 +18,7 @@ enum user_bind_kind {
|
|||||||
USER_BIND_KIND_MOVE_DOWN,
|
USER_BIND_KIND_MOVE_DOWN,
|
||||||
USER_BIND_KIND_MOVE_LEFT,
|
USER_BIND_KIND_MOVE_LEFT,
|
||||||
USER_BIND_KIND_MOVE_RIGHT,
|
USER_BIND_KIND_MOVE_RIGHT,
|
||||||
|
USER_BIND_KIND_WALK,
|
||||||
USER_BIND_KIND_FIRE,
|
USER_BIND_KIND_FIRE,
|
||||||
|
|
||||||
/* Testing */
|
/* 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);
|
struct v2 shape1_p = V2(0, 0);
|
||||||
u32 step = 0;
|
u32 step = 0;
|
||||||
|
|
||||||
|
/* TODO: Verify epsilon */
|
||||||
|
f32 unique_epsilon = 0.00001;
|
||||||
|
|
||||||
/* Simplex */
|
/* Simplex */
|
||||||
struct gjk_extended_simplex s = { 0 };
|
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.a = m;
|
||||||
s.len = 1;
|
s.len = 1;
|
||||||
|
|
||||||
struct v2 prev_point = V2(F32_NAN, F32_NAN);
|
|
||||||
while (true) {
|
while (true) {
|
||||||
/* Second point is support point towards origin */
|
/* Second point is support point towards origin */
|
||||||
if (s.len == 1) {
|
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;
|
if (step++ >= max_steps) goto abort;
|
||||||
m = menkowski_point(poly0, poly1, dir);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,8 +283,6 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
|
|||||||
s.a = s.c;
|
s.a = s.c;
|
||||||
s.len = 1;
|
s.len = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_point = m.p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (colliding) {
|
if (colliding) {
|
||||||
@ -337,11 +339,12 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
|
|||||||
|
|
||||||
/* Check unique */
|
/* Check unique */
|
||||||
/* TODO: Better */
|
/* TODO: Better */
|
||||||
/* TODO: Epsilon or iteration limit */
|
|
||||||
{
|
{
|
||||||
b32 unique = true;
|
b32 unique = true;
|
||||||
for (u32 i = 0; i < proto_count; ++i) {
|
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;
|
unique = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -365,7 +368,6 @@ struct gjk_extended_result gjk_extended(struct v2_array poly0, struct v2_array p
|
|||||||
}
|
}
|
||||||
proto[pen_pe_index] = m;
|
proto[pen_pe_index] = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user