From 45d4f25a931d10803537e0b065e00e0b1edb1bb1 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Sun, 29 Mar 2020 00:53:47 -0700 Subject: [PATCH] WinitPlugin --- Cargo.toml | 27 ++++++++++----- src/app/app_builder.rs | 31 ++++++----------- src/core/mod.rs | 8 ++--- src/core/window/winit/mod.rs | 33 ++++++++++++++----- src/render/render_plugin.rs | 3 +- .../batching/asset_batcher2.rs | 2 ++ .../renderer/renderers/wgpu_renderer/mod.rs | 15 +++++++++ 7 files changed, 76 insertions(+), 43 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b00a8bda4c..33823746c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,27 +8,36 @@ edition = "2018" default = ["wgpu", "winit"] [dependencies] -legion = { path = "bevy_legion", features = ["serialize"] } +# bevy +bevy_derive = { path = "bevy_derive" } +bevy_transform = { path = "bevy_transform" } + +# rendering wgpu = { git = "https://github.com/gfx-rs/wgpu-rs.git", rev = "a7b0d5ae5bc0934439ef559ed145e93f0117c39a", optional = true } +winit = { version = "0.22.0", optional = true } +spirv-reflect = "0.2.3" +shaderc = "0.6" +png = "0.16.0" +gltf = "0.14.0" + +# ecs +legion = { path = "bevy_legion", features = ["serialize"] } + +# logging +log = { version = "0.4", features = ["release_max_level_info"] } + +# misc bitflags = "1.0" glam = "0.8.6" -winit = { version = "0.22.0", optional = true } zerocopy = "0.3" -log = { version = "0.4", features = ["release_max_level_info"] } env_logger = "0.7" rand = "0.7.2" -gltf = "0.14.0" serde = { version = "1", features = ["derive"]} serde_json = "1.0" uuid = { version = "0.8", features = ["v4", "serde"] } erased-serde = "0.3" type-uuid = "0.1" -shaderc = "0.6" libloading = "0.5.2" -png = "0.16.0" -spirv-reflect = "0.2.3" -bevy_derive = { path = "bevy_derive" } -bevy_transform = { path = "bevy_transform" } # TODO: replace once_cell with std equivalent if/when this lands: https://github.com/rust-lang/rfcs/pull/2788 once_cell = "1.3.1" diff --git a/src/app/app_builder.rs b/src/app/app_builder.rs index be44ff27cb..2eb1c2c0c5 100644 --- a/src/app/app_builder.rs +++ b/src/app/app_builder.rs @@ -1,6 +1,6 @@ use crate::{ app::{system_stage, App}, - core::{window::winit::get_winit_run, CorePlugin}, + core::{winit::WinitPlugin, CorePlugin}, legion::prelude::{Resources, Runnable, Schedulable, Schedule, Universe, World}, plugin::{load_plugin, AppPlugin}, render::{renderer::Renderer, *}, @@ -155,31 +155,20 @@ impl AppBuilder { self } - #[cfg(not(feature = "wgpu"))] - fn add_wgpu_renderer(mut self) -> Self { - self - } - - #[cfg(feature = "winit")] - pub fn add_winit(mut self) -> Self { - self.run = Some(get_winit_run()); - self - } - - #[cfg(not(feature = "winit"))] - pub fn add_winit(mut self) -> Self { - self - } - pub fn add_defaults(mut self) -> Self { self = self - .add_winit() .add_default_systems() .add_plugin(CorePlugin::default()) - .add_plugin(RenderPlugin::default()) - .add_wgpu_renderer(); + .add_plugin(RenderPlugin::default()); + + #[cfg(feature = "wgpu")] + { + self = self.add_wgpu_renderer(); + } #[cfg(feature = "winit")] - {} + { + self = self.add_plugin(WinitPlugin::default()) + } self } diff --git a/src/core/mod.rs b/src/core/mod.rs index 31512687dc..49e220683a 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,9 +1,9 @@ pub mod bytes; -pub mod time; +mod time; pub mod window; mod core_plugin; -pub use bytes::GetBytes; -pub use time::Time; -pub use window::Window; +pub use bytes::*; +pub use time::*; +pub use window::*; pub use core_plugin::*; diff --git a/src/core/window/winit/mod.rs b/src/core/window/winit/mod.rs index e9d4b5137c..738466a119 100644 --- a/src/core/window/winit/mod.rs +++ b/src/core/window/winit/mod.rs @@ -1,13 +1,33 @@ -use crate::app::App; +use crate::{ + app::{App, AppBuilder}, + plugin::AppPlugin, +}; +use super::Window; use winit::{ event, event::WindowEvent, event_loop::{ControlFlow, EventLoop}, }; -use super::Window; -pub fn get_winit_run() -> Box { +#[derive(Default)] +pub struct WinitPlugin; + +impl AppPlugin for WinitPlugin { + fn build(&self, mut app: AppBuilder) -> AppBuilder { + { + app.run = Some(get_winit_run()); + } + + app + } + + fn name(&self) -> &'static str { + "Winit" + } +} + +pub fn get_winit_run() -> Box { Box::new(|mut app: App| { env_logger::init(); let event_loop = EventLoop::new(); @@ -40,10 +60,7 @@ pub fn get_winit_run() -> Box { window.height = size.height; } - renderer.resize( - &mut app.world, - &mut app.resources, - ); + renderer.resize(&mut app.world, &mut app.resources); } } event::Event::WindowEvent { event, .. } => match event { @@ -68,4 +85,4 @@ pub fn get_winit_run() -> Box { } }); }) -} \ No newline at end of file +} diff --git a/src/render/render_plugin.rs b/src/render/render_plugin.rs index 9f2831224d..34ae695957 100644 --- a/src/render/render_plugin.rs +++ b/src/render/render_plugin.rs @@ -11,7 +11,7 @@ use super::{ MeshResourceProvider, UiResourceProvider, }, AssetBatchers, EntityRenderResourceAssignments, RenderResourceAssignments, - }, + }, RenderContext, }; use crate::{ app::AppBuilder, @@ -57,6 +57,7 @@ impl AppPlugin for RenderPlugin { let mut asset_batchers = AssetBatchers::default(); asset_batchers.batch_types2::(); app = app + .add_resource(RenderContext::default()) .add_resource(RenderGraph::default()) .add_resource(AssetStorage::::new()) .add_resource(AssetStorage::::new()) diff --git a/src/render/render_resource/batching/asset_batcher2.rs b/src/render/render_resource/batching/asset_batcher2.rs index 5bd45fec26..663e129dc4 100644 --- a/src/render/render_resource/batching/asset_batcher2.rs +++ b/src/render/render_resource/batching/asset_batcher2.rs @@ -5,6 +5,8 @@ use std::{any::TypeId, collections::HashMap, hash::Hash}; // TODO: if/when const generics land, revisit this design in favor of generic array lengths +// TODO: add sorting by primary / secondary handle to reduce rebinds of data + #[derive(Hash, Eq, PartialEq, Debug, Ord, PartialOrd)] pub struct BatchKey2 { pub handle1: HandleId, diff --git a/src/render/renderer/renderers/wgpu_renderer/mod.rs b/src/render/renderer/renderers/wgpu_renderer/mod.rs index a4ed42cd63..14ee08cd03 100644 --- a/src/render/renderer/renderers/wgpu_renderer/mod.rs +++ b/src/render/renderer/renderers/wgpu_renderer/mod.rs @@ -6,3 +6,18 @@ mod wgpu_type_converter; pub use wgpu_render_pass::*; pub use wgpu_renderer::*; pub use wgpu_resources::*; + +use crate::{app::AppBuilder, plugin::AppPlugin}; + +pub struct WgpuRendererPlugin; + +impl AppPlugin for WgpuRendererPlugin { + fn build(&self, app: AppBuilder) -> AppBuilder { + // let render_context = app.resources.get_mut::().unwrap(); + // render_context.renderer = Some(Box::new(WgpuRenderer::new())); + app + } + fn name(&self) -> &'static str { + "WgpuRenderer" + } +}