Add raidillon_input and FPSCameraController

This commit is contained in:
reo 2025-07-18 12:09:24 +03:00
parent d0440f3da3
commit 97195fbd05
7 changed files with 268 additions and 0 deletions

View file

@ -14,3 +14,4 @@ raidillon_ecs = { path = "../raidillon_ecs" }
raidillon_ui = { path = "../raidillon_ui" }
raidillon_core = { path = "../raidillon_core" }
hecs = "0.10.5"
raidillon_input = { path = "../raidillon_input" }

View file

@ -5,6 +5,17 @@ use raidillon_core::Time;
use raidillon_ecs::Transform;
use raidillon_render::{Camera, GliumRenderer, gltf_loader, ECSRenderer};
use raidillon_ui::Gui;
use raidillon_input::{Input, FPSCameraController};
use winit::keyboard::KeyCode;
use winit::window::CursorGrabMode;
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
enum Action {
MoveForward,
MoveBackward,
MoveLeft,
MoveRight,
}
fn main() -> Result<()> {
let event_loop = glium::winit::event_loop::EventLoop::builder()
@ -26,6 +37,17 @@ fn main() -> Result<()> {
// Dear ImGui integration
let mut gui = Gui::new(&display, &window)?;
let mut input = Input::<Action>::new();
input.map_key(KeyCode::KeyW, Action::MoveForward);
input.map_key(KeyCode::KeyS, Action::MoveBackward);
input.map_key(KeyCode::KeyA, Action::MoveLeft);
input.map_key(KeyCode::KeyD, Action::MoveRight);
let mut camera_controller = FPSCameraController::new(Vec3::new(0.0, 0.0, 2.0));
let mut cursor_grabbed = false;
let mut attempted_initial_grab = false;
let mut time = Time::new();
let object_ent = {
@ -66,6 +88,8 @@ fn main() -> Result<()> {
gui.handle_event(&window, &event);
input.handle_event(&event);
match event {
Event::WindowEvent { event, .. } => match event {
WindowEvent::CloseRequested => el.exit(),
@ -110,6 +134,51 @@ fn main() -> Result<()> {
},
Event::AboutToWait => {
time.tick();
if !attempted_initial_grab {
attempted_initial_grab = true;
if window
.set_cursor_grab(CursorGrabMode::Confined)
.or_else(|_| window.set_cursor_grab(CursorGrabMode::Locked))
.is_ok()
{
window.set_cursor_visible(false);
cursor_grabbed = true;
}
}
{
let dt = time.delta_seconds();
camera_controller.update(
&input,
dt,
cursor_grabbed,
(Action::MoveForward, Action::MoveBackward, Action::MoveLeft, Action::MoveRight),
);
if input.key_pressed(KeyCode::Escape) {
if cursor_grabbed {
let _ = window.set_cursor_grab(CursorGrabMode::None);
window.set_cursor_visible(true);
cursor_grabbed = false;
} else if window
.set_cursor_grab(CursorGrabMode::Confined)
.or_else(|_| window.set_cursor_grab(CursorGrabMode::Locked))
.is_ok()
{
window.set_cursor_visible(false);
cursor_grabbed = true;
}
}
if let Ok(mut cam) = ecsr.world.query_one_mut::<&mut Camera>(camera_ent) {
cam.eye = camera_controller.position;
cam.center = camera_controller.position + camera_controller.front();
}
}
input.end_frame();
gui.prepare_frame(&window);
window.request_redraw();
}