WinitPlugin

This commit is contained in:
Carter Anderson 2020-03-29 00:53:47 -07:00
parent ec84a33b43
commit 45d4f25a93
7 changed files with 76 additions and 43 deletions

View File

@ -8,27 +8,36 @@ edition = "2018"
default = ["wgpu", "winit"] default = ["wgpu", "winit"]
[dependencies] [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 } 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" bitflags = "1.0"
glam = "0.8.6" glam = "0.8.6"
winit = { version = "0.22.0", optional = true }
zerocopy = "0.3" zerocopy = "0.3"
log = { version = "0.4", features = ["release_max_level_info"] }
env_logger = "0.7" env_logger = "0.7"
rand = "0.7.2" rand = "0.7.2"
gltf = "0.14.0"
serde = { version = "1", features = ["derive"]} serde = { version = "1", features = ["derive"]}
serde_json = "1.0" serde_json = "1.0"
uuid = { version = "0.8", features = ["v4", "serde"] } uuid = { version = "0.8", features = ["v4", "serde"] }
erased-serde = "0.3" erased-serde = "0.3"
type-uuid = "0.1" type-uuid = "0.1"
shaderc = "0.6"
libloading = "0.5.2" 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 # TODO: replace once_cell with std equivalent if/when this lands: https://github.com/rust-lang/rfcs/pull/2788
once_cell = "1.3.1" once_cell = "1.3.1"

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
app::{system_stage, App}, app::{system_stage, App},
core::{window::winit::get_winit_run, CorePlugin}, core::{winit::WinitPlugin, CorePlugin},
legion::prelude::{Resources, Runnable, Schedulable, Schedule, Universe, World}, legion::prelude::{Resources, Runnable, Schedulable, Schedule, Universe, World},
plugin::{load_plugin, AppPlugin}, plugin::{load_plugin, AppPlugin},
render::{renderer::Renderer, *}, render::{renderer::Renderer, *},
@ -155,31 +155,20 @@ impl AppBuilder {
self 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 { pub fn add_defaults(mut self) -> Self {
self = self self = self
.add_winit()
.add_default_systems() .add_default_systems()
.add_plugin(CorePlugin::default()) .add_plugin(CorePlugin::default())
.add_plugin(RenderPlugin::default()) .add_plugin(RenderPlugin::default());
.add_wgpu_renderer();
#[cfg(feature = "wgpu")]
{
self = self.add_wgpu_renderer();
}
#[cfg(feature = "winit")] #[cfg(feature = "winit")]
{} {
self = self.add_plugin(WinitPlugin::default())
}
self self
} }

View File

@ -1,9 +1,9 @@
pub mod bytes; pub mod bytes;
pub mod time; mod time;
pub mod window; pub mod window;
mod core_plugin; mod core_plugin;
pub use bytes::GetBytes; pub use bytes::*;
pub use time::Time; pub use time::*;
pub use window::Window; pub use window::*;
pub use core_plugin::*; pub use core_plugin::*;

View File

@ -1,13 +1,33 @@
use crate::app::App; use crate::{
app::{App, AppBuilder},
plugin::AppPlugin,
};
use super::Window;
use winit::{ use winit::{
event, event,
event::WindowEvent, event::WindowEvent,
event_loop::{ControlFlow, EventLoop}, event_loop::{ControlFlow, EventLoop},
}; };
use super::Window;
pub fn get_winit_run() -> Box<dyn Fn(App)> { #[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<dyn Fn(App) + Send + Sync> {
Box::new(|mut app: App| { Box::new(|mut app: App| {
env_logger::init(); env_logger::init();
let event_loop = EventLoop::new(); let event_loop = EventLoop::new();
@ -40,10 +60,7 @@ pub fn get_winit_run() -> Box<dyn Fn(App)> {
window.height = size.height; window.height = size.height;
} }
renderer.resize( renderer.resize(&mut app.world, &mut app.resources);
&mut app.world,
&mut app.resources,
);
} }
} }
event::Event::WindowEvent { event, .. } => match event { event::Event::WindowEvent { event, .. } => match event {

View File

@ -11,7 +11,7 @@ use super::{
MeshResourceProvider, UiResourceProvider, MeshResourceProvider, UiResourceProvider,
}, },
AssetBatchers, EntityRenderResourceAssignments, RenderResourceAssignments, AssetBatchers, EntityRenderResourceAssignments, RenderResourceAssignments,
}, }, RenderContext,
}; };
use crate::{ use crate::{
app::AppBuilder, app::AppBuilder,
@ -57,6 +57,7 @@ impl AppPlugin for RenderPlugin {
let mut asset_batchers = AssetBatchers::default(); let mut asset_batchers = AssetBatchers::default();
asset_batchers.batch_types2::<Mesh, StandardMaterial>(); asset_batchers.batch_types2::<Mesh, StandardMaterial>();
app = app app = app
.add_resource(RenderContext::default())
.add_resource(RenderGraph::default()) .add_resource(RenderGraph::default())
.add_resource(AssetStorage::<Mesh>::new()) .add_resource(AssetStorage::<Mesh>::new())
.add_resource(AssetStorage::<Texture>::new()) .add_resource(AssetStorage::<Texture>::new())

View File

@ -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: 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)] #[derive(Hash, Eq, PartialEq, Debug, Ord, PartialOrd)]
pub struct BatchKey2 { pub struct BatchKey2 {
pub handle1: HandleId, pub handle1: HandleId,

View File

@ -6,3 +6,18 @@ mod wgpu_type_converter;
pub use wgpu_render_pass::*; pub use wgpu_render_pass::*;
pub use wgpu_renderer::*; pub use wgpu_renderer::*;
pub use wgpu_resources::*; 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::<RenderContext>().unwrap();
// render_context.renderer = Some(Box::new(WgpuRenderer::new()));
app
}
fn name(&self) -> &'static str {
"WgpuRenderer"
}
}