4 #include "rigid_bodies.h"
5 #include "system/error.h"
8 #define RIGID_BODIES_CAPACITY 256
19 rigid_bodies_t *create_rigid_bodies(void)
21 lt_t *lt = create_lt();
26 rigid_bodies_t *rigid_bodies =
27 PUSH_LT(lt, malloc(sizeof(rigid_bodies_t)), free);
28 if (rigid_bodies == NULL) {
29 throw_error(ERROR_TYPE_LIBC);
33 rigid_bodies->refs = PUSH_LT(
35 malloc(sizeof(rigid_rect_ref) * RIGID_BODIES_CAPACITY),
37 if (rigid_bodies->refs == NULL) {
38 throw_error(ERROR_TYPE_LIBC);
42 rigid_bodies->rects = PUSH_LT(
44 malloc(sizeof(rect_t*) * RIGID_BODIES_CAPACITY),
46 if (rigid_bodies->rects == NULL) {
47 throw_error(ERROR_TYPE_LIBC);
51 for (int32_t i = 0; i < RIGID_BODIES_CAPACITY; ++i) {
52 rigid_bodies->refs[i] = RIGID_BODIES_CAPACITY - i - 1;
53 rigid_bodies->rects[i] = NULL;
56 rigid_bodies->capacity = RIGID_BODIES_CAPACITY;
57 rigid_bodies->refs_size = RIGID_BODIES_CAPACITY;
58 rigid_bodies->lt = lt;
63 void destroy_rigid_bodies(rigid_bodies_t *rigid_bodies)
67 for (size_t i = 0; i < rigid_bodies->capacity; ++i) {
68 if (rigid_bodies->rects[i] != NULL) {
69 free(rigid_bodies->rects[i]);
73 RETURN_LT0(rigid_bodies->lt);
76 void rigid_bodies_update(rigid_bodies_t *rigid_bodies,
81 /* TODO(#216): rigid_bodies_update is not implemented */
84 int rigid_bodies_fill_rect(rigid_bodies_t *rigid_bodies,
85 rigid_rect_ref rect_ref,
91 assert(rect_ref >= (int32_t)rigid_bodies->capacity);
92 assert(rigid_bodies->rects[rect_ref] == NULL);
96 /* TODO: rigid_bodies_fill_rect is not implemented */
101 rigid_rect_ref rigid_bodies_create_rect(rigid_bodies_t *rigid_bodies,
104 assert(rigid_bodies);
106 if (rigid_bodies->refs_size <= 0) {
107 const size_t prev_capacity = rigid_bodies->capacity;
108 rigid_bodies->capacity = 2 * prev_capacity;
109 rigid_bodies->refs_size = prev_capacity;
111 rigid_bodies->refs = REPLACE_LT(
116 sizeof(rigid_rect_ref) * rigid_bodies->capacity));
118 rigid_bodies->rects = REPLACE_LT(
123 sizeof(rect_t*) * rigid_bodies->capacity));
125 for (size_t i = 0; i < prev_capacity; ++i) {
126 rigid_bodies->refs[i] = (int32_t) (prev_capacity - i - 1 + prev_capacity);
127 rigid_bodies->rects[i + prev_capacity] = NULL;
131 const rigid_rect_ref ref = rigid_bodies->refs[--rigid_bodies->refs_size];
132 rigid_bodies->rects[ref] = malloc(sizeof(rect_t));
133 if (rigid_bodies->rects[ref] == NULL) {
136 *rigid_bodies->rects[ref] = rect;
141 void rigid_bodies_destroy_rect(rigid_bodies_t *rigid_bodies,
142 rigid_rect_ref rect_ref)
144 assert(rigid_bodies);
145 assert(rect_ref < 0);
146 assert(rect_ref >= (int32_t)rigid_bodies->capacity);
147 assert(rigid_bodies->rects[rect_ref] == NULL);
149 free(rigid_bodies->rects[rect_ref]);
150 rigid_bodies->rects[rect_ref] = NULL;
152 rigid_bodies->refs[rigid_bodies->refs_size++] = rect_ref;
155 void rigid_bodies_print(rigid_bodies_t *rigid_bodies)
157 assert(rigid_bodies);
160 for (size_t i = 0; i < rigid_bodies->capacity; ++i) {
161 if (i < rigid_bodies->refs_size) {
162 printf("\t%d", rigid_bodies->refs[i]);
170 for (size_t i = 0; i < rigid_bodies->capacity; ++i) {
171 if (rigid_bodies->rects[i] == NULL) {
178 printf("------------------------------\n");