4 #include "system/nth_alloc.h"
5 #include "system/stacktrace.h"
6 #include "game/camera.h"
7 #include "algo/dynarray.h"
9 #include "./rigid_bodies.h"
11 /* TODO(#635): RigidBodies doesn't have enough functionality to replace Rigid_rect */
24 RigidBodies *create_rigid_bodies(void)
26 RigidBodies *rigid_bodies = nth_calloc(1, sizeof(RigidBodies));
27 if (rigid_bodies == NULL) {
31 rigid_bodies->positions = create_dynarray(sizeof(Vec));
32 if (rigid_bodies->positions == NULL) {
36 rigid_bodies->velocities = create_dynarray(sizeof(Vec));
37 if (rigid_bodies->velocities == NULL) {
41 rigid_bodies->movements = create_dynarray(sizeof(Vec));
42 if (rigid_bodies->movements == NULL) {
46 rigid_bodies->sizes = create_dynarray(sizeof(Vec));
47 if (rigid_bodies->sizes == NULL) {
51 rigid_bodies->colors = create_dynarray(sizeof(Color));
52 if (rigid_bodies->colors == NULL) {
56 rigid_bodies->ground_touches = create_dynarray(sizeof(int));
57 if (rigid_bodies->ground_touches == NULL) {
61 rigid_bodies->forces = create_dynarray(sizeof(Vec));
62 if (rigid_bodies->forces == NULL) {
69 destroy_rigid_bodies(rigid_bodies);
73 void destroy_rigid_bodies(RigidBodies *rigid_bodies)
75 if (rigid_bodies == NULL) {
79 if (rigid_bodies->positions != NULL) {
80 destroy_dynarray(rigid_bodies->positions);
83 if (rigid_bodies->velocities != NULL) {
84 destroy_dynarray(rigid_bodies->velocities);
87 if (rigid_bodies->movements != NULL) {
88 destroy_dynarray(rigid_bodies->movements);
91 if (rigid_bodies->sizes != NULL) {
92 destroy_dynarray(rigid_bodies->sizes);
95 if (rigid_bodies->colors != NULL) {
96 destroy_dynarray(rigid_bodies->colors);
99 if (rigid_bodies->ground_touches != NULL) {
100 destroy_dynarray(rigid_bodies->ground_touches);
103 if (rigid_bodies->forces != NULL) {
104 destroy_dynarray(rigid_bodies->forces);
110 int rigid_bodies_update(RigidBodies *rigid_bodies,
113 trace_assert(rigid_bodies);
115 /* TODO(#639): rigid_bodies_update is not implemented */
119 int rigid_bodies_render(RigidBodies *rigid_bodies,
122 trace_assert(rigid_bodies);
123 trace_assert(camera);
125 const size_t n = dynarray_count(rigid_bodies->positions);
126 for (size_t i = 0; i < n; ++i) {
127 if (camera_fill_rect(
130 rigid_bodies->positions[i],
131 rigid_bodies->sizes[i]),
132 rigid_bodies->colors[i]) < 0) {
140 int rigid_bodies_add(RigidBodies *rigid_bodies,
145 trace_assert(rigid_bodies);
151 /* TODO(#640): rigid_bodies_add is not implemented */
156 int rigid_bodies_remove(RigidBodies *rigid_bodies,
159 trace_assert(rigid_bodies);
161 /* TODO(#641): rigid_bodies_remove is not implemented */