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,
36 Explosion *explosion = PUSH_LT(lt, nth_calloc(1, sizeof(Explosion)), free);
37 if (explosion == NULL) {
42 explosion->position = vec(0.0f, 0.0f);
43 explosion->color = color;
44 explosion->duration = duration;
45 explosion->time_passed = duration;
47 explosion->pieces = PUSH_LT(lt, nth_calloc(1, sizeof(Piece) * EXPLOSION_PIECE_COUNT), free);
48 if (explosion->pieces == NULL) {
55 void destroy_explosion(Explosion *explosion)
57 trace_assert(explosion);
58 RETURN_LT0(explosion->lt);
61 int explosion_render(const Explosion *explosion,
64 trace_assert(explosion);
67 for (size_t i = 0; i < EXPLOSION_PIECE_COUNT; ++i) {
68 Color color = explosion->color;
69 color.a = fminf(1.0f, 4.0f - (float) explosion->time_passed / (float) explosion->duration * 4.0f);
71 if (camera_fill_triangle(
73 triangle_mat3x3_product(
74 explosion->pieces[i].body,
76 trans_mat(explosion->pieces[i].position.x,
77 explosion->pieces[i].position.y),
78 rot_mat(explosion->pieces[i].angle))),
87 int explosion_update(Explosion *explosion,
90 trace_assert(explosion);
91 trace_assert(delta_time > 0.0f);
93 if (explosion_is_done(explosion)) {
97 explosion->time_passed = explosion->time_passed + delta_time;
99 for (size_t i = 0; i < EXPLOSION_PIECE_COUNT; ++i) {
101 &explosion->pieces[i].position,
103 explosion->pieces[i].direction,
105 explosion->pieces[i].angle = fmodf(
106 explosion->pieces[i].angle + explosion->pieces[i].angle_velocity * delta_time,
113 int explosion_is_done(const Explosion *explosion)
115 trace_assert(explosion);
116 return explosion->time_passed >= explosion->duration;
119 void explosion_start(Explosion *explosion,
122 explosion->position = position;
123 explosion->time_passed = 0;
125 for (size_t i = 0; i < EXPLOSION_PIECE_COUNT; ++i) {
126 explosion->pieces[i].position = explosion->position;
127 explosion->pieces[i].angle = rand_float(2 * PI);
128 explosion->pieces[i].angle_velocity = rand_float(8.0f);
129 explosion->pieces[i].body = random_triangle(EXPLOSION_PIECE_SIZE);
130 explosion->pieces[i].direction = vec_from_polar(
131 rand_float_range(-PI, 0.0f),
132 rand_float_range(100.0f, 300.0f));