summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-09-02 22:55:09 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-09-02 22:55:09 -0700
commit8c2acf066fc9767a7011db056248ea657392f390 (patch)
treeb226b3c60cc0944752b299b277afe084bd260576 /src/main.rs
parent51ecf9530dae94341e2ba96453a4bf7e376ad33b (diff)
refactor camera
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs109
1 files changed, 59 insertions, 50 deletions
diff --git a/src/main.rs b/src/main.rs
index 4d62f8c..9455ac6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,6 +9,7 @@ mod sprite_loader;
mod vfx;
use futures::executor;
+use glam::IVec2;
use std::{collections::VecDeque, sync::Arc, time::Instant};
use winit::{
application::ApplicationHandler,
@@ -18,7 +19,7 @@ use winit::{
};
use crate::{
- camera::Camera,
+ camera::{Camera, CameraController},
config::WINDOW_TITLE,
content::{
entities::{
@@ -35,7 +36,7 @@ use crate::{
},
proc_gen::TilesetWorldGenerator,
renderer::RendererState,
- sim::{entity::EntityDef, rb_manager::DebugRenderMode, sim_manager::SimManager},
+ sim::{rb_manager::DebugRenderMode, sim_manager::SimManager},
vfx::VfxManager,
};
@@ -66,9 +67,9 @@ struct App {
// game
input_manager: InputManager,
- camera: Option<Camera>,
- vfx_manager: Option<VfxManager>,
- sim_manager: Option<SimManager>,
+ camera_controller: Option<CameraController>,
+ vfx_manager: VfxManager,
+ sim_manager: SimManager,
world_generator: TilesetWorldGenerator,
// renderer
@@ -84,43 +85,47 @@ impl App {
// delta time is the real seconds elapsed since the last time this was called
fn update(&mut self, delta_time: f32) {
// apply inputs
- if let Some(camera) = &mut self.camera {
- camera.handle_camera_input(&self.input_manager, delta_time)
+ if let Some(camera_controller) = &mut self.camera_controller {
+ camera_controller.update(&self.input_manager, &self.sim_manager, delta_time);
}
- if let Some(sim) = &mut self.sim_manager
- && let Some(vfx_manager) = &mut self.vfx_manager
- {
- // --TEST SPAWNING--
- if self.input_manager.pressed(Input::Action1) {
- sim.create_entity(entity_cube_def(
- self.input_manager.world_mouse_pos,
- self.config.dropper_material,
- ));
- }
-
- if self.input_manager.pressed(Input::Grenade) {
- sim.create_entity(entity_grenade_def(self.input_manager.world_mouse_pos, 3.0));
- }
+ // --TEST SPAWNING--
+ if self.input_manager.pressed(Input::Action1) {
+ self.sim_manager.create_entity(entity_cube_def(
+ self.input_manager.world_mouse_pos,
+ self.config.dropper_material,
+ ));
+ }
- if self.input_manager.pressed(Input::Tnt) {
- sim.create_entity(entity_tnt_def(self.input_manager.world_mouse_pos));
- }
+ if self.input_manager.pressed(Input::Grenade) {
+ self.sim_manager
+ .create_entity(entity_grenade_def(self.input_manager.world_mouse_pos, 3.0));
+ }
- if self.input_manager.pressed(Input::Action5) {
- sim.create_entity(entity_wizard_def(self.input_manager.world_mouse_pos));
- }
+ if self.input_manager.pressed(Input::Tnt) {
+ self.sim_manager
+ .create_entity(entity_tnt_def(self.input_manager.world_mouse_pos));
+ }
- if self.input_manager.pressed(Input::Action3) {
- sim.create_entity(entity_bullet_emitter_def(
- self.input_manager.world_mouse_pos,
- 3.0,
- ));
- }
+ if self.input_manager.pressed(Input::Action5) {
+ self.sim_manager
+ .create_entity(entity_wizard_def(self.input_manager.world_mouse_pos));
+ }
- sim.update(vfx_manager, &self.config, &self.input_manager, delta_time);
- self.input_manager.reset_for_frame();
+ if self.input_manager.pressed(Input::Action3) {
+ self.sim_manager.create_entity(entity_bullet_emitter_def(
+ self.input_manager.world_mouse_pos,
+ 3.0,
+ ));
}
+
+ self.sim_manager.update(
+ &mut self.vfx_manager,
+ &self.config,
+ &self.input_manager,
+ delta_time,
+ );
+ self.input_manager.reset_for_frame();
}
}
@@ -141,10 +146,10 @@ impl Default for App {
input_manager: InputManager::new(),
- camera: None,
+ camera_controller: None,
- vfx_manager: Some(VfxManager::new()),
- sim_manager: Some(SimManager::new()),
+ vfx_manager: VfxManager::new(),
+ sim_manager: SimManager::new(),
world_generator: TilesetWorldGenerator::new(
"assets/tilesets/tileset1",
Box::new(MinesBiome::new()),
@@ -177,7 +182,10 @@ impl ApplicationHandler for App {
self.renderer_state = Some(executor::block_on(RendererState::new(window.clone())));
let size = window.inner_size();
- self.camera = Some(Camera::new((size.width as i32, size.height as i32)));
+ self.camera_controller = Some(CameraController::new(
+ IVec2::new(size.width as i32, size.height as i32),
+ camera::CameraControllerMode::Free,
+ ));
}
fn window_event(
@@ -196,17 +204,20 @@ impl ApplicationHandler for App {
}
}
- if let Some(camera) = &self.camera {
- self.input_manager.apply_event(&event, camera);
+ if let Some(camera_controller) = &self.camera_controller {
+ self.input_manager
+ .apply_event(&event, camera_controller.camera());
}
match event {
WindowEvent::Resized(size) => {
if let Some(renderer_state) = &mut self.renderer_state
- && let Some(camera) = &mut self.camera
+ && let Some(camera_controller) = &mut self.camera_controller
{
renderer_state.resize(size.width, size.height);
- camera.resize((size.width as i32, size.height as i32));
+ camera_controller
+ .camera_mut()
+ .resize(IVec2::new(size.width as i32, size.height as i32));
}
}
WindowEvent::CloseRequested => {
@@ -236,21 +247,19 @@ impl ApplicationHandler for App {
self.update(delta_time);
if let Some(renderer_state) = &mut self.renderer_state
- && let Some(sim) = &mut self.sim_manager
- && let Some(vfx) = &mut self.vfx_manager
- && let Some(camera) = &mut self.camera
+ && let Some(camera_controller) = &mut self.camera_controller
{
renderer_state.render(
- sim,
- vfx,
- camera,
+ &mut self.sim_manager,
+ &self.vfx_manager,
+ camera_controller.camera_mut(),
&mut self.config,
&self.diagnostics,
&self.input_manager,
&self.world_generator,
);
- vfx.after_render(delta_time);
+ self.vfx_manager.after_render(delta_time);
}
}
_ => {}