@@ -2,17 +2,7 @@ pub mod r3d {
2
2
use bevy:: { core_pipeline:: Opaque3d , pbr:: {
3
3
DrawMesh , MeshPipeline , MeshPipelineKey , MeshUniform , SetMeshBindGroup ,
4
4
SetMeshViewBindGroup ,
5
- } , prelude:: * , render:: {
6
- mesh:: MeshVertexBufferLayout ,
7
- render_asset:: RenderAssets ,
8
- render_phase:: { DrawFunctions , RenderPhase , SetItemPipeline } ,
9
- render_resource:: {
10
- PipelineCache , PrimitiveTopology , RenderPipelineDescriptor ,
11
- SpecializedMeshPipeline , SpecializedMeshPipelineError , SpecializedMeshPipelines ,
12
- VertexAttribute , VertexBufferLayout , VertexFormat , VertexStepMode ,
13
- } ,
14
- view:: { ExtractedView , Msaa } ,
15
- } , utils:: Hashed } ;
5
+ } , prelude:: * , render:: { mesh:: MeshVertexBufferLayout , render_asset:: RenderAssets , render_phase:: { DrawFunctions , RenderPhase , SetItemPipeline } , render_resource:: { BlendState , ColorTargetState , ColorWrites , CompareFunction , DepthBiasState , DepthStencilState , FragmentState , FrontFace , MultisampleState , PipelineCache , PolygonMode , PrimitiveState , PrimitiveTopology , RenderPipelineDescriptor , SpecializedMeshPipeline , SpecializedMeshPipelineError , SpecializedMeshPipelines , StencilFaceState , StencilState , TextureFormat , VertexAttribute , VertexBufferLayout , VertexFormat , VertexState , VertexStepMode } , texture:: BevyDefault , view:: { ExtractedView , Msaa } } , utils:: Hashed } ;
16
6
17
7
use crate :: { DebugLinesConfig , RenderDebugLinesMesh , DEBUG_LINES_SHADER_HANDLE } ;
18
8
@@ -48,23 +38,76 @@ pub mod r3d {
48
38
shader_defs. push ( "DEPTH_TEST_ENABLED" . to_string ( ) ) ;
49
39
}
50
40
51
- let mut descriptor = self . mesh_pipeline . specialize ( key, & layout) ?;
52
- descriptor. vertex . shader = self . shader . clone_weak ( ) ;
53
- descriptor. vertex . shader_defs = shader_defs. clone ( ) ;
54
- let formats = vec ! [
55
- VertexFormat :: Uint32 ,
56
- VertexFormat :: Float32x3 ,
57
- ] ;
58
- descriptor. vertex . buffers [ 0 ] = VertexBufferLayout :: from_vertex_formats ( VertexStepMode :: Vertex , formats) ;
59
- let fragment = descriptor. fragment . as_mut ( ) . unwrap ( ) ;
60
- fragment. shader = self . shader . clone_weak ( ) ;
61
- fragment. shader_defs = shader_defs. clone ( ) ;
62
- descriptor. primitive . topology = PrimitiveTopology :: LineList ;
63
- descriptor. primitive . cull_mode = None ;
64
- //if self.always_in_front {
65
- //descriptor.depth_stencil.as_mut().unwrap().bias.constant = i32::MAX;
66
- //}
67
- Ok ( descriptor)
41
+ let vertex_buffer_layout = layout. get_layout ( & [
42
+ Mesh :: ATTRIBUTE_POSITION . at_shader_location ( 0 ) ,
43
+ Mesh :: ATTRIBUTE_COLOR . at_shader_location ( 1 ) ,
44
+ ] ) ?;
45
+ let ( label, blend, depth_write_enabled) ;
46
+ if key. contains ( MeshPipelineKey :: TRANSPARENT_MAIN_PASS ) {
47
+ label = "transparent_mesh_pipeline" . into ( ) ;
48
+ blend = Some ( BlendState :: ALPHA_BLENDING ) ;
49
+ // For the transparent pass, fragments that are closer will be alpha
50
+ // blended but their depth is not written to the depth buffer.
51
+ depth_write_enabled = false ;
52
+ } else {
53
+ label = "opaque_mesh_pipeline" . into ( ) ;
54
+ blend = Some ( BlendState :: REPLACE ) ;
55
+ // For the opaque and alpha mask passes, fragments that are closer
56
+ // will replace the current fragment value in the output and the depth is
57
+ // written to the depth buffer.
58
+ depth_write_enabled = true ;
59
+ }
60
+
61
+ Ok ( RenderPipelineDescriptor {
62
+ vertex : VertexState {
63
+ shader : self . shader . clone_weak ( ) ,
64
+ entry_point : "vertex" . into ( ) ,
65
+ shader_defs : shader_defs. clone ( ) ,
66
+ buffers : vec ! [ vertex_buffer_layout] ,
67
+ } ,
68
+ fragment : Some ( FragmentState {
69
+ shader : self . shader . clone_weak ( ) ,
70
+ shader_defs,
71
+ entry_point : "fragment" . into ( ) ,
72
+ targets : vec ! [ ColorTargetState {
73
+ format: TextureFormat :: bevy_default( ) ,
74
+ blend,
75
+ write_mask: ColorWrites :: ALL ,
76
+ } ] ,
77
+ } ) ,
78
+ layout : Some ( vec ! [ self . mesh_pipeline. view_layout. clone( ) ] ) ,
79
+ primitive : PrimitiveState {
80
+ front_face : FrontFace :: Ccw ,
81
+ cull_mode : None ,
82
+ unclipped_depth : false ,
83
+ polygon_mode : PolygonMode :: Fill ,
84
+ conservative : false ,
85
+ topology : PrimitiveTopology :: LineList ,
86
+ strip_index_format : None ,
87
+ } ,
88
+ depth_stencil : Some ( DepthStencilState {
89
+ format : TextureFormat :: Depth32Float ,
90
+ depth_write_enabled,
91
+ depth_compare : CompareFunction :: Greater ,
92
+ stencil : StencilState {
93
+ front : StencilFaceState :: IGNORE ,
94
+ back : StencilFaceState :: IGNORE ,
95
+ read_mask : 0 ,
96
+ write_mask : 0 ,
97
+ } ,
98
+ bias : DepthBiasState {
99
+ constant : 0 ,
100
+ slope_scale : 0.0 ,
101
+ clamp : 0.0 ,
102
+ } ,
103
+ } ) ,
104
+ multisample : MultisampleState {
105
+ count : key. msaa_samples ( ) ,
106
+ mask : !0 ,
107
+ alpha_to_coverage_enabled : false ,
108
+ } ,
109
+ label : Some ( label) ,
110
+ } )
68
111
}
69
112
}
70
113
@@ -79,7 +122,6 @@ pub mod r3d {
79
122
config : Res < DebugLinesConfig > ,
80
123
mut views : Query < ( & ExtractedView , & mut RenderPhase < Opaque3d > ) > ,
81
124
) {
82
- dbg ! ( "start queue" ) ;
83
125
let draw_custom = opaque_3d_draw_functions
84
126
. read ( )
85
127
. get_id :: < DrawDebugLines > ( )
@@ -107,7 +149,6 @@ pub mod r3d {
107
149
}
108
150
}
109
151
}
110
- dbg ! ( "end queue" ) ;
111
152
}
112
153
113
154
pub ( crate ) type DrawDebugLines = (
@@ -119,17 +160,7 @@ pub mod r3d {
119
160
}
120
161
121
162
pub mod r2d {
122
- use bevy:: { asset:: Handle , core:: FloatOrd , core_pipeline:: Transparent2d , prelude:: * , render:: {
123
- mesh:: MeshVertexBufferLayout ,
124
- render_asset:: RenderAssets ,
125
- render_phase:: { DrawFunctions , RenderPhase , SetItemPipeline } ,
126
- render_resource:: {
127
- PipelineCache , PrimitiveTopology , RenderPipelineDescriptor , Shader ,
128
- SpecializedMeshPipeline , SpecializedMeshPipelineError , SpecializedMeshPipelines ,
129
- VertexAttribute , VertexBufferLayout , VertexFormat , VertexStepMode ,
130
- } ,
131
- view:: { Msaa , VisibleEntities } ,
132
- } , sprite:: { DrawMesh2d , Mesh2dHandle , Mesh2dPipeline , Mesh2dPipelineKey , Mesh2dUniform , SetMesh2dBindGroup , SetMesh2dViewBindGroup } } ;
163
+ use bevy:: { asset:: Handle , core:: FloatOrd , core_pipeline:: Transparent2d , prelude:: * , render:: { mesh:: MeshVertexBufferLayout , render_asset:: RenderAssets , render_phase:: { DrawFunctions , RenderPhase , SetItemPipeline } , render_resource:: { BlendState , ColorTargetState , ColorWrites , CompareFunction , DepthBiasState , DepthStencilState , FragmentState , FrontFace , MultisampleState , PipelineCache , PolygonMode , PrimitiveState , PrimitiveTopology , RenderPipelineDescriptor , Shader , SpecializedMeshPipeline , SpecializedMeshPipelineError , SpecializedMeshPipelines , StencilFaceState , StencilState , TextureFormat , VertexAttribute , VertexBufferLayout , VertexFormat , VertexState , VertexStepMode } , texture:: BevyDefault , view:: { Msaa , VisibleEntities } } , sprite:: { DrawMesh2d , Mesh2dHandle , Mesh2dPipeline , Mesh2dPipelineKey , Mesh2dUniform , SetMesh2dBindGroup , SetMesh2dViewBindGroup } } ;
133
164
134
165
use crate :: { RenderDebugLinesMesh , DEBUG_LINES_SHADER_HANDLE } ;
135
166
@@ -157,47 +188,55 @@ pub mod r2d {
157
188
key : Self :: Key ,
158
189
layout : & MeshVertexBufferLayout ,
159
190
) -> Result < RenderPipelineDescriptor , SpecializedMeshPipelineError > {
160
- //use VertexFormat::{Float32x3, Float32x4};
161
191
162
- //let mut shader_defs = Vec::new();
163
- //shader_defs.push("2D".to_string());
164
-
165
- let mut descriptor = self . mesh_pipeline . specialize ( key, layout) ?;
166
- descriptor. vertex . shader = self . shader . clone_weak ( ) ;
167
- let formats = vec ! [
168
- VertexFormat :: Float32x3 ,
169
- VertexFormat :: Uint32 ,
170
- ] ;
171
- descriptor. vertex . buffers [ 0 ] = VertexBufferLayout :: from_vertex_formats ( VertexStepMode :: Vertex , formats) ;
172
- //descriptor.vertex.shader_defs = shader_defs.clone();
173
192
/*
174
- descriptor.vertex.buffers[0] = VertexBufferLayout {
175
- // NOTE: I've no idea why, but `color` is at offset zero and
176
- // `position` at 4*4. Swapping breaks everything
177
- array_stride: 4 * 4 + 4 * 3, // sizeof(Float32x4) + sizeof(Float32x3)
178
- step_mode: VertexStepMode::Vertex,
179
- attributes: vec![
180
- VertexAttribute {
181
- // Vertex.color
182
- format: Float32x4,
183
- offset: 0,
184
- shader_location: 0,
185
- },
186
- VertexAttribute {
187
- // Vertex.place (position)
188
- format: Float32x3,
189
- offset: 4 * 4, // sizeof(Float32x4)
190
- shader_location: 1,
191
- },
192
- ],
193
- };
193
+ let mut shader_defs = Vec::new();
194
+ shader_defs.push("LINES_3D".to_string());
195
+ if depth_test {
196
+ shader_defs.push("DEPTH_TEST_ENABLED".to_string());
197
+ }
194
198
*/
195
- let fragment = descriptor. fragment . as_mut ( ) . unwrap ( ) ;
196
- fragment. shader = self . shader . clone_weak ( ) ;
197
- //fragment.shader_defs = shader_defs.clone();
198
- descriptor. primitive . topology = PrimitiveTopology :: LineList ;
199
- descriptor. primitive . cull_mode = None ;
200
- Ok ( descriptor)
199
+
200
+ let vertex_buffer_layout = layout. get_layout ( & [
201
+ Mesh :: ATTRIBUTE_POSITION . at_shader_location ( 0 ) ,
202
+ Mesh :: ATTRIBUTE_COLOR . at_shader_location ( 1 ) ,
203
+ ] ) ?;
204
+
205
+ Ok ( RenderPipelineDescriptor {
206
+ vertex : VertexState {
207
+ shader : self . shader . clone_weak ( ) ,
208
+ entry_point : "vertex" . into ( ) ,
209
+ shader_defs : vec ! [ ] ,
210
+ buffers : vec ! [ vertex_buffer_layout] ,
211
+ } ,
212
+ fragment : Some ( FragmentState {
213
+ shader : self . shader . clone_weak ( ) ,
214
+ shader_defs : vec ! [ ] ,
215
+ entry_point : "fragment" . into ( ) ,
216
+ targets : vec ! [ ColorTargetState {
217
+ format: TextureFormat :: bevy_default( ) ,
218
+ blend: Some ( BlendState :: ALPHA_BLENDING ) ,
219
+ write_mask: ColorWrites :: ALL ,
220
+ } ] ,
221
+ } ) ,
222
+ layout : Some ( vec ! [ self . mesh_pipeline. view_layout. clone( ) ] ) ,
223
+ primitive : PrimitiveState {
224
+ front_face : FrontFace :: Ccw ,
225
+ cull_mode : None ,
226
+ unclipped_depth : false ,
227
+ polygon_mode : PolygonMode :: Fill ,
228
+ conservative : false ,
229
+ topology : PrimitiveTopology :: LineList ,
230
+ strip_index_format : None ,
231
+ } ,
232
+ depth_stencil : None ,
233
+ multisample : MultisampleState {
234
+ count : key. msaa_samples ( ) ,
235
+ mask : !0 ,
236
+ alpha_to_coverage_enabled : false ,
237
+ } ,
238
+ label : None ,
239
+ } )
201
240
}
202
241
}
203
242
0 commit comments