blob: e5a273426d155d111dd42b0d268545fa981b6ca0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#include "../graphics.c"
f64 view_x = 0.;
f64 view_y = 0.;
f64 view_s = 1.;
f64 cx = -.771;
f64 cy = .1005;
f64 radius = 2.;
i64 limit = 1024;
i64 time_0;
void update_and_render_frame(void) {
i32 num_events = p_handle_events();
i64 time_elapsed = p_time() - time_0;
time_0 += time_elapsed;
b8 left = g_platform.key_down[KEY_LEFT];
b8 right = g_platform.key_down[KEY_RIGHT];
b8 up = g_platform.key_down[KEY_UP];
b8 down = g_platform.key_down[KEY_DOWN];
if (!left && !right && !up && !down && num_events == 0) {
p_sleep_for(1);
return;
}
if (g_platform.key_pressed[KEY_ESCAPE]) {
view_x = 0.;
view_y = 0.;
view_s = 1.;
}
f64 d = (g_platform.key_down[MOD_CTRL] ? .00005 : .001) * view_s * time_elapsed;
if (left) { cx -= d; cy -= d; }
if (right) { cx += d; cy += d; }
if (up) { cx += d; cy -= d; }
if (down) { cx -= d; cy += d; }
if (g_platform.key_down[BUTTON_LEFT]) {
view_x += g_platform.cursor_dx * view_s;
view_y += g_platform.cursor_dy * view_s;
}
view_s += .1 * g_platform.wheel_dy * view_s;
for (i32 j = 0; j < g_platform.frame_height; ++j)
for (i32 i = 0; i < g_platform.frame_width; ++i) {
f64 kx = ((f64) g_platform.real_width) / g_platform.frame_width * view_s;
f64 ky = ((f64) g_platform.real_height) / g_platform.frame_height * view_s;
f64 x = .003 * ((i - g_platform.frame_width * .5) * kx - view_x);
f64 y = .003 * ((j - g_platform.frame_height * .5) * ky - view_y);
i64 n = 0;
for (; x * x + y * y < radius * radius && n < limit; ++n) {
f64 z = x * x - y * y;
y = 2. * x * y + cy;
x = z + cx;
}
u32 c;
if (n == limit)
c = 0;
else
c = 0xffffff - n * 8 - n * 256 * 4;
g_platform.pixels[j * g_platform.frame_width + i] = vec4_from_vec3_f32(rgb_f32_from_u32(c), 1.f);
}
p_render_frame();
}
i32 main(i32 argc, c8 **argv) {
(void) argc;
(void) argv;
g_platform = (Platform) {
.title = "Julia Set",
};
time_0 = p_time();
p_event_loop();
return 0;
}
|