1+ use bevy:: shader:: ShaderDefVal ;
12use bevy:: {
23 core_pipeline:: FullscreenShader ,
34 platform:: collections:: HashMap ,
@@ -12,7 +13,7 @@ use bevy::{
1213 SamplerDescriptor , ShaderType , StoreOp ,
1314 } ,
1415 renderer:: { RenderContext , RenderDevice , RenderQueue } ,
15- sync_world:: { MainEntity , MainEntityHashMap } ,
16+ sync_world:: MainEntity ,
1617 texture:: CachedTexture ,
1718 view:: { ExtractedView , ViewDepthTexture , ViewTarget } ,
1819 } ,
@@ -23,38 +24,61 @@ use wgpu_types::{
2324 TextureFormat , TextureSampleType ,
2425} ;
2526
26- use crate :: { pipeline_key:: ViewPipelineKey , uniforms:: RenderOutlineInstances } ;
27+ use crate :: {
28+ culling:: RenderExtractedOutlineEntities , pipeline_key:: ViewPipelineKey ,
29+ uniforms:: RenderOutlineInstances ,
30+ } ;
2731
2832use super :: { DrawMode , OutlineViewUniform , COMPOSE_OUTPUT_SHADER_HANDLE } ;
2933
3034#[ derive( Clone , ShaderType ) ]
3135pub ( crate ) struct ComposeOutputUniform {
36+ pub flat_depth : f32 ,
3237 pub volume_offset : f32 ,
3338 pub volume_colour : Vec4 ,
3439}
3540
3641#[ derive( Resource , Default ) ]
3742pub ( crate ) struct ComposeOutputUniforms {
3843 pub buffer : DynamicUniformBuffer < ComposeOutputUniform > ,
39- pub offsets : MainEntityHashMap < u32 > ,
44+ pub offsets : HashMap < ( Entity , MainEntity ) , u32 > ,
4045}
4146
4247pub ( crate ) fn prepare_compose_output_uniform (
4348 render_outlines : Res < RenderOutlineInstances > ,
49+ render_extracted : Res < RenderExtractedOutlineEntities > ,
50+ views : Query < ( Entity , & ExtractedView , & OutlineViewUniform ) > ,
4451 mut uniforms : ResMut < ComposeOutputUniforms > ,
4552 render_device : Res < RenderDevice > ,
4653 render_queue : Res < RenderQueue > ,
4754) {
4855 let uniforms = uniforms. as_mut ( ) ;
4956 uniforms. buffer . clear ( ) ;
5057 uniforms. offsets . clear ( ) ;
51- for ( main_entity, outline) in render_outlines. iter ( ) {
52- if outline. draw_mode == DrawMode :: JumpFlood {
58+ for ( view_entity, view_extracted, view) in views. iter ( ) {
59+ let Some ( render_view_extracted) = render_extracted
60+ . views
61+ . get ( & view_extracted. retained_view_entity )
62+ else {
63+ continue ;
64+ } ;
65+ let model_eye = view_extracted. world_from_view . forward ( ) ;
66+ for ( _, main_entity) in render_view_extracted. visible_entities . entities . iter ( ) {
67+ let Some ( outline) = render_outlines. get ( main_entity) else {
68+ continue ;
69+ } ;
70+ if outline. draw_mode != DrawMode :: JumpFlood {
71+ continue ;
72+ }
73+ let world_plane = outline. instance_data . world_plane_origin
74+ + * model_eye * outline. instance_data . world_plane_offset ;
75+ let clip = view. clip_from_world * world_plane. extend ( 1.0 ) ;
5376 let offset = uniforms. buffer . push ( & ComposeOutputUniform {
77+ flat_depth : clip. z / clip. w ,
5478 volume_offset : outline. instance_data . volume_offset ,
5579 volume_colour : outline. instance_data . volume_colour ,
5680 } ) ;
57- uniforms. offsets . insert ( * main_entity, offset) ;
81+ uniforms. offsets . insert ( ( view_entity , * main_entity) , offset) ;
5882 }
5983 }
6084 uniforms. buffer . write_buffer ( & render_device, & render_queue) ;
@@ -101,13 +125,17 @@ impl ComposeOutputPipeline {
101125 key : ViewPipelineKey ,
102126 ) -> CachedRenderPipelineId {
103127 * self . pipeline_cache . entry ( key) . or_insert_with ( || {
128+ let mut shader_defs = vec ! [ ] ;
129+ if key. msaa ( ) . samples ( ) > 1 {
130+ shader_defs. push ( ShaderDefVal :: from ( "MSAA" ) ) ;
131+ }
104132 pipeline_cache. queue_render_pipeline ( RenderPipelineDescriptor {
105133 label : Some ( "outline_flood_compose_output_pipeline" . into ( ) ) ,
106134 layout : vec ! [ self . layout. clone( ) ] ,
107135 vertex : fullscreen_shader. to_vertex_state ( ) ,
108136 fragment : Some ( FragmentState {
109137 shader : COMPOSE_OUTPUT_SHADER_HANDLE ,
110- shader_defs : vec ! [ ] ,
138+ shader_defs,
111139 entry_point : None ,
112140 targets : vec ! [ Some ( ColorTargetState {
113141 format: key. target_format( ) ,
@@ -214,7 +242,7 @@ impl<'w> ComposeOutputPass<'w> {
214242 let dynamic_index = * self
215243 . compose_output_uniforms
216244 . offsets
217- . get ( & main_entity)
245+ . get ( & ( view_entity , main_entity) )
218246 . unwrap ( ) ;
219247
220248 let bind_group = render_context. render_device ( ) . create_bind_group (
0 commit comments