fix: distance_field_generator now takes the ball_radius as input parameter instead of hardcoded offset

This commit is contained in:
2026-04-11 15:27:29 +02:00
parent a1a6ba4c34
commit 2b9c503c9e
3 changed files with 11 additions and 6 deletions

View File

@@ -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;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 193 KiB

View File

@@ -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 <input_image> <output_image> [search_radius]", argv[0]);
TraceLog(LOG_ERROR, "Usage: %s <input_image> <output_image> [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);