| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- shader_type canvas_item;
- uniform sampler2D screen_texture : hint_screen_texture, filter_nearest;
- uniform sampler2D palette_texture;
- uniform vec4 shadow_colour : source_color;
- uniform float y_offset : hint_range(0, 2);
- uniform int palette_size = 8;
- uniform bool is_debug = false;
- int get_palette_index(vec4 color) {
- ivec4 quantized_color = ivec4(floor(color * 255.0 + 0.5)); // Quantize the color
- for (int i = 0; i < palette_size; i++) {
- float index = (float(i) + 0.5) / float(palette_size); // Sample at the center of each color slot
- vec4 palette_color = texture(palette_texture, vec2(index, 0.0));
- ivec4 quantized_palette = ivec4(floor(palette_color * 255.0 + 0.5)); // Quantize the palette color
- if (quantized_color == quantized_palette) {
- return i; // Found exact match
- }
- }
- return -1; // No match found
- }
- void fragment() {
- vec4 screen_color = texture(screen_texture, SCREEN_UV);
- // Check if the color is close to the shadow colo
- int palette_index;
- palette_index = get_palette_index(screen_color);
- // Normalize the palette index for UV lookup
- if (palette_index != -1) {
- float palette_uv_x = (float(palette_index) + 0.5) / float(palette_size);
- float palette_uv_y = (float(y_offset) + 0.5) / float(3);
- COLOR = texture(palette_texture, vec2(palette_uv_x, palette_uv_y));
- } else {
- // Fallback if no match (this should only happen if no matching palette index is found)
- if (is_debug)
- {
- COLOR = texture(palette_texture, vec2(float(palette_size), 0.0));
- } else
- {
- COLOR = screen_color;
- }
- }
- }
|