5 #include "system/nth_alloc.h"
6 #include "system/stacktrace.h"
7 #include "game/camera.h"
9 #include "./rigid_bodies.h"
26 RigidBodies *create_rigid_bodies(size_t capacity)
33 RigidBodies *rigid_bodies = PUSH_LT(lt, nth_calloc(1, sizeof(RigidBodies)), free);
34 if (rigid_bodies == NULL) {
37 rigid_bodies->lt = lt;
39 rigid_bodies->capacity = capacity;
40 rigid_bodies->count = 0;
42 rigid_bodies->positions = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
43 if (rigid_bodies->positions == NULL) {
47 rigid_bodies->velocities = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
48 if (rigid_bodies->velocities == NULL) {
52 rigid_bodies->movements = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
53 if (rigid_bodies->movements == NULL) {
57 rigid_bodies->sizes = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
58 if (rigid_bodies->sizes == NULL) {
62 rigid_bodies->colors = PUSH_LT(lt, nth_calloc(capacity, sizeof(Color)), free);
63 if (rigid_bodies->colors == NULL) {
67 rigid_bodies->grounded = PUSH_LT(lt, nth_calloc(capacity, sizeof(bool)), free);
68 if (rigid_bodies->grounded == NULL) {
72 rigid_bodies->forces = PUSH_LT(lt, nth_calloc(capacity, sizeof(Vec)), free);
73 if (rigid_bodies->forces == NULL) {
80 void destroy_rigid_bodies(RigidBodies *rigid_bodies)
82 trace_assert(rigid_bodies);
83 RETURN_LT0(rigid_bodies->lt);
86 int rigid_bodies_update(RigidBodies *rigid_bodies,
89 trace_assert(rigid_bodies);
91 /* TODO(#639): rigid_bodies_update is not implemented */
95 int rigid_bodies_render(RigidBodies *rigid_bodies,
98 trace_assert(rigid_bodies);
101 for (size_t i = 0; i < rigid_bodies->count; ++i) {
102 if (camera_fill_rect(
105 rigid_bodies->positions[i],
106 rigid_bodies->sizes[i]),
107 rigid_bodies->colors[i]) < 0) {
115 RigidBodyId rigid_bodies_add(RigidBodies *rigid_bodies,
119 trace_assert(rigid_bodies);
120 trace_assert(rigid_bodies->count < rigid_bodies->capacity);
122 RigidBodyId id = rigid_bodies->count++;
123 rigid_bodies->positions[id] = vec(rect.x, rect.y);
124 rigid_bodies->sizes[id] = vec(rect.w, rect.h);
125 rigid_bodies->colors[id] = color;
130 Rect rigid_bodies_hitbox(const RigidBodies *rigid_bodies,
133 trace_assert(rigid_bodies);
134 trace_assert(id < rigid_bodies->count);
136 return rect_from_vecs(rigid_bodies->positions[id],
137 rigid_bodies->sizes[id]);
140 void rigid_bodies_move(RigidBodies *rigid_bodies,
144 trace_assert(rigid_bodies);
145 trace_assert(id < rigid_bodies->count);
147 rigid_bodies->movements[id] = movement;
150 int rigid_bodies_touches_ground(const RigidBodies *rigid_bodies,
153 trace_assert(rigid_bodies);
154 trace_assert(id < rigid_bodies->count);
156 return rigid_bodies->grounded[id];
159 void rigid_bodies_apply_force(RigidBodies * rigid_bodies,
163 trace_assert(rigid_bodies);
164 trace_assert(id < rigid_bodies->count);
166 rigid_bodies->forces[id] = vec_sum(rigid_bodies->forces[id], force);
169 void rigid_bodies_transform_velocity(RigidBodies *rigid_bodies,
173 trace_assert(rigid_bodies);
174 trace_assert(id < rigid_bodies->count);
176 rigid_bodies->velocities[id] = point_mat3x3_product(
177 rigid_bodies->velocities[id],
181 void rigid_bodies_teleport_to(RigidBodies *rigid_bodies,
185 trace_assert(rigid_bodies);
186 trace_assert(id < rigid_bodies->count);
188 rigid_bodies->positions[id] = position;
191 void rigid_bodies_damper(RigidBodies *rigid_bodies,
195 trace_assert(rigid_bodies);
196 trace_assert(id < rigid_bodies->count);
198 rigid_bodies_apply_force(
201 rigid_bodies->velocities[id].x * v.x,
202 rigid_bodies->velocities[id].y * v.y));