more physics config defines

This commit is contained in:
jacob 2024-10-10 13:52:46 -05:00
parent c193e31cce
commit daf1a862f5
4 changed files with 36 additions and 31 deletions

View File

@ -86,6 +86,7 @@ struct collider_collision_points_result collider_collision_points(struct collide
(UNUSED)radius1; (UNUSED)radius1;
/* TODO: Parameterize */ /* TODO: Parameterize */
//const f32 tolerance = 0.f; /* How close can shapes be before collision is considered */
const f32 tolerance = 0.005f; /* How close can shapes be before collision is considered */ const f32 tolerance = 0.005f; /* How close can shapes be before collision is considered */
//const f32 tolerance = 0.05f; /* How close can shapes be before collision is considered */ //const f32 tolerance = 0.05f; /* How close can shapes be before collision is considered */
const f32 min_unique_pt_dist_sq = 0.0001f * 0.0001f; const f32 min_unique_pt_dist_sq = 0.0001f * 0.0001f;
@ -247,6 +248,8 @@ struct collider_collision_points_result collider_collision_points(struct collide
* Epa (to find collision normal from inside shape) * Epa (to find collision normal from inside shape)
* ========================== */ * ========================== */
//const f32 epa_epsilon_sq = 0;
//const f32 epa_epsilon_sq = 0.01f * 0.01f;
//const f32 epa_epsilon_sq = 0.001f * 0.001f; //const f32 epa_epsilon_sq = 0.001f * 0.001f;
const f32 epa_epsilon_sq = F32_INFINITY; const f32 epa_epsilon_sq = F32_INFINITY;

View File

@ -33,7 +33,12 @@
#define GAME_TIMESCALE 1.0 #define GAME_TIMESCALE 1.0
#define GAME_PHYSICS_SUBSTEPS 8 #define GAME_PHYSICS_SUBSTEPS 8
#define GAME_PHYSICS_ENABLE_COLLISION 1
#define GAME_PHYSICS_ENABLE_WARM_STARTING 1 #define GAME_PHYSICS_ENABLE_WARM_STARTING 1
#define GAME_PHYSICS_ENABLE_RELAXATION 1
#define GAME_PHYSICS_ENABLE_GROUND_FRICTION 0
#define GAME_SPAWN_LOTS 0
#define GAME_MAX_LINEAR_VELOCITY 100 #define GAME_MAX_LINEAR_VELOCITY 100
#define GAME_MAX_ANGULAR_VELOCITY ((2 * PI) * 20) #define GAME_MAX_ANGULAR_VELOCITY ((2 * PI) * 20)

View File

@ -20,7 +20,7 @@ GLOBAL struct {
struct sprite_scope *sprite_frame_scope; struct sprite_scope *sprite_frame_scope;
/* TODO: Remove this (testing) */ /* TODO: Remove this (testing) */
b32 first_spawn; b32 extra_spawn;
/* Game thread input */ /* Game thread input */
struct sys_mutex game_cmds_mutex; struct sys_mutex game_cmds_mutex;
@ -128,12 +128,13 @@ INTERNAL void spawn_test_entities(f32 offset)
const f32 offset_all = 0; const f32 offset_all = 0;
/* Player */ /* Player */
struct entity *player_ent; struct entity *player_ent = entity_nil();
//if (!G.extra_spawn) {
{ {
//struct v2 pos = V2(0.25, -10); //struct v2 pos = V2(0.25, -10);
//struct v2 pos = V2(0.25, -7); //struct v2 pos = V2(0.25, -7);
//struct v2 pos = V2(0.25, -5.27); //struct v2 pos = V2(0.25, -5.27);
struct v2 pos = V2(0.25, -2); struct v2 pos = V2(0.25, -1);
//struct v2 pos = V2(1.1230469346046448864129274625156, -1); /* Touching right side of box */ //struct v2 pos = V2(1.1230469346046448864129274625156, -1); /* Touching right side of box */
//struct v2 pos = V2(1.1230469346046448864129274625156 - 0.0001, -1); /* Touching right side of box */ //struct v2 pos = V2(1.1230469346046448864129274625156 - 0.0001, -1); /* Touching right side of box */
//struct v2 pos = V2(0.374142020941, -0.246118023992); /* Touching glitch spot */ //struct v2 pos = V2(0.374142020941, -0.246118023992); /* Touching glitch spot */
@ -189,7 +190,7 @@ INTERNAL void spawn_test_entities(f32 offset)
//struct v2 pos = V2(0.25, -7); //struct v2 pos = V2(0.25, -7);
//struct v2 pos = V2(0.25, -5.27); //struct v2 pos = V2(0.25, -5.27);
//struct v2 pos = V2(0.85, -2); //struct v2 pos = V2(0.85, -2);
struct v2 pos = V2(0.25, -2); struct v2 pos = V2(0.25, -1);
//struct v2 pos = V2(1.1230469346046448864129274625156, -1); /* Touching right side of box */ //struct v2 pos = V2(1.1230469346046448864129274625156, -1); /* Touching right side of box */
//struct v2 pos = V2(1.1230469346046448864129274625156 - 0.0001, -1); /* Touching right side of box */ //struct v2 pos = V2(1.1230469346046448864129274625156 - 0.0001, -1); /* Touching right side of box */
//struct v2 pos = V2(0.374142020941, -0.246118023992); /* Touching glitch spot */ //struct v2 pos = V2(0.374142020941, -0.246118023992); /* Touching glitch spot */
@ -235,13 +236,11 @@ INTERNAL void spawn_test_entities(f32 offset)
e->angular_ground_friction = 100; e->angular_ground_friction = 100;
//entity_enable_prop(e, ENTITY_PROP_TEST); //entity_enable_prop(e, ENTITY_PROP_TEST);
player_ent = e;
} }
#endif #endif
/* Weapon */ /* Weapon */
{ if (player_ent->valid) {
#if 0 #if 0
struct v2 pos = V2(1, 0); struct v2 pos = V2(1, 0);
struct v2 size = V2(1, 1); struct v2 size = V2(1, 1);
@ -264,8 +263,8 @@ INTERNAL void spawn_test_entities(f32 offset)
/* Box */ /* Box */
#if 1 #if 1
if (!G.first_spawn) { if (!G.extra_spawn) {
struct v2 pos = V2(0.5, -1); struct v2 pos = V2(0.5, 0);
//struct v2 pos = V2(0.5, 29); //struct v2 pos = V2(0.5, 29);
//struct v2 pos = V2(0.5, 24); //struct v2 pos = V2(0.5, 24);
//struct v2 pos = V2(1, -1); //struct v2 pos = V2(1, -1);
@ -295,7 +294,7 @@ INTERNAL void spawn_test_entities(f32 offset)
#endif #endif
/* Camera */ /* Camera */
if (!G.first_spawn) { if (!G.extra_spawn) {
struct entity *e = entity_alloc(root); struct entity *e = entity_alloc(root);
entity_set_xform(e, XFORM_IDENT); entity_set_xform(e, XFORM_IDENT);
@ -308,7 +307,7 @@ INTERNAL void spawn_test_entities(f32 offset)
e->camera_quad_xform = XFORM_TRS(.s = V2(width, height)); e->camera_quad_xform = XFORM_TRS(.s = V2(width, height));
} }
G.first_spawn = true; G.extra_spawn = true;
} }
@ -649,7 +648,6 @@ INTERNAL struct soft_result make_soft(f32 hertz, f32 zeta, f32 h)
INTERNAL void solve_collisions(f32 dt, b32 apply_bias) INTERNAL void solve_collisions(f32 dt, b32 apply_bias)
{ {
#if 1
struct entity_store *store = G.tick.entity_store; struct entity_store *store = G.tick.entity_store;
for (u64 entity_index = 0; entity_index < store->reserved; ++entity_index) { for (u64 entity_index = 0; entity_index < store->reserved; ++entity_index) {
struct entity *manifold = &store->entities[entity_index]; struct entity *manifold = &store->entities[entity_index];
@ -765,8 +763,8 @@ INTERNAL void solve_collisions(f32 dt, b32 apply_bias)
f32 vt = v2_dot(vrel, tangent); f32 vt = v2_dot(vrel, tangent);
f32 j = vt * k; f32 j = vt * k;
f32 friction = 0.6f; //f32 friction = 0.6f;
//f32 friction = 1.0f; f32 friction = 1.0f;
//f32 friction = F32_INFINITY; //f32 friction = F32_INFINITY;
f32 max_friction = friction * contact->normal_impulse; f32 max_friction = friction * contact->normal_impulse;
f32 old_impulse = contact->tangent_impulse; f32 old_impulse = contact->tangent_impulse;
@ -787,11 +785,6 @@ INTERNAL void solve_collisions(f32 dt, b32 apply_bias)
e1->angular_velocity = w1; e1->angular_velocity = w1;
} }
} }
#else
(UNUSED)make_soft;
(UNUSED)dt;
(UNUSED)apply_bias;
#endif
} }
@ -942,14 +935,14 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
{ {
logf_info("Clearing level"); logf_info("Clearing level");
entity_store_release_all_entities(store); entity_store_release_all_entities(store);
G.first_spawn = false; G.extra_spawn = false;
} break; } break;
/* Spawn test */ /* Spawn test */
case GAME_CMD_KIND_SPAWN_TEST: case GAME_CMD_KIND_SPAWN_TEST:
{ {
logf_info("Spawning (test)"); logf_info("Spawning (test)");
#if 0 #if GAME_SPAWN_LOTS
for (u32 i = 0; i < 50; ++i) { for (u32 i = 0; i < 50; ++i) {
spawn_test_entities(-(f32)i); spawn_test_entities(-(f32)i);
} }
@ -1054,7 +1047,7 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
#if 1 #if 1
if (entity_has_prop(ent, ENTITY_PROP_PLAYER_CONTROLLED)) { if (entity_has_prop(ent, ENTITY_PROP_PLAYER_CONTROLLED)) {
//if ((true)) { //if ((true)) {
#if 0 #if 1
ent->local_collider.points[0] = V2(0, 0); ent->local_collider.points[0] = V2(0, 0);
ent->local_collider.count = 1; ent->local_collider.count = 1;
ent->local_collider.radius = 0.5; ent->local_collider.radius = 0.5;
@ -1471,7 +1464,7 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
* Create ground friction force (gravity) * Create ground friction force (gravity)
* ========================== */ * ========================== */
#if 0 #if GAME_PHYSICS_ENABLE_GROUND_FRICTION
/* TODO: Do this globally rather than creating entities for constant forces */ /* TODO: Do this globally rather than creating entities for constant forces */
for (u64 entity_index = 0; entity_index < store->reserved; ++entity_index) { for (u64 entity_index = 0; entity_index < store->reserved; ++entity_index) {
struct entity *ent = &store->entities[entity_index]; struct entity *ent = &store->entities[entity_index];
@ -1533,6 +1526,12 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
* Physics * Physics
* ========================== */ * ========================== */
(UNUSED)create_contact_manifolds;
(UNUSED)solve_collisions;
(UNUSED)integrate_velocities_from_forces;
(UNUSED)integrate_positions_from_velocities;
(UNUSED)warm_start_contacts;
#if 1 #if 1
{ {
integrate_velocities_from_forces(dt); integrate_velocities_from_forces(dt);
@ -1545,17 +1544,15 @@ INTERNAL void game_update(struct game_cmd_array game_cmds)
#else #else
(UNUSED)warm_start_contacts; (UNUSED)warm_start_contacts;
#endif #endif
#if GAME_PHYSICS_ENABLE_COLLISION
solve_collisions(substep_dt, true); solve_collisions(substep_dt, true);
#endif
integrate_positions_from_velocities(substep_dt); integrate_positions_from_velocities(substep_dt);
#if GAME_PHYSICS_ENABLE_COLLISION && GAME_PHYSICS_ENABLE_RELAXATION
solve_collisions(substep_dt, false); /* Relaxation */ solve_collisions(substep_dt, false); /* Relaxation */
#endif
} }
} }
#else
(UNUSED)create_contact_manifolds;
(UNUSED)solve_collisions;
(UNUSED)integrate_velocities_from_forces;
(UNUSED)integrate_positions_from_velocities;
(UNUSED)warm_start_contacts;
#endif #endif
/* ========================== * /* ========================== *

View File

@ -888,7 +888,7 @@ INTERNAL void user_update(void)
} }
} }
/* Debug draw info */ /* Debug draw entity info */
if (G.debug_draw && !skip_debug_draw) { if (G.debug_draw && !skip_debug_draw) {
struct temp_arena temp = arena_temp_begin(scratch.arena); struct temp_arena temp = arena_temp_begin(scratch.arena);
@ -1145,7 +1145,7 @@ INTERNAL void user_update(void)
draw_solid_arrow_line(G.viewport_canvas, start, end, arrow_thickness, arrow_height, color); draw_solid_arrow_line(G.viewport_canvas, start, end, arrow_thickness, arrow_height, color);
} }
#if 1 #if 1
/* Draw info text */ /* Draw contact info */
{ {
struct font *disp_font = font_load_async(STR("res/fonts/fixedsys.ttf"), 12.0f); struct font *disp_font = font_load_async(STR("res/fonts/fixedsys.ttf"), 12.0f);
if (disp_font) { if (disp_font) {