Compare commits
No commits in common. "34a3de73c6321a4858ce9ab3889534dfe0d036fb" and "37cd8cf2cf6a3a1024fc05224c962a38ab683dc8" have entirely different histories.
34a3de73c6
...
37cd8cf2cf
@ -13,53 +13,6 @@
|
|||||||
for (float x = p_center_x - ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); x < p_center_x + ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); ++x)
|
for (float x = p_center_x - ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); x < p_center_x + ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); ++x)
|
||||||
|
|
||||||
|
|
||||||
static int32_t ceil_sqrt(int32_t const n) {
|
|
||||||
int32_t res = 1;
|
|
||||||
#pragma clang loop unroll_count(8)
|
|
||||||
while(res * res < n)
|
|
||||||
res++;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void benchmark(struct state *state) {
|
|
||||||
volatile float x, y;
|
|
||||||
|
|
||||||
profile_start("float");
|
|
||||||
|
|
||||||
for (int i = 0; i < 1000; ++i) {
|
|
||||||
float const rs = state->r * state->r;
|
|
||||||
float const cr = ceilf(state->r);
|
|
||||||
for (float iy = -cr; iy <= cr - 1; ++iy) {
|
|
||||||
float const dx = ceilf(sqrtf(rs - (iy + (iy <= 0)) * (iy + (iy <= 0))));
|
|
||||||
for (float ix = -dx; ix < dx; ++ix) {
|
|
||||||
x = ix;
|
|
||||||
y = iy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
profile_end("float");
|
|
||||||
|
|
||||||
profile_start("int32_t");
|
|
||||||
|
|
||||||
for (int i = 0; i < 1000; ++i) {
|
|
||||||
int32_t const rsi = (int32_t)state->r * (int32_t)state->r;
|
|
||||||
for (int32_t iy = -(int32_t)state->r; iy <= (int32_t)state->r - 1; ++iy) {
|
|
||||||
int32_t const dx = ceil_sqrt(rsi - (iy + (iy <= 0)) * (iy + (iy <= 0)));
|
|
||||||
for (int32_t ix = -dx; ix < dx; ++ix) {
|
|
||||||
x = (float)ix;
|
|
||||||
y = (float)iy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
profile_end("int32_t");
|
|
||||||
|
|
||||||
(void)x; (void)y;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void game_tick(void) {
|
void game_tick(void) {
|
||||||
if (ctx.initialization_needed) {
|
if (ctx.initialization_needed) {
|
||||||
if (!ctx.udata) {
|
if (!ctx.udata) {
|
||||||
@ -81,17 +34,16 @@ void game_tick(void) {
|
|||||||
if (input_action_just_pressed("down"))
|
if (input_action_just_pressed("down"))
|
||||||
state->r -= 1;
|
state->r -= 1;
|
||||||
|
|
||||||
int32_t const rsi = (int32_t)state->r * (int32_t)state->r;
|
float const rs = state->r * state->r;
|
||||||
for (int32_t iy = -(int32_t)state->r; iy <= (int32_t)state->r - 1; ++iy) {
|
float const cr = ceilf(state->r);
|
||||||
int32_t const dx = ceil_sqrt(rsi - (iy + (iy <= 0)) * (iy + (iy <= 0)));
|
for (float iy = cr - 1; iy > -cr - 1; --iy) {
|
||||||
for (int32_t ix = -dx; ix < dx; ++ix) {
|
float const dx = ceilf(sqrtf(rs - (iy + (iy <= 0)) * (iy + (iy <= 0))));
|
||||||
draw_box((Rect){mouse_snap.x + (float)ix * 8, mouse_snap.y + (float)iy * 8, 8, 8}, 1, (Color){125, 125, 0, 255});
|
for (float ix = -dx; ix < dx; ++ix) {
|
||||||
|
draw_box((Rect){mouse_snap.x + ix * 8, mouse_snap.y + iy * 8, 8, 8}, 1, (Color){255, 0, 0, 125});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_circle(mouse_snap, state->r * 8, (Color){125, 125, 125, 125});
|
draw_circle(mouse_snap, state->r * 8, (Color){125, 125, 125, 125});
|
||||||
|
|
||||||
benchmark(state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -84,8 +84,4 @@ TWN_API void log_vec2(Vec2 vector, char const *message);
|
|||||||
TWN_API void log_vec3(Vec3 vector, char const *message);
|
TWN_API void log_vec3(Vec3 vector, char const *message);
|
||||||
TWN_API void log_rect(Rect rect, char const *message);
|
TWN_API void log_rect(Rect rect, char const *message);
|
||||||
|
|
||||||
TWN_API void profile_start(char profile[const static 1]);
|
|
||||||
TWN_API void profile_end(char profile[const static 1]);
|
|
||||||
TWN_API void profile_list_stats(void);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -23,6 +23,10 @@ _Noreturn void die_abruptly(void);
|
|||||||
/* note: you must free the returned string */
|
/* note: you must free the returned string */
|
||||||
char *expand_asterisk(const char *mask, const char *to);
|
char *expand_asterisk(const char *mask, const char *to);
|
||||||
|
|
||||||
|
void profile_start(char profile[const static 1]);
|
||||||
|
void profile_end(char profile[const static 1]);
|
||||||
|
void profile_list_stats(void);
|
||||||
|
|
||||||
/* http://www.azillionmonkeys.com/qed/sqroot.html */
|
/* http://www.azillionmonkeys.com/qed/sqroot.html */
|
||||||
static inline float fast_sqrt(float x)
|
static inline float fast_sqrt(float x)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user