bevy_mod_outline 0.13.0

A mesh outlining plugin for Bevy.
Documentation
#define_import_path bevy_mod_outline::common

#import bevy_render::maths

struct OutlineViewUniform {
    clip_from_world: mat4x4<f32>,
    world_from_view_a: mat2x4<f32>,
    world_from_view_b: f32,
    aspect: f32,
    scale_clip_from_logical: vec2<f32>,
    scale_physical_from_logical: f32,
};

struct VertexOutput {
    @builtin(position) position: vec4<f32>,
#ifdef FLAT_DEPTH
    @location(0) @interpolate(flat) flat_depth: f32,
#endif
#ifdef VOLUME
    @location(1) @interpolate(flat) volume_colour: vec4<f32>,
#endif
#ifdef ALPHA_MASK_TEXTURE
    @location(2) @interpolate(flat) alpha_mask_threshold: f32,
    @location(3) uv: vec2<f32>,
#endif
};

fn model_origin_z(plane: vec3<f32>, view_proj: mat4x4<f32>) -> f32 {
    var proj_zw = mat4x2<f32>(
        view_proj[0].zw, view_proj[1].zw,
        view_proj[2].zw, view_proj[3].zw);
    var zw = proj_zw * vec4<f32>(plane, 1.0);
    return zw.x / zw.y;
}

fn outline_flat_depth(
    view: OutlineViewUniform,
    world_plane_origin: vec3<f32>,
    world_plane_offset: vec3<f32>,
) -> f32 {
    let world_from_view = bevy_render::maths::mat2x4_f32_to_mat3x3_unpack(
        view.world_from_view_a,
        view.world_from_view_b,
    );
    let model_eye = normalize(world_from_view * vec3<f32>(0.0, 0.0, -1.0));
    let world_pos = world_plane_origin + model_eye * world_plane_offset;
    return model_origin_z(world_pos, view.clip_from_world);
}