aboutsummaryrefslogtreecommitdiff
path: root/examples/render-bsp/src/main.rs
diff options
context:
space:
mode:
authortcmal <me@aria.rip>2024-08-25 17:44:20 +0100
committertcmal <me@aria.rip>2024-08-25 17:44:20 +0100
commit5dc6c64394d1e0a09c882b88ecb2b8f04f9e5b22 (patch)
tree5e8f5364bf4ffa8265c98dc84a52f887b175ce30 /examples/render-bsp/src/main.rs
parent19b5dfb37ad45eaff18fb14e9134d1386cb696e9 (diff)
refactor(examples): improvements to render-bsp example
Diffstat (limited to 'examples/render-bsp/src/main.rs')
-rw-r--r--examples/render-bsp/src/main.rs113
1 files changed, 102 insertions, 11 deletions
diff --git a/examples/render-bsp/src/main.rs b/examples/render-bsp/src/main.rs
index 8116bd5..7477567 100644
--- a/examples/render-bsp/src/main.rs
+++ b/examples/render-bsp/src/main.rs
@@ -20,49 +20,140 @@ extern crate stockton_bsp;
extern crate stockton_render;
extern crate winit;
extern crate simple_logger;
+extern crate image;
-use std::fs::File;
-use std::io::Read;
+use image::load_from_memory;
+use std::time::SystemTime;
use stockton_bsp::BSPFile;
-use stockton_types::World;
+use stockton_types::{World, Vector3};
use stockton_render::Renderer;
use winit::{
- event::{Event, WindowEvent},
+ event::{Event, WindowEvent, ElementState},
event_loop::{ControlFlow, EventLoop},
window::WindowBuilder
};
+const SPEED: f32 = 25.0;
+
+#[derive(Debug)]
+struct KeyState {
+ pub up: bool,
+ pub left: bool,
+ pub right: bool,
+ pub down: bool,
+ pub inwards: bool,
+ pub out: bool
+}
+
+impl KeyState {
+ pub fn new() -> KeyState {
+ KeyState {
+ up: false,
+ left: false,
+ right: false,
+ down: false,
+ inwards: false,
+ out: false,
+ }
+ }
+
+ pub fn as_vector(&self) -> Vector3 {
+ let mut vec = Vector3::new(0.0, 0.0, 0.0);
+
+ if self.up {
+ vec.y = 1.0;
+ } else if self.down {
+ vec.y = -1.0;
+ }
+
+ if self.right {
+ vec.x = 1.0;
+ } else if self.left {
+ vec.x = -1.0;
+ }
+
+ if self.inwards {
+ vec.z = 1.0;
+ } else if self.out {
+ vec.z = -1.0;
+ }
+
+ vec
+ }
+}
+
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 data = include_bytes!("../data/test.bsp").to_vec().into_boxed_slice();
let bsp = BSPFile::from_buffer(data).unwrap();
- println!("{:?}", bsp);
+
let world = World::new(bsp).unwrap();
let mut renderer = Renderer::new(world, &window).unwrap();
+
+ renderer.context.add_texture(
+ load_from_memory(include_bytes!("../../render-quad/data/test1.png"))
+ .expect("Couldn't load test texture 1")
+ .into_rgba()).unwrap();
+
+ renderer.context.add_texture(
+ load_from_memory(include_bytes!("../../render-quad/data/test2.png"))
+ .expect("Couldn't load test texture 2")
+ .into_rgba()).unwrap();
+
+ let mut last_update = SystemTime::now();
+ let mut key_state = KeyState::new();
+
// Keep rendering the world
event_loop.run(move |event, _, flow| {
*flow = ControlFlow::Poll;
match event {
- // TODO: Handle resize
Event::WindowEvent {
- event: WindowEvent::CloseRequested,
+ event,
..
- } => {
- *flow = ControlFlow::Exit
+ } => match event {
+ WindowEvent::CloseRequested => {
+ *flow = ControlFlow::Exit
+ },
+ WindowEvent::KeyboardInput {input, ..} => match input.scancode {
+ // Left
+ 105 => key_state.left = input.state == ElementState::Pressed,
+ // Right
+ 106 => key_state.right = input.state == ElementState::Pressed,
+ // Up (in)
+ 103 => key_state.inwards = input.state == ElementState::Pressed,
+ // Down (out)
+ 108 => key_state.out = input.state == ElementState::Pressed,
+ // Space (up)
+ 57 => key_state.up = input.state == ElementState::Pressed,
+ // Ctrl (down)
+ 29 => key_state.down = input.state == ElementState::Pressed,
+ _ => ()
+ }
+ _ => ()
},
Event::MainEventsCleared => {
window.request_redraw()
},
- Event::RedrawRequested(_) => {
+ Event::RedrawRequested(_) => {
+
+ let delta = last_update.elapsed().unwrap().as_secs_f32();
+ last_update = SystemTime::now();
+
+ let delta_pos = key_state.as_vector() * delta * SPEED;
+ if delta_pos.x != 0.0 || delta_pos.y != 0.0 || delta_pos.z != 0.0 {
+ renderer.context.move_camera(delta_pos);
+ println!("camera is at {:?}", renderer.context.camera_pos());
+ }
+
renderer.render_frame().unwrap()
}
_ => ()