41 lines
1.2 KiB
C++
41 lines
1.2 KiB
C++
|
|
#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);
|
||
|
|
}
|