4 #include "game/level/platforms.h"
5 #include "physical_world.h"
6 #include "system/error.h"
8 #include "system/nth_alloc.h"
10 #define PHYSICAL_WORLD_CAPACITY 256
11 #define PHYSICAL_WORLD_GRAVITY 1500.0f
21 Physical_world *create_physical_world(void)
28 Physical_world * const physical_world =
29 PUSH_LT(lt, nth_alloc(sizeof(Physical_world)), free);
30 if (physical_world == NULL) {
31 throw_error(ERROR_TYPE_LIBC);
35 physical_world->solids =
38 nth_alloc(sizeof(Solid_ref) * PHYSICAL_WORLD_CAPACITY),
40 if (physical_world->solids == NULL) {
41 throw_error(ERROR_TYPE_LIBC);
45 physical_world->capacity = PHYSICAL_WORLD_CAPACITY;
46 physical_world->size = 0;
47 physical_world->lt = lt;
49 return physical_world;
52 void destroy_physical_world(Physical_world *physical_world)
54 assert(physical_world);
55 RETURN_LT0(physical_world->lt);
58 void physical_world_apply_gravity(Physical_world *physical_world)
60 for (size_t i = 0; i < physical_world->size; ++i) {
62 physical_world->solids[i],
63 vec(0.0f, PHYSICAL_WORLD_GRAVITY));
67 void physical_world_collide_solids(Physical_world *physical_world,
70 assert(physical_world);
72 for (size_t i = 0; i < physical_world->size; ++i) {
73 solid_collide_with_solid(
74 physical_world->solids[i],
75 platforms_as_solid(platforms));
77 for (size_t j = 0; j < physical_world->size; ++j) {
79 solid_collide_with_solid(
80 physical_world->solids[i],
81 physical_world->solids[j]);
85 solid_collide_with_solid(
86 physical_world->solids[i],
87 platforms_as_solid(platforms));
91 int physical_world_add_solid(Physical_world *physical_world,
94 assert(physical_world);
96 if (physical_world->size >= physical_world->capacity) {
97 const size_t new_capacity = physical_world->capacity * 2;
98 Solid_ref * const new_solids = nth_realloc(
99 physical_world->solids,
100 sizeof(Solid_ref) * new_capacity);
102 if (new_solids == NULL) {
106 physical_world->capacity = new_capacity;
107 physical_world->solids = REPLACE_LT(
109 physical_world->solids,
113 physical_world->solids[physical_world->size++] = solid;
118 void physical_world_clean(Physical_world *physical_world)
120 assert(physical_world);
121 physical_world->size = 0;