diff options
Diffstat (limited to 'examples/particles.c')
-rwxr-xr-x | examples/particles.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/examples/particles.c b/examples/particles.c new file mode 100755 index 0000000..0fcef37 --- /dev/null +++ b/examples/particles.c @@ -0,0 +1,156 @@ +#if 0 /* +#/ ================================================================ +#/ +#/ particles.c +#/ +#/ ================================================================ +#/ +#/ Self-compilation shell script +#/ +SRC=${0##*./} +BIN=${SRC%.*} +gcc \ + -Wall -Wextra -Werror -pedantic \ + -Wno-old-style-declaration \ + -Wno-missing-braces \ + -Wno-unused-variable \ + -Wno-unused-but-set-variable \ + -Wno-unused-parameter \ + -Wno-overlength-strings \ + -O3 \ + -fsanitize=undefined,address,leak \ + -lX11 -lm \ + -o $BIN $SRC && \ + ./$BIN $@ && rm $BIN +exit $? # */ +#endif + +#include "../graphics.c" + +typedef struct { + f64 x; + f64 y; + f64 vx; + f64 vy; +} Entity; + +typedef struct { + i64 time; + i64 num_entities; + Entity entities[10 * 1024 * 1024]; +} World; + +World world = {0}; +u32 background; +i64 time_0; + +void update_and_render_frame(void) { + p_handle_events(); + + i64 time_elapsed = p_time() - time_0; + time_0 += time_elapsed; + + if (platform.key_pressed[BUTTON_LEFT]) { + i64 n = world.num_entities++; + + world.entities[n] = (Entity) { + .x = (f64) platform.cursor_x - (f64) platform.frame_width / 2, + .y = -((f64) platform.cursor_y - (f64) platform.frame_height / 2), + }; + } + + if (time_elapsed > 0) { + if (platform.key_down[BUTTON_RIGHT]) { + for (i64 n = 0; n < time_elapsed; ++n) + world.entities[world.num_entities + n] = (Entity) { + .x = (f64) platform.cursor_x - (f64) platform.frame_width / 2, + .y = -((f64) platform.cursor_y - (f64) platform.frame_height / 2), + }; + + world.num_entities += time_elapsed; + } + + for (i64 n = 0; n < world.num_entities; ++n) { + Entity *e = &world.entities[n]; + + for (i64 k = 0; k < n; ++k) { + Entity *u = &world.entities[k]; + + f64 dx = e->x - u->x; + f64 dy = e->y - u->y; + f64 d = dx * dx + dy * dy; + if (d < 1000.) continue; + + f64 r = sqrt(d); + dx /= r; + dy /= r; + + f64 a = (1. / d) * time_elapsed; + + if (d < 5000.) + a = -a; + + e->vx -= dx * a; + e->vy -= dy * a; + u->vx += dx * a; + u->vy += dy * a; + } + } + + for (i64 n = 0; n < world.num_entities; ++n) { + Entity *e = &world.entities[n]; + + e->x += e->vx * time_elapsed; + e->y += e->vy * time_elapsed; + + f64 z = (M_PI * 2.0) * (rand() % 10000) * .0001; + e->vx += .0001 * cos(z); + e->vy += .0001 * sin(z); + } + + world.time += time_elapsed; + } + + for (i32 j = 0; j < platform.frame_height; ++j) + for (i32 i = 0; i < platform.frame_width; ++i) + platform.pixels[j * platform.frame_width + i] = background; + + for (i64 n = 0; n < world.num_entities; ++n) { + Entity *e = &world.entities[n]; + + i32 x = platform.frame_width / 2 + (i32) floor(e->x + .5); + i32 y = platform.frame_height / 2 - (i32) floor(e->y + .5); + + for (i32 j = y - 10; j <= y + 10; ++j) { + if (j < 0 || j >= platform.frame_height) continue; + for (i32 i = x - 10; i <= x + 10; ++i) { + if (i < 0 || i >= platform.frame_width) continue; + if ((i - x) * (i - x) + (j - y) * (j - y) > 100) continue; + f64 v = (e->vx * e->vx + e->vy * e->vy) * 8.; + platform.pixels[j * platform.frame_width + i] = u32_from_rgb(-.2 + v * 2., .1 + v * .7, 1. - v); + } + } + } + + p_render_frame(); +} + +i32 main(i32 argc, c8 **argv) { + (void) argc; + (void) argv; + + platform = (Platform) { + .title = "Gravity", + .frame_width = 960, + .frame_height = 720, + }; + + background = u32_from_rgb(.0f, .0f, .08f); + time_0 = p_time(); + + srand(p_time()); + + p_event_loop(); + + return 0; +} |