diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 53 |
1 files changed, 27 insertions, 26 deletions
@@ -23,7 +23,6 @@ uint64_t MAX_ITER = 1 << 2; Color cells[WIDTH * HEIGHT]; pthread_t threads[MAX_THREADS]; -pthread_mutex_t mutex; #define SQUARE(a) (a * a) @@ -36,7 +35,8 @@ Color iter_to_colour(size_t iterations) float ratio = Remap(iterations * (MAX_ITER - iterations), 0, SQUARE(MAX_ITER) / 4, 0, 1); - return (Color){255 * SQUARE(ratio), 10, 255 * SQUARE(1 - ratio), 255}; + return (Color){255 * SQUARE(ratio), 255 * SQUARE(SQUARE(ratio)), 255 * ratio, + 255}; } struct ThreadArg @@ -64,8 +64,7 @@ void *generate_colours(void *state) update.y = (2 * update.x * update.y) + init.y; update.x = new_x; } - Color c = iter_to_colour(iterations); - cells[(i * WIDTH) + j] = c; + cells[(i * WIDTH) + j] = iter_to_colour(iterations); } ptr->done = true; return NULL; @@ -99,21 +98,23 @@ int main(void) Camera2D camera = {0}; camera.zoom = 1.0f; - Image img = GenImageColor(WIDTH, HEIGHT, BLACK); - ImageFormat(&img, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8); - /* Texture2D texture = LoadTextureFromImage(img); */ - UnloadImage(img); + Image img = {.data = cells, + .width = WIDTH, + .height = HEIGHT, + .format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, + .mipmaps = 1}; + Texture2D texture = LoadTextureFromImage(img); SetTargetFPS(60); - pthread_mutex_init(&mutex, NULL); struct ThreadArg args[] = {{0, WIDTH / 2, 0, HEIGHT, false}, {WIDTH / 2, WIDTH, 0, HEIGHT / 4, false}, {WIDTH / 2, WIDTH, HEIGHT / 4, HEIGHT / 2, false}, {WIDTH / 2, WIDTH, HEIGHT / 2, HEIGHT, false}}; threads_start_render(args); - const size_t delta = 1; + const size_t delta = 10; + bool rendered = false; for (size_t prev = 0, ticks = 0; !WindowShouldClose(); ++ticks) { @@ -139,39 +140,39 @@ int main(void) } else if (IsKeyPressed(KEY_SPACE)) { - while (!threads_done(args)) - continue; + threads_cancel_render(); memset(cells, 0, WIDTH * HEIGHT); MAX_ITER *= 2; - threads_cancel_render(); + rendered = false; threads_start_render(args); } if (ticks - prev > delta) { - prev = ticks; - /* UpdateTexture(texture, cells); */ + prev = ticks; + bool done = threads_done(args); + if (!done || !rendered) + UpdateTexture(texture, cells); + else if (done) + rendered = true; } + char iters[128]; + sprintf(iters, "iterations=%lu", MAX_ITER); + BeginDrawing(); BeginMode2D(camera); ClearBackground(BLACK); - char iters[128]; - sprintf(iters, "iterations=%lu", MAX_ITER); - /* DrawTexture(texture, 1024, 1024, BLUE); */ - for (size_t i = 0; i < WIDTH; ++i) - { - for (size_t j = 0; j < HEIGHT; ++j) - { - DrawPixel(i, j, cells[(i * WIDTH) + j]); - } - } + DrawTexturePro(texture, (Rectangle){0, 0, WIDTH, HEIGHT}, + (Rectangle){WIDTH / 2, HEIGHT / 2, WIDTH, HEIGHT}, + (Vector2){WIDTH / 2, HEIGHT / 2}, -90, WHITE); DrawText(iters, 200, 200, 50, RAYWHITE); EndMode2D(); EndDrawing(); } + write_to_png("test.png"); threads_cancel_render(); - /* UnloadTexture(texture); */ + UnloadTexture(texture); CloseWindow(); return 0; } |