From 37d954fcf561ce5a8d18e81d73b1e261623bab59 Mon Sep 17 00:00:00 2001 From: Hennadii Chernyshchyk Date: Sun, 17 Apr 2022 11:48:03 +0300 Subject: [PATCH 1/2] Reduce dependencies Previously used `render` feature is a group that contains unneeded stuff, like `bevy_ui` or `bevy_text`. Specified features in this PR is the required minimum. --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 7061a73..3ec8dec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ version = "0.6.1" exclude = ["demo.gif", "demo_2.png", "demo_2.webm"] [dependencies] -bevy = { version = "0.6", default-features = false, features = [ "render" ] } +bevy = { version = "0.6", default-features = false, features = [ "bevy_core_pipeline", "bevy_render", "bevy_pbr", "bevy_sprite" ] } [features] example_deps_2d = [ From b39320fe4f1ad27f377f05f409b224891253fb23 Mon Sep 17 00:00:00 2001 From: Hennadii Chernyshchyk Date: Sun, 17 Apr 2022 13:23:39 +0300 Subject: [PATCH 2/2] Bump bevy from 0.6 to 0.7 --- Cargo.toml | 2 +- src/lib.rs | 8 +-- src/render_dim.rs | 122 +++++++++++++++++++++++++++++----------------- 3 files changed, 81 insertions(+), 51 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3ec8dec..ac0c865 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ version = "0.6.1" exclude = ["demo.gif", "demo_2.png", "demo_2.webm"] [dependencies] -bevy = { version = "0.6", default-features = false, features = [ "bevy_core_pipeline", "bevy_render", "bevy_pbr", "bevy_sprite" ] } +bevy = { version = "0.7", default-features = false, features = [ "bevy_core_pipeline", "bevy_render", "bevy_pbr", "bevy_sprite" ] } [features] example_deps_2d = [ diff --git a/src/lib.rs b/src/lib.rs index 09f49e6..08289b4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -96,7 +96,7 @@ impl DebugLinesPlugin { impl Plugin for DebugLinesPlugin { fn build(&self, app: &mut App) { - use bevy::render::{render_resource::SpecializedPipelines, RenderApp, RenderStage}; + use bevy::render::{render_resource::SpecializedMeshPipelines, RenderApp, RenderStage}; let mut shaders = app.world.get_resource_mut::>().unwrap(); shaders.set_untracked( DEBUG_LINES_SHADER_HANDLE, @@ -109,7 +109,7 @@ impl Plugin for DebugLinesPlugin { .add_render_command::() .insert_resource(DebugLinesConfig { depth_test: self.depth_test}) .init_resource::() - .init_resource::>() + .init_resource::>() .add_system_to_stage(RenderStage::Extract, extract) .add_system_to_stage(RenderStage::Queue, dim::queue); @@ -135,11 +135,11 @@ fn setup(mut cmds: Commands, mut meshes: ResMut>) { for i in 0..MESH_COUNT { // Create a new mesh with the number of vertices we need. let mut mesh = Mesh::new(PrimitiveTopology::LineList); - mesh.set_attribute( + mesh.insert_attribute( Mesh::ATTRIBUTE_POSITION, VertexAttributeValues::Float32x3(Vec::with_capacity(MAX_POINTS_PER_MESH)), ); - mesh.set_attribute( + mesh.insert_attribute( Mesh::ATTRIBUTE_COLOR, VertexAttributeValues::Float32x4(Vec::with_capacity(MAX_POINTS_PER_MESH)), ); diff --git a/src/render_dim.rs b/src/render_dim.rs index ea0d7e9..4e7dbe5 100644 --- a/src/render_dim.rs +++ b/src/render_dim.rs @@ -7,17 +7,19 @@ pub mod r3d { }, prelude::*, render::{ + mesh::MeshVertexBufferLayout, + render_asset::RenderAssets, render_phase::{DrawFunctions, RenderPhase, SetItemPipeline}, render_resource::{ - PrimitiveTopology, RenderPipelineCache, RenderPipelineDescriptor, SpecializedPipeline, - SpecializedPipelines, VertexAttribute, VertexBufferLayout, VertexFormat, - VertexStepMode, + PipelineCache, PrimitiveTopology, RenderPipelineDescriptor, + SpecializedMeshPipeline, SpecializedMeshPipelineError, SpecializedMeshPipelines, + VertexAttribute, VertexBufferLayout, VertexFormat, VertexStepMode, }, view::{ExtractedView, Msaa}, }, }; - use crate::{RenderDebugLinesMesh, DebugLinesConfig, DEBUG_LINES_SHADER_HANDLE}; + use crate::{DebugLinesConfig, RenderDebugLinesMesh, DEBUG_LINES_SHADER_HANDLE}; pub(crate) struct DebugLinePipeline { mesh_pipeline: MeshPipeline, @@ -35,10 +37,14 @@ pub mod r3d { } } - impl SpecializedPipeline for DebugLinePipeline { + impl SpecializedMeshPipeline for DebugLinePipeline { type Key = (bool, MeshPipelineKey); - fn specialize(&self, (depth_test, key): Self::Key) -> RenderPipelineDescriptor { + fn specialize( + &self, + (depth_test, key): Self::Key, + layout: &MeshVertexBufferLayout, + ) -> Result { use VertexFormat::{Float32x3, Float32x4}; let mut shader_defs = Vec::new(); @@ -47,7 +53,7 @@ pub mod r3d { shader_defs.push("DEPTH_TEST_ENABLED".to_string()); } - let mut descriptor = self.mesh_pipeline.specialize(key); + let mut descriptor = self.mesh_pipeline.specialize(key, layout)?; descriptor.vertex.shader = self.shader.clone_weak(); descriptor.vertex.shader_defs = shader_defs.clone(); descriptor.vertex.buffers[0] = VertexBufferLayout { @@ -78,17 +84,18 @@ pub mod r3d { //if self.always_in_front { //descriptor.depth_stencil.as_mut().unwrap().bias.constant = i32::MAX; //} - descriptor + Ok(descriptor) } } pub(crate) fn queue( opaque_3d_draw_functions: Res>, debug_line_pipeline: Res, - mut pipelines: ResMut>, - mut pipeline_cache: ResMut, + mut pipelines: ResMut>, + mut pipeline_cache: ResMut, + render_meshes: Res>, msaa: Res, - material_meshes: Query<(Entity, &MeshUniform), With>, + material_meshes: Query<(Entity, &MeshUniform, &Handle), With>, config: Res, mut views: Query<(&ExtractedView, &mut RenderPhase)>, ) { @@ -100,14 +107,23 @@ pub mod r3d { for (view, mut transparent_phase) in views.iter_mut() { let view_matrix = view.transform.compute_matrix(); let view_row_2 = view_matrix.row(2); - for (entity, mesh_uniform) in material_meshes.iter() { - let pipeline = pipelines.specialize(&mut pipeline_cache, &debug_line_pipeline, (config.depth_test, key)); - transparent_phase.add(Opaque3d { - entity, - pipeline, - draw_function: draw_custom, - distance: view_row_2.dot(mesh_uniform.transform.col(3)), - }); + for (entity, mesh_uniform, mesh_handle) in material_meshes.iter() { + if let Some(mesh) = render_meshes.get(mesh_handle) { + let pipeline = pipelines + .specialize( + &mut pipeline_cache, + &debug_line_pipeline, + (config.depth_test, key), + &mesh.layout, + ) + .unwrap(); + transparent_phase.add(Opaque3d { + entity, + pipeline, + draw_function: draw_custom, + distance: view_row_2.dot(mesh_uniform.transform.col(3)), + }); + } } } } @@ -127,11 +143,13 @@ pub mod r2d { core_pipeline::Transparent2d, prelude::*, render::{ + mesh::MeshVertexBufferLayout, + render_asset::RenderAssets, render_phase::{DrawFunctions, RenderPhase, SetItemPipeline}, render_resource::{ - PrimitiveTopology, RenderPipelineCache, RenderPipelineDescriptor, Shader, - SpecializedPipeline, SpecializedPipelines, VertexAttribute, VertexBufferLayout, - VertexFormat, VertexStepMode, + PipelineCache, PrimitiveTopology, RenderPipelineDescriptor, Shader, + SpecializedMeshPipeline, SpecializedMeshPipelineError, SpecializedMeshPipelines, + VertexAttribute, VertexBufferLayout, VertexFormat, VertexStepMode, }, view::{Msaa, VisibleEntities}, }, @@ -159,16 +177,20 @@ pub mod r2d { } } - impl SpecializedPipeline for DebugLinePipeline { + impl SpecializedMeshPipeline for DebugLinePipeline { type Key = Mesh2dPipelineKey; - fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor { + fn specialize( + &self, + key: Self::Key, + layout: &MeshVertexBufferLayout, + ) -> Result { use VertexFormat::{Float32x3, Float32x4}; //let mut shader_defs = Vec::new(); //shader_defs.push("2D".to_string()); - let mut descriptor = self.mesh_pipeline.specialize(key); + let mut descriptor = self.mesh_pipeline.specialize(key, layout)?; descriptor.vertex.shader = self.shader.clone_weak(); //descriptor.vertex.shader_defs = shader_defs.clone(); descriptor.vertex.buffers[0] = VertexBufferLayout { @@ -196,39 +218,48 @@ pub mod r2d { //fragment.shader_defs = shader_defs.clone(); descriptor.primitive.topology = PrimitiveTopology::LineList; descriptor.primitive.cull_mode = None; - descriptor + Ok(descriptor) } } pub(crate) fn queue( draw2d_functions: Res>, debug_line_pipeline: Res, - mut pipeline_cache: ResMut, - mut specialized_pipelines: ResMut>, + mut pipeline_cache: ResMut, + mut specialized_pipelines: ResMut>, + render_meshes: Res>, msaa: Res, - material_meshes: Query<&Mesh2dUniform, With>, + material_meshes: Query<(&Mesh2dUniform, &Handle), With>, mut views: Query<(&VisibleEntities, &mut RenderPhase)>, ) { for (view, mut phase) in views.iter_mut() { let draw_mesh2d = draw2d_functions.read().get_id::().unwrap(); - let mesh_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples); + let msaa_key = Mesh2dPipelineKey::from_msaa_samples(msaa.samples); for visible_entity in &view.entities { - if let Ok(uniform) = material_meshes.get(*visible_entity) { - let mesh2d_key = mesh_key - | Mesh2dPipelineKey::from_primitive_topology(PrimitiveTopology::LineList); - let mesh_z = uniform.transform.w_axis.z; - phase.add(Transparent2d { - entity: *visible_entity, - draw_function: draw_mesh2d, - pipeline: specialized_pipelines.specialize( - &mut pipeline_cache, - &debug_line_pipeline, - mesh2d_key, - ), - sort_key: FloatOrd(mesh_z), - batch_range: None, - }); + if let Ok((uniform, mesh_handle)) = material_meshes.get(*visible_entity) { + if let Some(mesh) = render_meshes.get(mesh_handle) { + let mesh_key = msaa_key + | Mesh2dPipelineKey::from_primitive_topology( + PrimitiveTopology::LineList, + ); + let mesh_z = uniform.transform.w_axis.z; + let pipeline = specialized_pipelines + .specialize( + &mut pipeline_cache, + &debug_line_pipeline, + mesh_key, + &mesh.layout, + ) + .unwrap(); + phase.add(Transparent2d { + entity: *visible_entity, + draw_function: draw_mesh2d, + pipeline, + sort_key: FloatOrd(mesh_z), + batch_range: None, + }); + } } } } @@ -241,4 +272,3 @@ pub mod r2d { DrawMesh2d, ); } -