diff --git a/assets/shaders/distance_field.fs b/assets/shaders/distance_field.fs index 014e5ff..2fb2da4 100644 --- a/assets/shaders/distance_field.fs +++ b/assets/shaders/distance_field.fs @@ -23,7 +23,7 @@ float getBallInfluence(vec2 pos, vec2 center, float radius) { float getShapeInfluence(vec2 pos) { vec2 uv = pos / resolution; - uv.y = 1 - uv.y + 0.045; // invert y and offset to match with wallpaper texture + uv.y = 1.0 - uv.y; if (any(lessThan(uv, vec2(0.0))) || any(greaterThan(uv, vec2(1.0)))) { return 0.0; diff --git a/assets/textures/background_distance_field.png b/assets/textures/background_distance_field.png index 405e0c7..de50e35 100644 Binary files a/assets/textures/background_distance_field.png and b/assets/textures/background_distance_field.png differ diff --git a/src/distance_field_generator.c b/src/distance_field_generator.c index e5c8132..2f65a06 100644 --- a/src/distance_field_generator.c +++ b/src/distance_field_generator.c @@ -7,7 +7,7 @@ static bool is_inside_shape(Color pixel) { return pixel.r == 255 && pixel.g == 255 && pixel.b == 255; } -static Image generate_distance_field(Image input_texture, int search_radius) { +static Image generate_distance_field(Image input_texture, int search_radius, int offset_y) { int width = input_texture.width; int height = input_texture.height; @@ -25,7 +25,10 @@ static Image generate_distance_field(Image input_texture, int search_radius) { for (int x = 0; x < width; x += 1) { int index = y * width + x; - bool is_inside = is_inside_shape(input_pixels[index]); + int src_y = y + offset_y; + bool is_inside = (src_y >= 0 && src_y < height) + ? is_inside_shape(input_pixels[src_y * width + x]) + : false; float min_distance_sq = search_radius * search_radius; bool found_boundary = false; @@ -33,7 +36,7 @@ static Image generate_distance_field(Image input_texture, int search_radius) { for (int dy = -search_radius; dy <= search_radius; dy += 1) { for (int dx = -search_radius; dx <= search_radius; dx += 1) { int sample_x = x + dx; - int sample_y = y + dy; + int sample_y = y + dy + offset_y; if (sample_x < 0 || sample_x >= width || sample_y < 0 || sample_y >= height) continue; @@ -74,13 +77,15 @@ static Image generate_distance_field(Image input_texture, int search_radius) { int main(int argc, char *argv[]) { if (argc < 3) { - TraceLog(LOG_ERROR, "Usage: %s [search_radius]", argv[0]); + TraceLog(LOG_ERROR, "Usage: %s [search_radius] [ball_radius]", argv[0]); return 1; } const char *input_path = argv[1]; const char *output_path = argv[2]; int search_radius = (argc >= 4) ? atoi(argv[3]) : 100; + int ball_radius = (argc >= 5) ? atoi(argv[4]) : 0; + int offset_y = ball_radius / 2; Image input_image = LoadImage(input_path); if (input_image.data == NULL) { @@ -88,7 +93,7 @@ int main(int argc, char *argv[]) return 1; } - Image distance_field_image = generate_distance_field(input_image, search_radius); + Image distance_field_image = generate_distance_field(input_image, search_radius, offset_y); if (!ExportImage(distance_field_image, output_path)) { TraceLog(LOG_ERROR, "Failed to save output image '%s'", output_path); UnloadImage(input_image);