This commit is contained in:
Dongho Kim
2025-12-15 23:10:38 +09:00
parent 169997eecd
commit 45807e3a90
19 changed files with 3438 additions and 2256 deletions

52
frontend/src/camera.rs Normal file
View File

@@ -0,0 +1,52 @@
//! Camera and input state management
/// GPU-compatible camera uniform data
#[repr(C)]
#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)]
pub struct CameraUniform {
/// x: scale_x, y: scale_y, z: translate_x, w: translate_y
pub params: [f32; 4],
/// x: is_dark (1.0 for dark, 0.0 for light), y,z,w: padding
pub theme: [f32; 4],
}
/// Camera state for 2D map view
pub struct Camera {
pub x: f32,
pub y: f32,
pub zoom: f32,
pub aspect: f32,
}
impl Camera {
pub fn to_uniform(&self, is_dark: bool) -> CameraUniform {
// Simple 2D orthographic projection-like transform
// We want to map world coordinates to clip space [-1, 1]
// zoom controls how much of the world we see.
// aspect ratio correction is needed for non-square windows.
// Scale:
// If zoom is 1.0, we see 2.0 units of world height (from -1 to 1).
// scale_y = zoom
// scale_x = zoom / aspect
CameraUniform {
params: [
self.zoom / self.aspect, // scale_x
-self.zoom, // scale_y (flipped for North-Up)
-self.x * (self.zoom / self.aspect), // translate_x
self.y * self.zoom, // translate_y (flipped sign)
],
theme: [
if is_dark { 1.0 } else { 0.0 },
0.0, 0.0, 0.0
],
}
}
}
/// Mouse/touch input state for drag operations
pub struct InputState {
pub is_dragging: bool,
pub last_cursor: Option<(f64, f64)>,
}