minor cleanup
This commit is contained in:
parent
5c03288c53
commit
8050c39496
11
src/game.c
11
src/game.c
@ -734,6 +734,7 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
|
|||||||
|
|
||||||
velocity = v2_sub(xf1.og, xf0.og);
|
velocity = v2_sub(xf1.og, xf0.og);
|
||||||
//velocity = V2(0.014992147684, -0.000010356307);
|
//velocity = V2(0.014992147684, -0.000010356307);
|
||||||
|
//velocity = V2(-0.0001, -0.01);
|
||||||
//velocity = V2(0.005, 0);
|
//velocity = V2(0.005, 0);
|
||||||
//velocity = V2(-500, -500);
|
//velocity = V2(-500, -500);
|
||||||
|
|
||||||
@ -746,7 +747,7 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
|
|||||||
xf1.og = v2_add(xf0.og, velocity);
|
xf1.og = v2_add(xf0.og, velocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gjk_extended_result res = gjk_extended(e0_poly, e1_poly, xf0, xf1);
|
struct gjk_extended_result res = gjk_extended(e0_poly, e1_poly, velocity);
|
||||||
|
|
||||||
colliding = res.colliding;
|
colliding = res.colliding;
|
||||||
point0 = res.p0;
|
point0 = res.p0;
|
||||||
@ -758,16 +759,8 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
|
|||||||
solved = res.solved;
|
solved = res.solved;
|
||||||
|
|
||||||
if (colliding) {
|
if (colliding) {
|
||||||
#if 1
|
|
||||||
any_collision = true;
|
any_collision = true;
|
||||||
pen = v2_sub(point1, point0);
|
pen = v2_sub(point1, point0);
|
||||||
/* Pen movement test */
#if 0
|
|
||||||
f32 epsilon = 0.000100;
pen = v2_add(pen, v2_mul(v2_norm(pen), epsilon));
|
|
||||||
#endif
|
|
||||||
//xf0.og = v2_add(xf0.og, pen);
|
|
||||||
//e0->verlet_xform.og = v2_add(e0->verlet_xform.og, pen);
|
|
||||||
//e0->verlet_xform.og = v2_add(e0->verlet_xform.og, pen);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
238
src/gjk.c
238
src/gjk.c
@ -269,13 +269,8 @@ struct poly_support_test_result {
|
|||||||
struct v2 original;
|
struct v2 original;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if 1
|
INTERNAL struct poly_support_test_result poly_support_test(struct v2_array a, struct v2 dir, struct v2 linear_velocity)
|
||||||
|
|
||||||
INTERNAL struct poly_support_test_result poly_support_test(struct v2_array a, struct v2 dir, struct xform xf0, struct xform xf1)
|
|
||||||
{
|
{
|
||||||
(UNUSED)xf0;
|
|
||||||
(UNUSED)xf1;
|
|
||||||
|
|
||||||
/* TODO: Could probably binary search for largest dot since shape is convex */
|
/* TODO: Could probably binary search for largest dot since shape is convex */
|
||||||
struct v2 furthest = V2(0, 0);
|
struct v2 furthest = V2(0, 0);
|
||||||
struct v2 furthest_original = V2(0, 0);
|
struct v2 furthest_original = V2(0, 0);
|
||||||
@ -291,19 +286,17 @@ INTERNAL struct poly_support_test_result poly_support_test(struct v2_array a, st
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct v2 velocity = v2_sub(xf1.og, xf0.og);
|
|
||||||
//struct v2 velocity = V2(1, 1);
|
|
||||||
for (u32 i = 0; i < a.count; ++i) {
|
for (u32 i = 0; i < a.count; ++i) {
|
||||||
struct v2 p = a.points[i];
|
struct v2 p = a.points[i];
|
||||||
struct v2 modified;
|
struct v2 modified;
|
||||||
#if 0
|
#if 0
|
||||||
if (v2_dot(velocity, dir) > 0) {
|
if (v2_dot(linear_velocity, dir) > 0) {
|
||||||
modified = v2_add(p, velocity);
|
modified = v2_add(p, linear_velocity);
|
||||||
} else {
|
} else {
|
||||||
modified = p;
|
modified = p;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
modified = v2_add(p, velocity);
|
modified = v2_add(p, linear_velocity);
|
||||||
#endif
|
#endif
|
||||||
f32 dot = v2_dot(dir, modified);
|
f32 dot = v2_dot(dir, modified);
|
||||||
if (dot > furthest_dot) {
|
if (dot > furthest_dot) {
|
||||||
@ -318,86 +311,27 @@ INTERNAL struct poly_support_test_result poly_support_test(struct v2_array a, st
|
|||||||
res.original = furthest_original;
|
res.original = furthest_original;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
|
|
||||||
INTERNAL struct poly_support_test_result poly_support_test(struct v2_array a, struct v2 dir, struct xform xf0, struct xform xf1)
|
INTERNAL struct gjk_menkowski_point menkowski_point_extended_test(struct v2_array poly0, struct v2_array poly1, struct v2 dir, struct v2 linear_velocity)
|
||||||
{
|
|
||||||
f32 epsilon = 0.001;
|
|
||||||
(UNUSED)xf0;
|
|
||||||
(UNUSED)xf1;
|
|
||||||
|
|
||||||
/* TODO: Could probably binary search for largest dot since shape is convex */
|
|
||||||
struct v2 furthest = V2(0, 0);
|
|
||||||
struct v2 furthest_original = V2(0, 0);
|
|
||||||
f32 furthest_wedge = -F32_INFINITY;
|
|
||||||
f32 furthest_dot = -F32_INFINITY;
|
|
||||||
|
|
||||||
for (u32 i = 0; i < a.count; ++i) {
|
|
||||||
struct v2 p = a.points[i];
|
|
||||||
f32 dot = v2_dot(dir, p);
|
|
||||||
f32 wedge = v2_wedge(dir, p);
|
|
||||||
if (dot > furthest_dot + epsilon || (dot > furthest_dot - epsilon && wedge > furthest_wedge)) {
|
|
||||||
furthest = p;
|
|
||||||
furthest_original = p;
|
|
||||||
furthest_dot = dot;
|
|
||||||
furthest_wedge = wedge;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct v2 velocity = v2_sub(xf1.og, xf0.og);
|
|
||||||
for (u32 i = 0; i < a.count; ++i) {
|
|
||||||
struct v2 p = a.points[i];
|
|
||||||
struct v2 modified;
|
|
||||||
#if 0
|
|
||||||
if (v2_dot(velocity, dir) > 0) {
|
|
||||||
modified = v2_add(p, velocity);
|
|
||||||
} else {
|
|
||||||
modified = p;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
modified = v2_add(p, velocity);
|
|
||||||
#endif
|
|
||||||
f32 dot = v2_dot(dir, modified);
|
|
||||||
f32 wedge = v2_wedge(dir, modified);
|
|
||||||
if (dot > furthest_dot + epsilon || (dot > furthest_dot - epsilon && wedge > furthest_wedge)) {
|
|
||||||
furthest = modified;
|
|
||||||
furthest_original = p;
|
|
||||||
furthest_dot = dot;
|
|
||||||
furthest_wedge = wedge;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct poly_support_test_result res = { 0 };
|
|
||||||
res.p = furthest;
|
|
||||||
res.original = furthest_original;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
INTERNAL struct gjk_menkowski_point menkowski_point_extended_test(struct v2_array poly0, struct v2_array poly1, struct v2 dir, struct xform xf0, struct xform xf1)
|
|
||||||
{
|
{
|
||||||
struct gjk_menkowski_point res;
|
struct gjk_menkowski_point res;
|
||||||
struct poly_support_test_result res0 = poly_support_test(poly0, dir, xf0, xf1);
|
struct poly_support_test_result res0 = poly_support_test(poly0, dir, linear_velocity);
|
||||||
struct poly_support_test_result res1 = poly_support_test(poly1, v2_neg(dir), XFORM_IDENT, XFORM_IDENT);
|
struct poly_support_test_result res1 = poly_support_test(poly1, v2_neg(dir), V2(0, 0));
|
||||||
res.p0 = res0.original;
|
res.p0 = res0.original;
|
||||||
res.p1 = res1.original;
|
res.p1 = res1.original;
|
||||||
res.p = v2_sub(res0.p, res1.p);
|
res.p = v2_sub(res0.p, res1.p);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array shape1, struct v2 linear_velocity)
|
||||||
struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array shape1, struct xform xf0, struct xform xf1)
|
|
||||||
{
|
{
|
||||||
(UNUSED)xf0;
|
|
||||||
(UNUSED)xf1;
|
|
||||||
struct v2 velocity = v2_sub(xf1.og, xf0.og);
|
|
||||||
struct temp_arena scratch = scratch_begin_no_conflict();
|
struct temp_arena scratch = scratch_begin_no_conflict();
|
||||||
|
|
||||||
struct gjk_extended_result res = { 0 };
|
struct gjk_extended_result res = { 0 };
|
||||||
|
|
||||||
|
/* FIXME: Divs by 0 */
|
||||||
|
|
||||||
/* TODO: Verify epsilon */
|
/* TODO: Verify epsilon */
|
||||||
f32 epsilon = 0.00000001;
|
f32 epsilon = 0.00001;
|
||||||
struct gjk_simplex s = {
|
struct gjk_simplex s = {
|
||||||
.len = 3,
|
.len = 3,
|
||||||
.a = V2(F32_NAN, F32_NAN),
|
.a = V2(F32_NAN, F32_NAN),
|
||||||
@ -408,8 +342,7 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
struct v2 shape0_p = { 0 };
|
struct v2 shape0_p = { 0 };
|
||||||
struct v2 shape1_p = { 0 };
|
struct v2 shape1_p = { 0 };
|
||||||
b32 velocity_intersects = false;
|
b32 velocity_intersects = false;
|
||||||
b32 use_penetration_dir = false;
|
f32 velocity_intersection = 0;
|
||||||
(UNUSED)use_penetration_dir;
|
|
||||||
|
|
||||||
/* TODO: Move this back down */
|
/* TODO: Move this back down */
|
||||||
struct gjk_menkowski_point *proto = arena_dry_push(scratch.arena, struct gjk_menkowski_point);
|
struct gjk_menkowski_point *proto = arena_dry_push(scratch.arena, struct gjk_menkowski_point);
|
||||||
@ -429,7 +362,7 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
/* Determine encapsulating simplex if colliding, or closest edge / point to origin on simplex */
|
/* Determine encapsulating simplex if colliding, or closest edge / point to origin on simplex */
|
||||||
{
|
{
|
||||||
/* First point is support point in shape's general directions to eachother */
|
/* First point is support point in shape's general directions to eachother */
|
||||||
s.a = menkowski_point_extended_test(shape0, shape1, v2_sub(shape1.points[0], shape0.points[0]), xf0, xf1);
|
s.a = menkowski_point_extended_test(shape0, shape1, v2_sub(shape1.points[0], shape0.points[0]), linear_velocity);
|
||||||
s.len = 1;
|
s.len = 1;
|
||||||
|
|
||||||
while (!colliding) {
|
while (!colliding) {
|
||||||
@ -438,7 +371,7 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
dir = v2_neg(s.a.p);
|
dir = v2_neg(s.a.p);
|
||||||
|
|
||||||
DBGSTEP;
|
DBGSTEP;
|
||||||
m = menkowski_point_extended_test(shape0, shape1, dir, xf0, xf1);
|
m = menkowski_point_extended_test(shape0, shape1, dir, linear_velocity);
|
||||||
if (v2_eq(m.p, s.a.p)) {
|
if (v2_eq(m.p, s.a.p)) {
|
||||||
/* Point is the same */
|
/* Point is the same */
|
||||||
break;
|
break;
|
||||||
@ -446,20 +379,17 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
s.b = s.a;
|
s.b = s.a;
|
||||||
s.a = m;
|
s.a = m;
|
||||||
s.len = 2;
|
s.len = 2;
|
||||||
#if 1
|
|
||||||
if (math_fabs(v2_wedge(v2_sub(s.b.p, s.a.p), v2_neg(s.a.p))) < epsilon) {
|
if (math_fabs(v2_wedge(v2_sub(s.b.p, s.a.p), v2_neg(s.a.p))) < epsilon) {
|
||||||
/* New ab lies on origin */
|
/* New ab lies on origin */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Third point is support point in direction of line normal towards origin */
|
/* Third point is support point in direction of line normal towards origin */
|
||||||
dir = v2_perp_towards_dir(v2_sub(s.b.p, s.a.p), v2_neg(s.a.p));
|
dir = v2_perp_towards_dir(v2_sub(s.b.p, s.a.p), v2_neg(s.a.p));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
DBGSTEP;
|
DBGSTEP;
|
||||||
m = menkowski_point_extended_test(shape0, shape1, dir, xf0, xf1);
|
m = menkowski_point_extended_test(shape0, shape1, dir, linear_velocity);
|
||||||
if (math_fabs(v2_wedge(v2_sub(s.b.p, s.a.p), v2_sub(m.p, s.a.p))) < epsilon) {
|
if (math_fabs(v2_wedge(v2_sub(s.b.p, s.a.p), v2_sub(m.p, s.a.p))) < epsilon) {
|
||||||
/* New point is on existing line ab */
|
/* New point is on existing line ab */
|
||||||
break;
|
break;
|
||||||
@ -475,7 +405,6 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
s.b = s.a;
|
s.b = s.a;
|
||||||
s.a = m;
|
s.a = m;
|
||||||
s.len = 3;
|
s.len = 3;
|
||||||
#if 1
|
|
||||||
if (math_fabs(v2_wedge(v2_sub(s.b.p, s.a.p), v2_neg(s.a.p))) < epsilon) {
|
if (math_fabs(v2_wedge(v2_sub(s.b.p, s.a.p), v2_neg(s.a.p))) < epsilon) {
|
||||||
/* New ab lies on origin */
|
/* New ab lies on origin */
|
||||||
s.len = 2;
|
s.len = 2;
|
||||||
@ -487,7 +416,6 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
s.len = 2;
|
s.len = 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBGSTEP;
|
DBGSTEP;
|
||||||
@ -541,7 +469,6 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
/* ========================== *
|
/* ========================== *
|
||||||
* Epa
|
* Epa
|
||||||
* ========================== */
|
* ========================== */
|
||||||
use_penetration_dir = !v2_eq(velocity, V2(0, 0));
|
|
||||||
proto = arena_dry_push(scratch.arena, struct gjk_menkowski_point);
|
proto = arena_dry_push(scratch.arena, struct gjk_menkowski_point);
|
||||||
proto_count = 0;
|
proto_count = 0;
|
||||||
{
|
{
|
||||||
@ -553,7 +480,7 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
proto_count = 3;
|
proto_count = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!use_penetration_dir) {
|
if (v2_eq(linear_velocity, V2(0, 0))) {
|
||||||
/* ========================== *
|
/* ========================== *
|
||||||
* Expand simplex towards closest edge to origin inside menkowski
|
* Expand simplex towards closest edge to origin inside menkowski
|
||||||
* ========================== */
|
* ========================== */
|
||||||
@ -595,7 +522,7 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
s.len = 2;
|
s.len = 2;
|
||||||
|
|
||||||
/* Find new point in dir */
|
/* Find new point in dir */
|
||||||
m = menkowski_point_extended_test(shape0, shape1, dir, xf0, xf1);
|
m = menkowski_point_extended_test(shape0, shape1, dir, linear_velocity);
|
||||||
|
|
||||||
/* Check unique */
|
/* Check unique */
|
||||||
/* TODO: Better */
|
/* TODO: Better */
|
||||||
@ -634,42 +561,11 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
DBGSTEP;
|
DBGSTEP;
|
||||||
|
|
||||||
/* FIXME: Winding order of ps & pe index */
|
/* FIXME: Winding order of ps & pe index */
|
||||||
#if 0
|
|
||||||
f32 furthest = -F32_INFINITY;
|
|
||||||
u32 pen_ps_index = 0;
|
|
||||||
u32 pen_pe_index = 0;
|
|
||||||
for (u32 i = 0; i < proto_count; ++i) {
|
|
||||||
u32 ps_index = i;
|
|
||||||
u32 pe_index = (i < proto_count - 1) ? (i + 1) : 0;
|
|
||||||
struct v2 ps = proto[ps_index].p;
|
|
||||||
struct v2 pe = proto[pe_index].p;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct v2 vse = v2_sub(pe, ps);
|
|
||||||
struct v2 vso = v2_neg(ps);
|
|
||||||
|
|
||||||
f32 w = v2_wedge(vse, velocity);
|
|
||||||
if (w != 0) {
|
|
||||||
w = 1 / w;
|
|
||||||
f32 t1 = v2_wedge(vso, velocity) * w;
|
|
||||||
f32 t2 = v2_wedge(vso, vse) * w;
|
|
||||||
(UNUSED)t1;
|
|
||||||
(UNUSED)t2;
|
|
||||||
b32 intersects = 0 <= t1 && 0 <= t2 && t2 <= 1;
|
|
||||||
if (t2 > furthest) {
|
|
||||||
pen_ps_index = ps_index;
|
|
||||||
pen_pe_index = pe_index;
|
|
||||||
furthest = t2;
|
|
||||||
dir = v2_perp_towards_dir(vse, velocity);
|
|
||||||
//dir = velocity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
f32 highest_score = -F32_INFINITY;
|
f32 highest_score = -F32_INFINITY;
|
||||||
u32 pen_ps_index = 0;
|
u32 picked_start_index = 0;
|
||||||
u32 pen_pe_index = 0;
|
u32 picked_end_index = 0;
|
||||||
|
b32 picked_intersects = false;
|
||||||
|
f32 picked_intersection = 0;
|
||||||
for (u32 i = 0; i < proto_count; ++i) {
|
for (u32 i = 0; i < proto_count; ++i) {
|
||||||
u32 ps_index = i;
|
u32 ps_index = i;
|
||||||
u32 pe_index = (i < proto_count - 1) ? (i + 1) : 0;
|
u32 pe_index = (i < proto_count - 1) ? (i + 1) : 0;
|
||||||
@ -679,13 +575,13 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
struct v2 vse = v2_sub(pe, ps);
|
struct v2 vse = v2_sub(pe, ps);
|
||||||
struct v2 vso = v2_neg(ps);
|
struct v2 vso = v2_neg(ps);
|
||||||
|
|
||||||
f32 w = v2_wedge(vse, velocity);
|
f32 w = v2_wedge(vse, linear_velocity);
|
||||||
f32 t1 = 0;
|
f32 t1 = 0;
|
||||||
f32 t2 = 0;
|
f32 t2 = 0;
|
||||||
b32 intersects = false;
|
b32 intersects = false;
|
||||||
if (w != 0) {
|
if (w != 0) {
|
||||||
w = 1 / w;
|
w = 1 / w;
|
||||||
t1 = v2_wedge(vso, velocity) * w;
|
t1 = v2_wedge(vso, linear_velocity) * w;
|
||||||
t2 = v2_wedge(vso, vse) * w;
|
t2 = v2_wedge(vso, vse) * w;
|
||||||
intersects = -epsilon < t1 && t1 < 1 + epsilon && -epsilon < t2 && t2 < 1 + epsilon;
|
intersects = -epsilon < t1 && t1 < 1 + epsilon && -epsilon < t2 && t2 < 1 + epsilon;
|
||||||
}
|
}
|
||||||
@ -695,10 +591,10 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
if (intersects) {
|
if (intersects) {
|
||||||
/* Score is intersection (+1 to ensure intersections get priority) */
|
/* Score is intersection (+1 to ensure intersections get priority) */
|
||||||
score = 1 + t1;
|
score = 1 + t1;
|
||||||
next_dir = v2_perp_towards_dir(vse, velocity);
|
next_dir = v2_perp_towards_dir(vse, linear_velocity);
|
||||||
} else {
|
} else {
|
||||||
/* Score is inverse projection len */
|
/* Score is inverse projection len */
|
||||||
struct v2 vsv = v2_sub(velocity, ps);
|
struct v2 vsv = v2_sub(linear_velocity, ps);
|
||||||
struct v2 vsd = v2_mul(vse, v2_dot(vse, vsv) / v2_dot(vse, vse));
|
struct v2 vsd = v2_mul(vse, v2_dot(vse, vsv) / v2_dot(vse, vse));
|
||||||
f32 len = v2_len(v2_sub(vsd, vsv));
|
f32 len = v2_len(v2_sub(vsd, vsv));
|
||||||
score = 1.0 - len;
|
score = 1.0 - len;
|
||||||
@ -706,21 +602,24 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (score > highest_score) {
|
if (score > highest_score) {
|
||||||
pen_ps_index = ps_index;
|
picked_start_index = ps_index;
|
||||||
pen_pe_index = pe_index;
|
picked_end_index = pe_index;
|
||||||
highest_score = score;
|
highest_score = score;
|
||||||
|
picked_intersects = intersects;
|
||||||
|
picked_intersection = t1;
|
||||||
dir = next_dir;
|
dir = next_dir;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TODO: Move to break (debugging) */
|
/* TODO: Move to break (debugging) */
|
||||||
s.a = proto[pen_ps_index];
|
velocity_intersects = picked_intersects;
|
||||||
s.b = proto[pen_pe_index];
|
velocity_intersection = picked_intersection;
|
||||||
|
s.a = proto[picked_start_index];
|
||||||
|
s.b = proto[picked_end_index];
|
||||||
s.len = 2;
|
s.len = 2;
|
||||||
|
|
||||||
/* Find new point in dir */
|
/* Find new point in dir */
|
||||||
m = menkowski_point_extended_test(shape0, shape1, dir, xf0, xf1);
|
m = menkowski_point_extended_test(shape0, shape1, dir, linear_velocity);
|
||||||
|
|
||||||
/* Check unique */
|
/* Check unique */
|
||||||
/* TODO: Better */
|
/* TODO: Better */
|
||||||
@ -778,39 +677,7 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* Resolve points */
|
/* Resolve points */
|
||||||
if (s.len == 1) {
|
|
||||||
shape0_p = s.a.p0;
|
|
||||||
shape1_p = s.a.p1;
|
|
||||||
} else if (s.len == 2) {
|
|
||||||
/* FIXME: Winding order dependent? */
|
|
||||||
ASSERT(s.len == 2);
|
|
||||||
f32 ratio;
|
|
||||||
{
|
|
||||||
/* Determine ratio between edge a & b that projected origin lies */
|
|
||||||
struct v2 vab = v2_sub(s.b.p, s.a.p);
|
|
||||||
struct v2 vao = v2_neg(s.a.p);
|
|
||||||
ratio = clamp_f32(v2_dot(vab, vao) / v2_dot(vab, vab), 0, 1);
|
|
||||||
}
|
|
||||||
/* Shape 0 */
|
|
||||||
shape0_p = v2_sub(s.b.p0, s.a.p0);
|
|
||||||
shape0_p = v2_mul(shape0_p, ratio);
|
|
||||||
shape0_p = v2_add(shape0_p, s.a.p0);
|
|
||||||
/* Shape 1 */
|
|
||||||
shape1_p = v2_sub(s.b.p1, s.a.p1);
|
|
||||||
shape1_p = v2_mul(shape1_p, ratio);
|
|
||||||
shape1_p = v2_add(shape1_p, s.a.p1);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (s.len == 1) {
|
if (s.len == 1) {
|
||||||
shape0_p = s.a.p0;
|
shape0_p = s.a.p0;
|
||||||
shape1_p = s.a.p1;
|
shape1_p = s.a.p1;
|
||||||
@ -818,29 +685,16 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
ASSERT(s.len == 2);
|
ASSERT(s.len == 2);
|
||||||
/* FIXME: Winding order dependent? */
|
/* FIXME: Winding order dependent? */
|
||||||
f32 ratio;
|
f32 ratio;
|
||||||
if (use_penetration_dir) {
|
if (colliding && !v2_eq(linear_velocity, V2(0, 0))) {
|
||||||
struct v2 vao = v2_neg(s.a.p);
|
|
||||||
struct v2 vab = v2_sub(s.b.p, s.a.p);
|
|
||||||
|
|
||||||
f32 w = 1 / v2_wedge(vab, velocity);
|
|
||||||
f32 t1 = v2_wedge(vao, velocity) * w;
|
|
||||||
f32 t2 = v2_wedge(vao, vab) * w;
|
|
||||||
|
|
||||||
velocity_intersects = 0 <= t1 && t1 <= 1 && 0 <= t2 && t2 <= 1;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if (velocity_intersects) {
|
if (velocity_intersects) {
|
||||||
/* Ratio between edge a & b that velocity intersection lies */
|
/* Ratio between edge a & b that velocity intersection lies */
|
||||||
ratio = t1;
|
ratio = velocity_intersection;
|
||||||
} else {
|
} else {
|
||||||
/* Ratio between edge a & b that projected velocity lies */
|
/* Ratio between edge a & b that projected velocity lies */
|
||||||
struct v2 vap = v2_sub(velocity, s.a.p);
|
struct v2 vab = v2_sub(s.b.p, s.a.p);
|
||||||
|
struct v2 vap = v2_sub(linear_velocity, s.a.p);
|
||||||
ratio = clamp_f32(v2_dot(vab, vap) / v2_dot(vab, vab), 0, 1);
|
ratio = clamp_f32(v2_dot(vab, vap) / v2_dot(vab, vab), 0, 1);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
/* Ratio between edge a & b that velocity intersection lies */
|
|
||||||
ratio = t1;
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
/* Determine ratio between edge a & b that projected origin lies */
|
/* Determine ratio between edge a & b that projected origin lies */
|
||||||
struct v2 vab = v2_sub(s.b.p, s.a.p);
|
struct v2 vab = v2_sub(s.b.p, s.a.p);
|
||||||
@ -857,8 +711,6 @@ struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array
|
|||||||
shape1_p = v2_add(shape1_p, s.a.p1);
|
shape1_p = v2_add(shape1_p, s.a.p1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
res.solved = true;
|
res.solved = true;
|
||||||
abort:
|
abort:
|
||||||
@ -890,14 +742,14 @@ abort:
|
|||||||
|
|
||||||
|
|
||||||
/* TODO: Remove this (debugging) */
|
/* TODO: Remove this (debugging) */
|
||||||
struct v2_array menkowski(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct xform xf0 ,struct xform xf1)
|
struct v2_array menkowski(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct v2 linear_velocity)
|
||||||
{
|
{
|
||||||
struct v2_array res = { .points = arena_dry_push(arena, struct v2) };
|
struct v2_array res = { .points = arena_dry_push(arena, struct v2) };
|
||||||
u64 rays = 500;
|
u64 rays = 500;
|
||||||
for (u64 i = 0; i < rays; ++i) {
|
for (u64 i = 0; i < rays; ++i) {
|
||||||
f32 angle = ((f32)i / rays) * (2 * PI);
|
f32 angle = ((f32)i / rays) * (2 * PI);
|
||||||
struct v2 dir = v2_from_angle(angle);
|
struct v2 dir = v2_from_angle(angle);
|
||||||
struct v2 p = menkowski_point_extended_test(poly0, poly1, dir, xf0, xf1).p;
|
struct v2 p = menkowski_point_extended_test(poly0, poly1, dir, linear_velocity).p;
|
||||||
if (res.count == 0 || !v2_eq(p, res.points[res.count - 1])) {
|
if (res.count == 0 || !v2_eq(p, res.points[res.count - 1])) {
|
||||||
*arena_push(arena, struct v2) = p;
|
*arena_push(arena, struct v2) = p;
|
||||||
++res.count;
|
++res.count;
|
||||||
@ -906,14 +758,10 @@ struct v2_array menkowski(struct arena *arena, struct v2_array poly0, struct v2_
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct v2_array cloud(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct xform xf0, struct xform xf1)
|
/* TODO: Remove this (debugging) */
|
||||||
|
struct v2_array cloud(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct v2 linear_velocity)
|
||||||
{
|
{
|
||||||
(UNUSED)xf0;
|
|
||||||
(UNUSED)xf1;
|
|
||||||
|
|
||||||
struct v2_array res = { .points = arena_dry_push(arena, struct v2) };
|
struct v2_array res = { .points = arena_dry_push(arena, struct v2) };
|
||||||
|
|
||||||
struct v2 velocity = v2_sub(xf1.og, xf0.og);
|
|
||||||
for (u64 i = 0; i < poly0.count; ++i) {
|
for (u64 i = 0; i < poly0.count; ++i) {
|
||||||
struct v2 p0 = poly0.points[i];
|
struct v2 p0 = poly0.points[i];
|
||||||
for (u64 j = 0; j < poly1.count; ++j) {
|
for (u64 j = 0; j < poly1.count; ++j) {
|
||||||
@ -924,7 +772,7 @@ struct v2_array cloud(struct arena *arena, struct v2_array poly0, struct v2_arra
|
|||||||
++res.count;
|
++res.count;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
*arena_push(arena, struct v2) = v2_add(diff, velocity);;
|
*arena_push(arena, struct v2) = v2_add(diff, linear_velocity);
|
||||||
++res.count;
|
++res.count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -62,11 +62,11 @@ struct gjk_extended_result {
|
|||||||
struct gjk_prototype prototype;
|
struct gjk_prototype prototype;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array shape1, struct xform xf0, struct xform xf1);
|
struct gjk_extended_result gjk_extended(struct v2_array shape0, struct v2_array shape1, struct v2 linear_velocity);
|
||||||
|
|
||||||
struct v2_array menkowski(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct xform xf0, struct xform xf1);
|
struct v2_array menkowski(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct v2 linear_velocity);
|
||||||
|
|
||||||
struct v2_array cloud(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct xform xf0, struct xform xf1);
|
struct v2_array cloud(struct arena *arena, struct v2_array poly0, struct v2_array poly1, struct v2 linear_velocity);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@ -1057,7 +1057,7 @@ INTERNAL void user_update(void)
|
|||||||
|
|
||||||
//struct v2_array m = menkowski(temp.arena, ent_poly, e1_poly);
|
//struct v2_array m = menkowski(temp.arena, ent_poly, e1_poly);
|
||||||
|
|
||||||
struct v2_array m = menkowski(temp.arena, ent_poly_xf0, e1_poly, ent->xf0, ent->xf1);
|
struct v2_array m = menkowski(temp.arena, ent_poly_xf0, e1_poly, v2_sub(ent->xf1.og, ent->xf0.og));
|
||||||
|
|
||||||
for (u64 i = 0; i < m.count; ++i) m.points[i] = xform_mul_v2(G.world_view, m.points[i]);
|
for (u64 i = 0; i < m.count; ++i) m.points[i] = xform_mul_v2(G.world_view, m.points[i]);
|
||||||
draw_solid_poly_line(G.viewport_canvas, m, true, thickness, color);
|
draw_solid_poly_line(G.viewport_canvas, m, true, thickness, color);
|
||||||
@ -1071,7 +1071,7 @@ INTERNAL void user_update(void)
|
|||||||
|
|
||||||
//struct v2_array m = menkowski(temp.arena, ent_poly, e1_poly);
|
//struct v2_array m = menkowski(temp.arena, ent_poly, e1_poly);
|
||||||
|
|
||||||
struct v2_array m = cloud(temp.arena, ent_poly_xf0, e1_poly, ent->xf0, ent->xf1);
|
struct v2_array m = cloud(temp.arena, ent_poly_xf0, e1_poly, v2_sub(ent->xf1.og, ent->xf0.og));
|
||||||
|
|
||||||
for (u64 i = 0; i < m.count; ++i) {
|
for (u64 i = 0; i < m.count; ++i) {
|
||||||
struct v2 p = xform_mul_v2(G.world_view, m.points[i]);;
|
struct v2 p = xform_mul_v2(G.world_view, m.points[i]);;
|
||||||
@ -1203,8 +1203,8 @@ INTERNAL void user_update(void)
|
|||||||
/* Queue player move cmd */
|
/* Queue player move cmd */
|
||||||
f32 move_speed = 1.0f;
|
f32 move_speed = 1.0f;
|
||||||
if (G.bind_states[USER_BIND_KIND_WALK].is_held) {
|
if (G.bind_states[USER_BIND_KIND_WALK].is_held) {
|
||||||
//const f32 walk_ratio = 0.25f;
|
const f32 walk_ratio = 0.25f;
|
||||||
const f32 walk_ratio = 0.01f;
|
//const f32 walk_ratio = 0.01f;
|
||||||
move_speed *= walk_ratio;
|
move_speed *= walk_ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user