1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-19 01:29:49 +00:00

Pass a transformation matrix in CommonRotation shaders instead of an angle

This will allow us to implement shearing more easily. Also, for the non-SmearRotxel shaders, normalize their pivot in GDScript, before passing it to the script. Should probably be faster this way
This commit is contained in:
Emmanouil Papadeas 2024-05-09 00:44:52 +03:00
parent 25f7192573
commit e15b207993
6 changed files with 21 additions and 33 deletions

View file

@ -1,22 +1,14 @@
uniform sampler2D selection_tex : filter_nearest; uniform sampler2D selection_tex : filter_nearest;
uniform vec2 pivot_pixel; uniform vec2 pivot;
uniform float angle; uniform mat2 transformation_matrix;
vec2 rotate(vec2 uv, vec2 pivot, float ratio) { vec2 rotate(vec2 uv, float ratio) {
// Scale and center image // Scale and center image
uv.x -= pivot.x; uv.x = (uv.x - pivot.x) * ratio + pivot.x;
uv.x *= ratio; uv -= pivot;
uv.x += pivot.x;
// Rotate image // Rotate image
uv -= pivot; uv *= transformation_matrix;
mat3 transformation = mat3(
vec3(cos(angle), -sin(angle), 0.0),
vec3(sin(angle), cos(angle), 0.0),
vec3(0.0, 0.0, 1.0)
);
uv = (transformation * vec3(uv, 1.0)).xy;
uv.x /= ratio; uv.x /= ratio;
uv += pivot; uv += pivot;

View file

@ -8,10 +8,9 @@ void fragment() {
vec4 original = texture(TEXTURE, UV); vec4 original = texture(TEXTURE, UV);
vec2 tex_size = 1.0 / TEXTURE_PIXEL_SIZE; // Texture size in real pixel coordinates vec2 tex_size = 1.0 / TEXTURE_PIXEL_SIZE; // Texture size in real pixel coordinates
vec2 pixelated_uv = floor(UV * tex_size) / (tex_size - 1.0); // Pixelate UV to fit resolution vec2 pixelated_uv = floor(UV * tex_size) / (tex_size - 1.0); // Pixelate UV to fit resolution
vec2 pivot = pivot_pixel / tex_size; // Normalize pivot position
float ratio = tex_size.x / tex_size.y; // Resolution ratio float ratio = tex_size.x / tex_size.y; // Resolution ratio
vec2 rotated_uv = rotate(pixelated_uv, pivot, ratio); vec2 rotated_uv = rotate(pixelated_uv, ratio);
vec4 rotated_color = texture(TEXTURE, rotated_uv); // Rotated image vec4 rotated_color = texture(TEXTURE, rotated_uv); // Rotated image
COLOR = mix_rotated_and_original(rotated_color, original, UV, rotated_uv, TEXTURE_PIXEL_SIZE); COLOR = mix_rotated_and_original(rotated_color, original, UV, rotated_uv, TEXTURE_PIXEL_SIZE);
} }

View file

@ -292,15 +292,14 @@ void fragment()
{ {
vec4 original = texture(TEXTURE, UV); vec4 original = texture(TEXTURE, UV);
vec2 size = 1.0 / TEXTURE_PIXEL_SIZE; vec2 size = 1.0 / TEXTURE_PIXEL_SIZE;
vec2 pivot = pivot_pixel / size; // Normalize pivot position
float ratio = size.x / size.y; // Resolution ratio float ratio = size.x / size.y; // Resolution ratio
vec2 pixelated_uv = floor(UV * size) / (size - 1.0); // Pixelate UV to fit resolution vec2 pixelated_uv = floor(UV * size) / (size - 1.0); // Pixelate UV to fit resolution
vec2 rotated_uv; vec2 rotated_uv;
if (preview) { if (preview) {
rotated_uv = rotate(pixelated_uv, pivot, ratio); rotated_uv = rotate(pixelated_uv, ratio);
} }
else { else {
rotated_uv = rotate(UV, pivot, ratio); rotated_uv = rotate(UV, ratio);
} }
vec4 c = scale(TEXTURE, rotated_uv, TEXTURE_PIXEL_SIZE); vec4 c = scale(TEXTURE, rotated_uv, TEXTURE_PIXEL_SIZE);

View file

@ -6,7 +6,7 @@ uniform sampler2D selection_tex : filter_nearest;
uniform float initial_angle = 0.0; uniform float initial_angle = 0.0;
uniform float ending_angle = 0.0; uniform float ending_angle = 0.0;
uniform float tolerance : hint_range(0.0, 255.0) = 100.0; uniform float tolerance : hint_range(0.0, 255.0) = 100.0;
uniform vec2 origin = vec2(0.0, 0.0); uniform vec2 pivot = vec2(0.0, 0.0);
uniform vec2 position = vec2(0.0, 0.0); uniform vec2 position = vec2(0.0, 0.0);
bool similarColors(vec4 c1, vec4 c2) { bool similarColors(vec4 c1, vec4 c2) {
@ -16,7 +16,7 @@ bool similarColors(vec4 c1, vec4 c2) {
vec4 rotate(sampler2D tex, vec2 uv, vec2 tex_pixel_size) { vec4 rotate(sampler2D tex, vec2 uv, vec2 tex_pixel_size) {
vec4 color = vec4(0.0); vec4 color = vec4(0.0);
vec2 center = origin / tex_pixel_size; vec2 center = pivot / tex_pixel_size;
vec2 size = 1.0 / tex_pixel_size; vec2 size = 1.0 / tex_pixel_size;
vec2 coord = uv / tex_pixel_size + position; vec2 coord = uv / tex_pixel_size + position;
int dx = 3 * (int(coord.x) - int(center.x)); int dx = 3 * (int(coord.x) - int(center.x));
@ -113,7 +113,7 @@ vec4 rotate(sampler2D tex, vec2 uv, vec2 tex_pixel_size) {
// The exact same as rotate, but had to be re-defined due to https://github.com/godotengine/godot/issues/75935 // The exact same as rotate, but had to be re-defined due to https://github.com/godotengine/godot/issues/75935
vec4 rotate_uniform(sampler2D tex, vec2 uv, vec2 tex_pixel_size) { vec4 rotate_uniform(sampler2D tex, vec2 uv, vec2 tex_pixel_size) {
vec4 color = vec4(0.0); vec4 color = vec4(0.0);
vec2 center = origin / tex_pixel_size; vec2 center = pivot / tex_pixel_size;
vec2 size = 1.0 / tex_pixel_size; vec2 size = 1.0 / tex_pixel_size;
vec2 coord = uv / tex_pixel_size + position; vec2 coord = uv / tex_pixel_size + position;
int dx = 3 * (int(coord.x) - int(center.x)); int dx = 3 * (int(coord.x) - int(center.x));

View file

@ -275,15 +275,14 @@ void fragment() {
vec2 size = 1.0/TEXTURE_PIXEL_SIZE+0.0001; //fix for some sort of rounding error vec2 size = 1.0/TEXTURE_PIXEL_SIZE+0.0001; //fix for some sort of rounding error
// Pixelorama edit // Pixelorama edit
vec4 original = texture(TEXTURE, UV); vec4 original = texture(TEXTURE, UV);
vec2 pivot = pivot_pixel / size; // Normalize pivot position
float ratio = size.x / size.y; // Resolution ratio float ratio = size.x / size.y; // Resolution ratio
vec2 pixelated_uv = floor(UV * size) / (size - 1.0); // Pixelate UV to fit resolutio vec2 pixelated_uv = floor(UV * size) / (size - 1.0); // Pixelate UV to fit resolutio
vec2 rotated_uv; vec2 rotated_uv;
if (preview) { if (preview) {
rotated_uv = rotate(pixelated_uv, pivot, ratio); rotated_uv = rotate(pixelated_uv, ratio);
} }
else { else {
rotated_uv = rotate(UV, pivot, ratio); rotated_uv = rotate(UV, ratio);
} }
vec2 px = rotated_uv * size; vec2 px = rotated_uv * size;
vec2 local = fract(px); vec2 local = fract(px);

View file

@ -99,17 +99,16 @@ func commit_action(cel: Image, _project := Global.current_project) -> void:
if _type_is_shader(): if _type_is_shader():
var shader := rotxel_shader var shader := rotxel_shader
var params := { var params := {
"angle": angle, "selection_tex": selection_tex, "pivot_pixel": pivot, "preview": true "transformation_matrix": Transform2D(angle, Vector2.ZERO),
"selection_tex": selection_tex,
"pivot": pivot / Vector2(cel.get_size()),
"preview": true
} }
match type_option_button.get_selected_id(): match type_option_button.get_selected_id():
ROTXEL_SMEAR: ROTXEL_SMEAR:
params = { params["ending_angle"] = angle
"initial_angle": init_angle, params["initial_angle"] = init_angle
"ending_angle": angle, params["tolerance"] = tolerance_slider.value
"tolerance": tolerance_slider.value,
"selection_tex": selection_tex,
"origin": pivot / Vector2(cel.get_size()),
}
CLEANEDGE: CLEANEDGE:
shader = DrawingAlgos.clean_edge_shader shader = DrawingAlgos.clean_edge_shader
OMNISCALE: OMNISCALE: