bevy_mod_outline 0.13.0

A mesh outlining plugin for Bevy.
Documentation
#import bevy_core_pipeline::fullscreen_vertex_shader::FullscreenVertexOutput

struct JumpFloodUniform {
    step_length: u32,
    _padding: vec3<f32>
}

@group(0) @binding(0) var screen_texture: texture_2d<f32>;
@group(0) @binding(1) var<uniform> instance: JumpFloodUniform;

@fragment
fn fragment(in: FullscreenVertexOutput) -> @location(0) vec4<f32> {
    let dims = vec2<i32>(textureDimensions(screen_texture));
    let step = i32(instance.step_length);
    let pos = vec2<i32>(in.position.xy);

    var result = textureLoad(screen_texture, pos, 0).xy;
    var closest_dist = length(result);

    // Check all 8 neighbouring pixels at the current step distance.
    for (var dy = -1; dy <= 1; dy++) {
        for (var dx = -1; dx <= 1; dx++) {
            if (dx == 0 && dy == 0) {
                continue;
            }

            let offset = vec2<i32>(dx * step, dy * step);
            let neighbour_coord = pos + offset;
            if (any(neighbour_coord < vec2<i32>(0)) || any(neighbour_coord >= dims)) {
                continue;
            }

            let delta = textureLoad(screen_texture, neighbour_coord, 0).xy + vec2<f32>(offset);
            let dist = length(delta);

            if (dist < closest_dist) {
                closest_dist = dist;
                result = delta;
            }
        }
    }
    return vec4<f32>(result, 0.0, 0.0);
}