diff --git a/src/Shaders/Gradients/Linear.gdshader b/src/Shaders/Gradients/Linear.gdshader index 2a97084f3..41314dea1 100644 --- a/src/Shaders/Gradients/Linear.gdshader +++ b/src/Shaders/Gradients/Linear.gdshader @@ -14,7 +14,7 @@ uniform int repeat = 0; // 0 = none, 1 = repeat, 2 = mirrored, 3 = truncate float modify_uv(vec2 uv) { float modified_uv; - if (shape == 0) { + if (shape == 0) { // Linear vec2 uv_offsetted = uv - 0.5; float angle_cos = cos(radians(angle)); float angle_sin = sin(radians(angle)); @@ -24,7 +24,7 @@ float modify_uv(vec2 uv) { float pivot = position / size; modified_uv -= pivot - 0.5; } - else { + else { // Radial vec2 uv_offsetted = uv * 2.0 - 1.0; uv_offsetted -= (center * 2.0) - vec2(1.0); uv_offsetted *= radius; @@ -33,6 +33,7 @@ float modify_uv(vec2 uv) { return modified_uv; } + float mirror_fract(float uv) { int sign_uv = (int(sign(uv)) - 1) / 2; if (int((uv)) % 2 == sign_uv) diff --git a/src/Shaders/Gradients/LinearDithering.gdshader b/src/Shaders/Gradients/LinearDithering.gdshader index 223209d7a..20f5e6120 100644 --- a/src/Shaders/Gradients/LinearDithering.gdshader +++ b/src/Shaders/Gradients/LinearDithering.gdshader @@ -19,7 +19,7 @@ uniform int n_of_colors = 2; float modify_uv(vec2 uv) { float modified_uv; - if (shape == 0) { + if (shape == 0) { // Linear vec2 uv_offsetted = uv - 0.5; float angle_cos = cos(radians(angle)); float angle_sin = sin(radians(angle)); @@ -29,7 +29,7 @@ float modify_uv(vec2 uv) { float pivot = position / size; modified_uv -= pivot - 0.5; } - else { + else { // Radial vec2 uv_offsetted = uv * 2.0 - 1.0; uv_offsetted -= (center * 2.0) - vec2(1.0); uv_offsetted *= radius; @@ -52,7 +52,7 @@ float mirror_fract(float uv) { // Logic taken from https://godotshaders.com/shader/dither-gradient-shader/ float dither(vec2 uv, float modified_uv) { float uv_lower = floor(modified_uv); - float uv_upper = (floor(modified_uv) + 1.0); + float uv_upper = floor(modified_uv) + 1.0; float threshold = texture(dither_texture, uv * (image_size / float(pixel_size))).r; float ramp_val = modified_uv < threshold ? 0.0 : 1.0; // sample at the lower bound colour if ramp_val is 0.0, upper bound color if 1.0 diff --git a/src/UI/Dialogs/ImageEffects/GradientDialog.gd b/src/UI/Dialogs/ImageEffects/GradientDialog.gd index a076f0cce..59b978415 100644 --- a/src/UI/Dialogs/ImageEffects/GradientDialog.gd +++ b/src/UI/Dialogs/ImageEffects/GradientDialog.gd @@ -70,22 +70,34 @@ func commit_action(cel: Image, project: Project = Global.current_project) -> voi var dither_texture: Texture = selected_dither_matrix.texture var pixel_size := dither_texture.get_width() - var gradient: Gradient = gradient_edit.texture.gradient + var gradient: Gradient = gradient_edit.gradient var n_of_colors := gradient.offsets.size() # Pass the gradient offsets as an array to the shader # ...but since Godot 3.x doesn't support uniform arrays, instead we construct # a nx1 grayscale texture with each offset stored in each pixel, and pass it to the shader var offsets_image := Image.new() offsets_image.create(n_of_colors, 1, false, Image.FORMAT_L8) + # Construct an image that contains the selected colors of the gradient without interpolation + var gradient_image := Image.new() + gradient_image.create(n_of_colors, 1, false, Image.FORMAT_RGBA8) offsets_image.lock() + gradient_image.lock() for i in n_of_colors: var c := gradient.offsets[i] offsets_image.set_pixel(i, 0, Color(c, c, c, c)) + gradient_image.set_pixel(i, 0, gradient.colors[i]) offsets_image.unlock() + gradient_image.unlock() var offsets_tex := ImageTexture.new() offsets_tex.create_from_image(offsets_image, 0) + var gradient_tex: Texture + if shader == shader_linear: + gradient_tex = gradient_edit.texture + else: + gradient_tex = ImageTexture.new() + gradient_tex.create_from_image(gradient_image, 0) var params := { - "gradient_texture": gradient_edit.texture, + "gradient_texture": gradient_tex, "offset_texture": offsets_tex, "selection": selection_tex, "repeat": repeat_option_button.selected,