diff options
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | README.md | 19 | ||||
-rw-r--r-- | examples/render-bsp/Cargo.toml | 14 | ||||
-rw-r--r-- | examples/render-bsp/data/test.bsp | bin | 0 -> 6708 bytes | |||
-rw-r--r-- | examples/render-bsp/src/main.rs | 71 | ||||
-rw-r--r-- | examples/render-quad/Cargo.toml | 2 | ||||
-rw-r--r-- | stockton-render/Cargo.toml | 1 | ||||
-rw-r--r-- | stockton-render/src/lib.rs | 18 | ||||
-rw-r--r-- | stockton-render/src/walk_bsp.rs | 26 | ||||
-rw-r--r-- | stockton-types/src/world.rs | 32 |
10 files changed, 151 insertions, 35 deletions
@@ -2,5 +2,6 @@ members = [ "stockton-types", "stockton-render", - "examples/render-quad" + "examples/render-quad", + "examples/render-bsp" ]
\ No newline at end of file @@ -4,6 +4,25 @@ A 3D engine. +## TODOs + +Render Optimisations: + - Make StagedBuffers resizable + - Share the same Memory across multiple Buffers + - Use the same descriptorpool for all descriptorsets + - Handle textures spread across multiple descriptorsets/draw calls + - Instanced drawing + - Model translation matrices + - Use a different command pool for memcpy operations + - Sync memcpy operations with semaphores + - Add timing/profiling + - Fix shadermodules not being destroyed on shutdown + - Handle window resize properly + +Features: + - Moving Camera/Positionable Trait + - Entity drawing + ## License Code & Assets (including from `rust-bsp`) are licensed under the GNU GPL v3.0, all contributions automatically come under this. See LICENSE. diff --git a/examples/render-bsp/Cargo.toml b/examples/render-bsp/Cargo.toml new file mode 100644 index 0000000..f0458a6 --- /dev/null +++ b/examples/render-bsp/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "render-bsp" +version = "0.1.0" +authors = ["Oscar <oscar.shrimpton.personal@gmail.com>"] + +[dependencies] +stockton-render = { path = "../../stockton-render", features = ["vulkan"] } +stockton-types = { path = "../../stockton-types" } +stockton-bsp = "2.0.0" +winit = "^0.21" +log = "0.4.0" +simple_logger = "1.0" +rand = "0.7" +image = "0.23.2" diff --git a/examples/render-bsp/data/test.bsp b/examples/render-bsp/data/test.bsp Binary files differnew file mode 100644 index 0000000..484f5b1 --- /dev/null +++ b/examples/render-bsp/data/test.bsp diff --git a/examples/render-bsp/src/main.rs b/examples/render-bsp/src/main.rs new file mode 100644 index 0000000..8116bd5 --- /dev/null +++ b/examples/render-bsp/src/main.rs @@ -0,0 +1,71 @@ +// Copyright (C) Oscar Shrimpton 2019 + +// This program is free software: you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. + +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. + +// You should have received a copy of the GNU General Public License along +// with this program. If not, see <http://www.gnu.org/licenses/>. + +//! Renders ./example.bsp + +extern crate stockton_types; +extern crate stockton_bsp; +extern crate stockton_render; +extern crate winit; +extern crate simple_logger; + +use std::fs::File; +use std::io::Read; + +use stockton_bsp::BSPFile; +use stockton_types::World; +use stockton_render::Renderer; + +use winit::{ + event::{Event, WindowEvent}, + event_loop::{ControlFlow, EventLoop}, + window::WindowBuilder +}; + +fn main() { + simple_logger::init().unwrap(); + + // Load the world and renderer + let event_loop = EventLoop::new(); + let window = WindowBuilder::new().build(&event_loop).unwrap(); + let data = include_bytes!("../data/test.bsp"); + let bsp = BSPFile::from_buffer(data).unwrap(); + println!("{:?}", bsp); + let world = World::new(bsp).unwrap(); + let mut renderer = Renderer::new(world, &window).unwrap(); + + // Keep rendering the world + event_loop.run(move |event, _, flow| { + *flow = ControlFlow::Poll; + + match event { + // TODO: Handle resize + Event::WindowEvent { + event: WindowEvent::CloseRequested, + .. + } => { + *flow = ControlFlow::Exit + }, + + Event::MainEventsCleared => { + window.request_redraw() + }, + Event::RedrawRequested(_) => { + renderer.render_frame().unwrap() + } + _ => () + } + }); +} diff --git a/examples/render-quad/Cargo.toml b/examples/render-quad/Cargo.toml index 7e9bc61..65e9b94 100644 --- a/examples/render-quad/Cargo.toml +++ b/examples/render-quad/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "render-triangles" +name = "render-quad" version = "0.1.0" authors = ["Oscar <oscar.shrimpton.personal@gmail.com>"] diff --git a/stockton-render/Cargo.toml b/stockton-render/Cargo.toml index e6e529c..2d9b3b7 100644 --- a/stockton-render/Cargo.toml +++ b/stockton-render/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" authors = ["Oscar <oscar.shrimpton.personal@gmail.com>"] [dependencies] +stockton-bsp = "2.0.0" stockton-types = { path = "../stockton-types" } winit = "^0.21" gfx-hal = "^0.5" diff --git a/stockton-render/src/lib.rs b/stockton-render/src/lib.rs index 43c5d6a..2255c49 100644 --- a/stockton-render/src/lib.rs +++ b/stockton-render/src/lib.rs @@ -17,20 +17,23 @@ extern crate core; #[cfg(feature = "vulkan")] extern crate gfx_backend_vulkan as back; - -extern crate image; -extern crate log; extern crate gfx_hal as hal; -extern crate stockton_types; extern crate shaderc; extern crate winit; + extern crate nalgebra_glm as na; +extern crate image; +extern crate log; + +extern crate stockton_types; +extern crate stockton_bsp; extern crate arrayvec; pub mod draw; mod error; mod types; +mod walk_bsp; use std::sync::{Arc, RwLock}; @@ -41,7 +44,7 @@ use draw::RenderingContext; /// Renders a world to a window when you tell it to. pub struct Renderer<'a> { - _world: Arc<RwLock<World<'a>>>, + world: Arc<RwLock<World<'a>>>, pub context: RenderingContext<'a> } @@ -49,11 +52,12 @@ pub struct Renderer<'a> { impl<'a> Renderer<'a> { /// Create a new Renderer. /// This initialises all the vulkan context, etc needed. - pub fn new(world: Arc<RwLock<World<'a>>>, window: &winit::window::Window) -> Result<Self, CreationError> { + pub fn new(world: World<'a>, window: &winit::window::Window) -> Result<Self, CreationError> { + let world = Arc::new(RwLock::new(world)); let context = RenderingContext::new(window)?; Ok(Renderer { - _world: world, context + world: world, context }) } diff --git a/stockton-render/src/walk_bsp.rs b/stockton-render/src/walk_bsp.rs new file mode 100644 index 0000000..3701da0 --- /dev/null +++ b/stockton-render/src/walk_bsp.rs @@ -0,0 +1,26 @@ +// Copyright (C) 2019 Oscar Shrimpton + +// This program is free software: you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. + +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. + +// You should have received a copy of the GNU General Public License along +// with this program. If not, see <http://www.gnu.org/licenses/>. + +//! Walks a compiled BSP tree and renders it + +use crate::draw::RenderingContext; +use stockton_bsp::BSPFile; +use std::pin::Pin; +use std::boxed::Box; + +fn walk_tree<'a>(ctx: &RenderingContext<'a>, file: &Pin<Box<BSPFile>>) -> (){ + // TODO + +}
\ No newline at end of file diff --git a/stockton-types/src/world.rs b/stockton-types/src/world.rs index e244aa7..e538d68 100644 --- a/stockton-types/src/world.rs +++ b/stockton-types/src/world.rs @@ -15,40 +15,20 @@ //! The thing you play on and all the associated state. -use crate::{EntityStore, Entity}; -use stockton_bsp::lumps::entities::Entity as BSPEntity; -use stockton_bsp::BSPFile; - use std::pin::Pin; -/// A live and playable world. There are two parts: The map, which has walls and other static objects, -/// and entities, which can move around and do things and are physics simulated. +use stockton_bsp::BSPFile; + +/// A loaded world. pub struct World<'a> { - pub map: Pin<Box<BSPFile<'a>>>, - pub live_entities: EntityStore, + pub map: Pin<Box<BSPFile<'a>>> } impl<'a> World<'a> { /// Create a new world from a BSPFile. - /// - /// Returns None if any entities in the map have name conflicts. - /// - /// `mapper` is called for each BSPEntity to map it to a concrete rust type. - pub fn new<F>(bsp: Pin<Box<BSPFile<'a>>>, mut mapper: F) -> Option<World<'a>> - where F: FnMut(&BSPEntity) -> Option<(Box<dyn Entity>, String)> { - - let mut entities: Vec<(Box<dyn Entity>, String)> = Vec::with_capacity(bsp.entities.entities.len()); - for bsp_ent in bsp.entities.entities.iter() { - if let Some(result) = mapper(&bsp_ent) { - entities.push(result); - } - } - - let store = EntityStore::from_entities(entities)?; - + pub fn new(bsp: Pin<Box<BSPFile<'a>>>) -> Option<World<'a>> { Some(World { - map: bsp, - live_entities: store + map: bsp }) } }
\ No newline at end of file |