1 #include "system/stacktrace.h"
4 #include "game/level/platforms.h"
5 #include "physical_world.h"
7 #include "system/nth_alloc.h"
9 #define PHYSICAL_WORLD_CAPACITY 256
10 #define PHYSICAL_WORLD_GRAVITY 1500.0f
20 Physical_world *create_physical_world(void)
27 Physical_world * const physical_world =
28 PUSH_LT(lt, nth_alloc(sizeof(Physical_world)), free);
29 if (physical_world == NULL) {
33 physical_world->solids =
36 nth_alloc(sizeof(Solid_ref) * PHYSICAL_WORLD_CAPACITY),
38 if (physical_world->solids == NULL) {
42 physical_world->capacity = PHYSICAL_WORLD_CAPACITY;
43 physical_world->size = 0;
44 physical_world->lt = lt;
46 return physical_world;
49 void destroy_physical_world(Physical_world *physical_world)
51 trace_assert(physical_world);
52 RETURN_LT0(physical_world->lt);
55 void physical_world_apply_gravity(Physical_world *physical_world)
57 for (size_t i = 0; i < physical_world->size; ++i) {
59 physical_world->solids[i],
60 vec(0.0f, PHYSICAL_WORLD_GRAVITY));
64 void physical_world_collide_solids(Physical_world *physical_world,
67 trace_assert(physical_world);
69 for (size_t i = 0; i < physical_world->size; ++i) {
70 solid_collide_with_solid(
71 physical_world->solids[i],
72 platforms_as_solid(platforms));
74 for (size_t j = 0; j < physical_world->size; ++j) {
76 solid_collide_with_solid(
77 physical_world->solids[i],
78 physical_world->solids[j]);
82 solid_collide_with_solid(
83 physical_world->solids[i],
84 platforms_as_solid(platforms));
88 int physical_world_add_solid(Physical_world *physical_world,
91 trace_assert(physical_world);
93 if (physical_world->size >= physical_world->capacity) {
94 const size_t new_capacity = physical_world->capacity * 2;
95 Solid_ref * const new_solids = nth_realloc(
96 physical_world->solids,
97 sizeof(Solid_ref) * new_capacity);
99 if (new_solids == NULL) {
103 physical_world->capacity = new_capacity;
104 physical_world->solids = REPLACE_LT(
106 physical_world->solids,
110 physical_world->solids[physical_world->size++] = solid;
115 void physical_world_clean(Physical_world *physical_world)
117 trace_assert(physical_world);
118 physical_world->size = 0;