1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 09:09:47 +00:00

Some minor optimizations in BlendLayer.gdshader

This commit is contained in:
Emmanouil Papadeas 2024-07-24 00:48:16 +03:00
parent cec0073a84
commit 40be1a9559

View file

@ -146,35 +146,37 @@ float border_trim(vec4 color, vec2 uv) {
void fragment() {
ivec2 metadata_size = textureSize(metadata, 0) - 1;
vec2 first_origin = texture(metadata, vec2(0.0, 2.0 / float(metadata_size.y))).rg;
vec2 metadata_size_float = vec2(metadata_size);
vec2 first_origin = texture(metadata, vec2(0.0, 2.0 / metadata_size_float.y)).rg;
if (!origin_x_positive) {
first_origin.x = -first_origin.x;
}
if (!origin_y_positive) {
first_origin.y = -first_origin.y;
}
float first_opacity = texture(metadata, vec2(0.0, 1.0 / float(metadata_size.y))).r;
float first_opacity = texture(metadata, vec2(0.0, 1.0 / metadata_size_float.y)).r;
vec4 result_color = texture(layers, vec3(UV - first_origin, 0.0));
result_color.a = border_trim(result_color, UV - first_origin);
result_color.a *= first_opacity;
for(int i = 1; i < metadata_size.x + 1; i++) // Loops through every layer
{
float blend_mode_float = texture(metadata, vec2(float(i) / float(metadata_size.x), 0.0)).r;
float layer_index = float(i) / metadata_size_float.x;
float blend_mode_float = texture(metadata, vec2(layer_index, 0.0)).r;
// Blend modes are being stored as integers divided by 255, so convert them back to
// their integer form
int current_blend_mode = int(floor(blend_mode_float * 255.0));
vec2 current_origin = texture(metadata, vec2(float(i) / float(metadata_size.x), 2.0 / float(metadata_size.y))).rg;
vec2 current_origin = texture(metadata, vec2(layer_index, 2.0 / metadata_size_float.y)).rg;
if (!origin_x_positive) {
current_origin.x = -current_origin.x;
}
if (!origin_y_positive) {
current_origin.y = -current_origin.y;
}
float current_opacity = texture(metadata, vec2(float(i) / float(metadata_size.x), 1.0 / float(metadata_size.y))).r;
float current_opacity = texture(metadata, vec2(layer_index, 1.0 / metadata_size_float.y)).r;
vec2 uv = UV - current_origin;
vec4 layer_color = texture(layers, vec3(uv, float(i)));
vec4 prev_layer_color = texture(layers, vec3(uv, float(i - 1)));
float clipping_mask = texture(metadata, vec2(float(i) / float(metadata_size.x), 3.0 / float(metadata_size.y))).r;
float clipping_mask = texture(metadata, vec2(layer_index, 3.0 / metadata_size_float.y)).r;
layer_color.a *= prev_layer_color.a * step(0.5, clipping_mask) + 1.0 * step(clipping_mask, 0.5);
layer_color.a = border_trim(layer_color, uv);
result_color = blend(current_blend_mode, layer_color, result_color, current_opacity);