Files

41 lines
1.2 KiB
C++
Raw Permalink Normal View History

2023-09-26 19:40:16 +02:00
#include "base.h"
#include "simulation.h"
#include "../lib/geometry.h"
#include "collision.h"
void phy_integrate(phy_world *world, f64 delta_t)
{
for(u32 i = 0; i < world->bodies_count; i++)
{
phy_body *body = world->bodies + i;
body->velocity += world->gravity * body->gravity_multiplier * delta_t;
body->position += body->velocity * delta_t;
body->rotation += body->angular_velocity * delta_t;
}
}
void phy_simulate(phy_world *world, f64 delta_t)
{
// @Performance: Grouping for optimizations (active/inactive, constraints)
phy_integrate(world, delta_t);
u32 max_pairs = 1000; // @Correctness: this should be dynamic and should reuse memory when possible
u32 num_pairs = 0;
phy_body_pair *pair_list = PHY_ALLOC(phy_body_pair, max_pairs);
phy_collisions_broadphase(world, pair_list, max_pairs, &num_pairs);
u32 max_collisions = 1000;
u32 num_collisions = 0;
phy_collision *collision_list = PHY_ALLOC(phy_collision, max_collisions);
phy_collisions_detection(world, pair_list, minimum(max_pairs, num_pairs), collision_list, max_collisions, &num_collisions);
phy_collisions_resolution(world, collision_list, minimum(max_collisions, num_collisions));
PHY_FREE(pair_list);
PHY_FREE(collision_list);
}