]> git.lizzy.rs Git - nothing.git/blob - src/game/level/rigid_bodies.c
eca05c941113bb3541706a47962aaa7f907c983b
[nothing.git] / src / game / level / rigid_bodies.c
1 #include <stdlib.h>
2
3 #include "system/lt.h"
4 #include "system/nth_alloc.h"
5 #include "system/stacktrace.h"
6 #include "game/camera.h"
7 #include "algo/dynarray.h"
8
9 #include "./rigid_bodies.h"
10
11 /* TODO(#635): RigidBodies doesn't have enough functionality to replace Rigid_rect */
12
13 struct RigidBodies
14 {
15     Vec *positions;
16     Vec *velocities;
17     Vec *movements;
18     Vec *sizes;
19     Color *colors;
20     int *ground_touches;
21     Vec *forces;
22 };
23
24 RigidBodies *create_rigid_bodies(void)
25 {
26     RigidBodies *rigid_bodies = nth_calloc(1, sizeof(RigidBodies));
27     if (rigid_bodies == NULL) {
28         goto fail;
29     }
30
31     rigid_bodies->positions = create_dynarray(sizeof(Vec));
32     if (rigid_bodies->positions == NULL) {
33         goto fail;
34     }
35
36     rigid_bodies->velocities = create_dynarray(sizeof(Vec));
37     if (rigid_bodies->velocities == NULL) {
38         goto fail;
39     }
40
41     rigid_bodies->movements = create_dynarray(sizeof(Vec));
42     if (rigid_bodies->movements == NULL) {
43         goto fail;
44     }
45
46     rigid_bodies->sizes = create_dynarray(sizeof(Vec));
47     if (rigid_bodies->sizes == NULL) {
48         goto fail;
49     }
50
51     rigid_bodies->colors = create_dynarray(sizeof(Color));
52     if (rigid_bodies->colors == NULL) {
53         goto fail;
54     }
55
56     rigid_bodies->ground_touches = create_dynarray(sizeof(int));
57     if (rigid_bodies->ground_touches == NULL) {
58         goto fail;
59     }
60
61     rigid_bodies->forces = create_dynarray(sizeof(Vec));
62     if (rigid_bodies->forces == NULL) {
63         goto fail;
64     }
65
66     return rigid_bodies;
67
68 fail:
69     destroy_rigid_bodies(rigid_bodies);
70     return NULL;
71 }
72
73 void destroy_rigid_bodies(RigidBodies *rigid_bodies)
74 {
75     if (rigid_bodies == NULL) {
76         return;
77     }
78
79     if (rigid_bodies->positions != NULL) {
80         destroy_dynarray(rigid_bodies->positions);
81     }
82
83     if (rigid_bodies->velocities != NULL) {
84         destroy_dynarray(rigid_bodies->velocities);
85     }
86
87     if (rigid_bodies->movements != NULL) {
88         destroy_dynarray(rigid_bodies->movements);
89     }
90
91     if (rigid_bodies->sizes != NULL) {
92         destroy_dynarray(rigid_bodies->sizes);
93     }
94
95     if (rigid_bodies->colors != NULL) {
96         destroy_dynarray(rigid_bodies->colors);
97     }
98
99     if (rigid_bodies->ground_touches != NULL) {
100         destroy_dynarray(rigid_bodies->ground_touches);
101     }
102
103     if (rigid_bodies->forces != NULL) {
104         destroy_dynarray(rigid_bodies->forces);
105     }
106
107     free(rigid_bodies);
108 }
109
110 int rigid_bodies_update(RigidBodies *rigid_bodies,
111                         float delta_time)
112 {
113     trace_assert(rigid_bodies);
114     (void) delta_time;
115     /* TODO(#639): rigid_bodies_update is not implemented */
116     return 0;
117 }
118
119 int rigid_bodies_render(RigidBodies *rigid_bodies,
120                         Camera *camera)
121 {
122     trace_assert(rigid_bodies);
123     trace_assert(camera);
124
125     const size_t n = dynarray_count(rigid_bodies->positions);
126     for (size_t i = 0; i < n; ++i) {
127         if (camera_fill_rect(
128                 camera,
129                 rect_from_vecs(
130                     rigid_bodies->positions[i],
131                     rigid_bodies->sizes[i]),
132                 rigid_bodies->colors[i]) < 0) {
133             return -1;
134         }
135     }
136
137     return 0;
138 }
139
140 int rigid_bodies_add(RigidBodies *rigid_bodies,
141                      Rect rect,
142                      Color color,
143                      unsigned int *id)
144 {
145     trace_assert(rigid_bodies);
146     trace_assert(id);
147     (void) rect;
148     (void) color;
149     (void) id;
150
151     /* TODO(#640): rigid_bodies_add is not implemented */
152
153     return 0;
154 }
155
156 int rigid_bodies_remove(RigidBodies *rigid_bodies,
157                         unsigned int id)
158 {
159     trace_assert(rigid_bodies);
160     (void) id;
161     /* TODO(#641): rigid_bodies_remove is not implemented */
162     return 0;
163 }