Add visible flag to Outline component.

This commit is contained in:
Robin KAY 2022-08-08 22:40:38 +01:00
parent 3dd9c4c367
commit 75dcc9077c
3 changed files with 32 additions and 30 deletions

View File

@ -36,6 +36,7 @@ fn setup(
material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()), material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
..default() ..default()
}); });
let mut cube_mesh = Mesh::from(Cube { size: 1.0 }); let mut cube_mesh = Mesh::from(Cube { size: 1.0 });
cube_mesh.generate_outline_normals().unwrap(); cube_mesh.generate_outline_normals().unwrap();
commands commands
@ -46,11 +47,13 @@ fn setup(
..default() ..default()
}) })
.insert(Outline { .insert(Outline {
visible: true,
colour: Color::rgba(0.0, 1.0, 0.0, 1.0), colour: Color::rgba(0.0, 1.0, 0.0, 1.0),
width: 25.0, width: 25.0,
}) })
.insert(OutlineStencil) .insert(OutlineStencil)
.insert(Wobbles); .insert(Wobbles);
commands commands
.spawn_bundle(PbrBundle { .spawn_bundle(PbrBundle {
mesh: meshes.add(Mesh::from(Torus { mesh: meshes.add(Mesh::from(Torus {
@ -65,6 +68,7 @@ fn setup(
..default() ..default()
}) })
.insert(Outline { .insert(Outline {
visible: true,
colour: Color::rgba(1.0, 0.0, 1.0, 0.3), colour: Color::rgba(1.0, 0.0, 1.0, 0.3),
width: 15.0, width: 15.0,
}) })

View File

@ -16,7 +16,10 @@ use crate::node::{OpaqueOutline, OutlineNode, StencilOutline, TransparentOutline
use crate::pipeline::{ use crate::pipeline::{
OutlinePipeline, COMMON_SHADER_HANDLE, OUTLINE_SHADER_HANDLE, STENCIL_SHADER_HANDLE, OutlinePipeline, COMMON_SHADER_HANDLE, OUTLINE_SHADER_HANDLE, STENCIL_SHADER_HANDLE,
}; };
use crate::uniforms::{queue_outline_bind_group, OutlineFragmentUniform, OutlineVertexUniform}; use crate::uniforms::{
extract_outline_uniforms, queue_outline_bind_group, OutlineFragmentUniform,
OutlineVertexUniform,
};
use crate::view_uniforms::{ use crate::view_uniforms::{
extract_outline_view_uniforms, queue_outline_view_bind_group, OutlineViewUniform, extract_outline_view_uniforms, queue_outline_view_bind_group, OutlineViewUniform,
}; };
@ -52,6 +55,8 @@ impl ExtractComponent for OutlineStencil {
/// A component for rendering outlines around meshes. /// A component for rendering outlines around meshes.
#[derive(Clone, Component)] #[derive(Clone, Component)]
pub struct Outline { pub struct Outline {
/// Enable rendering of the outline
pub visible: bool,
/// Width of the outline in logical pixels /// Width of the outline in logical pixels
pub width: f32, pub width: f32,
/// Colour of the outline /// Colour of the outline
@ -145,8 +150,6 @@ impl Plugin for OutlinePlugin {
); );
app.add_plugin(ExtractComponentPlugin::<OutlineStencil>::extract_visible()) app.add_plugin(ExtractComponentPlugin::<OutlineStencil>::extract_visible())
.add_plugin(ExtractComponentPlugin::<OutlineVertexUniform>::default())
.add_plugin(ExtractComponentPlugin::<OutlineFragmentUniform>::default())
.add_plugin(UniformComponentPlugin::<OutlineVertexUniform>::default()) .add_plugin(UniformComponentPlugin::<OutlineVertexUniform>::default())
.add_plugin(UniformComponentPlugin::<OutlineFragmentUniform>::default()) .add_plugin(UniformComponentPlugin::<OutlineFragmentUniform>::default())
.add_plugin(UniformComponentPlugin::<OutlineViewUniform>::default()) .add_plugin(UniformComponentPlugin::<OutlineViewUniform>::default())
@ -160,6 +163,7 @@ impl Plugin for OutlinePlugin {
.add_render_command::<OpaqueOutline, DrawOutline>() .add_render_command::<OpaqueOutline, DrawOutline>()
.add_render_command::<TransparentOutline, DrawOutline>() .add_render_command::<TransparentOutline, DrawOutline>()
.add_system_to_stage(RenderStage::Extract, extract_outline_view_uniforms) .add_system_to_stage(RenderStage::Extract, extract_outline_view_uniforms)
.add_system_to_stage(RenderStage::Extract, extract_outline_uniforms)
.add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<StencilOutline>) .add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<StencilOutline>)
.add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<OpaqueOutline>) .add_system_to_stage(RenderStage::PhaseSort, sort_phase_system::<OpaqueOutline>)
.add_system_to_stage( .add_system_to_stage(

View File

@ -1,17 +1,15 @@
use bevy::{ use bevy::{
ecs::{ ecs::system::{
query::QueryItem, lifetimeless::{Read, SQuery, SRes},
system::{ SystemParamItem,
lifetimeless::{Read, SQuery, SRes},
SystemParamItem,
},
}, },
prelude::*, prelude::*,
render::{ render::{
extract_component::{ComponentUniforms, DynamicUniformIndex, ExtractComponent}, extract_component::{ComponentUniforms, DynamicUniformIndex},
render_phase::{EntityRenderCommand, RenderCommandResult, TrackedRenderPass}, render_phase::{EntityRenderCommand, RenderCommandResult, TrackedRenderPass},
render_resource::{BindGroup, BindGroupDescriptor, BindGroupEntry, ShaderType}, render_resource::{BindGroup, BindGroupDescriptor, BindGroupEntry, ShaderType},
renderer::RenderDevice, renderer::RenderDevice,
Extract,
}, },
}; };
@ -22,35 +20,31 @@ pub struct OutlineVertexUniform {
pub width: f32, pub width: f32,
} }
impl ExtractComponent for OutlineVertexUniform {
type Query = Read<Outline>;
type Filter = ();
fn extract_component(item: QueryItem<Self::Query>) -> Self {
OutlineVertexUniform { width: item.width }
}
}
#[derive(Clone, Component, ShaderType)] #[derive(Clone, Component, ShaderType)]
pub struct OutlineFragmentUniform { pub struct OutlineFragmentUniform {
pub colour: Vec4, pub colour: Vec4,
} }
impl ExtractComponent for OutlineFragmentUniform {
type Query = Read<Outline>;
type Filter = ();
fn extract_component(item: QueryItem<Self::Query>) -> Self {
OutlineFragmentUniform {
colour: item.colour.as_linear_rgba_f32().into(),
}
}
}
pub struct OutlineBindGroup { pub struct OutlineBindGroup {
pub bind_group: BindGroup, pub bind_group: BindGroup,
} }
pub fn extract_outline_uniforms(mut commands: Commands, query: Extract<Query<(Entity, &Outline)>>) {
for (entity, outline) in query.iter() {
if !outline.visible || outline.colour.a() == 0.0 {
continue;
}
commands
.get_or_spawn(entity)
.insert(OutlineVertexUniform {
width: outline.width,
})
.insert(OutlineFragmentUniform {
colour: outline.colour.as_linear_rgba_f32().into(),
});
}
}
pub fn queue_outline_bind_group( pub fn queue_outline_bind_group(
mut commands: Commands, mut commands: Commands,
render_device: Res<RenderDevice>, render_device: Res<RenderDevice>,