2 #include "system/stacktrace.h"
7 #include "system/nth_alloc.h"
9 #define EXPLOSION_PIECE_COUNT 20
10 #define EXPLOSION_PIECE_SIZE 20.0f
12 typedef struct Piece {
31 Explosion *create_explosion(Color color,
39 Explosion *explosion = PUSH_LT(lt, nth_calloc(1, sizeof(Explosion)), free);
40 if (explosion == NULL) {
45 explosion->position = vec(0.0f, 0.0f);
46 explosion->color = color;
47 explosion->duration = duration;
48 explosion->time_passed = duration;
50 explosion->pieces = PUSH_LT(lt, nth_calloc(1, sizeof(Piece) * EXPLOSION_PIECE_COUNT), free);
51 if (explosion->pieces == NULL) {
58 void destroy_explosion(Explosion *explosion)
60 trace_assert(explosion);
61 RETURN_LT0(explosion->lt);
64 int explosion_render(const Explosion *explosion,
67 trace_assert(explosion);
70 for (size_t i = 0; i < EXPLOSION_PIECE_COUNT; ++i) {
71 Color color = explosion->color;
72 color.a = fminf(1.0f, 4.0f - (float) explosion->time_passed / (float) explosion->duration * 4.0f);
74 if (camera_fill_triangle(
76 triangle_mat3x3_product(
77 explosion->pieces[i].body,
79 trans_mat(explosion->pieces[i].position.x,
80 explosion->pieces[i].position.y),
81 rot_mat(explosion->pieces[i].angle))),
90 int explosion_update(Explosion *explosion,
93 trace_assert(explosion);
94 trace_assert(delta_time > 0.0f);
96 if (explosion_is_done(explosion)) {
100 explosion->time_passed = explosion->time_passed + delta_time;
102 for (size_t i = 0; i < EXPLOSION_PIECE_COUNT; ++i) {
104 &explosion->pieces[i].position,
106 explosion->pieces[i].direction,
108 explosion->pieces[i].angle = fmodf(
109 explosion->pieces[i].angle + explosion->pieces[i].angle_velocity * delta_time,
116 int explosion_is_done(const Explosion *explosion)
118 trace_assert(explosion);
119 return explosion->time_passed >= explosion->duration;
122 void explosion_start(Explosion *explosion,
125 explosion->position = position;
126 explosion->time_passed = 0;
128 for (size_t i = 0; i < EXPLOSION_PIECE_COUNT; ++i) {
129 explosion->pieces[i].position = explosion->position;
130 explosion->pieces[i].angle = rand_float(2 * PI);
131 explosion->pieces[i].angle_velocity = rand_float(8.0f);
132 explosion->pieces[i].body = random_triangle(EXPLOSION_PIECE_SIZE);
133 explosion->pieces[i].direction = vec_from_polar(
134 rand_float_range(-PI, 0.0f),
135 rand_float_range(100.0f, 300.0f));