Add visible flag to Outline component.
This commit is contained in:
parent
3dd9c4c367
commit
75dcc9077c
@ -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,
|
||||||
})
|
})
|
||||||
|
10
src/lib.rs
10
src/lib.rs
@ -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(
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::{
|
ecs::system::{
|
||||||
query::QueryItem,
|
|
||||||
system::{
|
|
||||||
lifetimeless::{Read, SQuery, SRes},
|
lifetimeless::{Read, SQuery, SRes},
|
||||||
SystemParamItem,
|
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>,
|
||||||
|
Loading…
Reference in New Issue
Block a user