perovskite_client 0.3.2

Multiplayer voxel game written in Rust - Game client
#version 460
layout (set = 0, binding = 0, rgba8) uniform restrict readonly image2D deferred_specular_color;
layout (set = 0, binding = 1, rgba32ui) uniform restrict readonly uimage2D deferred_specular_ray_dir;
layout(location = 0) out uvec4 deferred_specular_ray_dir_out;

#include "raytracer_spec_constants.glsl"

void main() {
    ivec2 max_coord = imageSize(deferred_specular_color).xy - ivec2(1, 1);

    uint best_distance = SPECULAR_DOWNSAMPLING + 10;
    deferred_specular_ray_dir_out = uvec4(0);
    bool keep = false;
    ivec2 base = (ivec2(gl_FragCoord.xy) * int(SPECULAR_DOWNSAMPLING));
    for (int i = 0; i < SPECULAR_DOWNSAMPLING; i++) {
        for (int j = 0; j < SPECULAR_DOWNSAMPLING; j++) {
            ivec2 coord = clamp(base + ivec2(i, j), ivec2(0, 0), ivec2(max_coord));
            vec4 spec_color = imageLoad(deferred_specular_color, coord);
            uvec4 dsrd = imageLoad(deferred_specular_ray_dir, coord);
            uint distance = abs(i - int(SPECULAR_DOWNSAMPLING) / 2) + abs(j - int(SPECULAR_DOWNSAMPLING / 2));
            if ((dsrd.a != 0) && (distance < best_distance)) {
                deferred_specular_ray_dir_out = dsrd;
                best_distance = distance;
            }
            if (spec_color.a > 0.5) {
                keep = true;
            }
        }
    }

    if (!keep) {
        discard;
    }
}