diff --git a/src/client/handle_input.rs b/src/client/handle_input.rs index a1cce3a..4dd91d0 100644 --- a/src/client/handle_input.rs +++ b/src/client/handle_input.rs @@ -62,13 +62,19 @@ impl Client<'_> { * state.camera.orientation; } state.camera.orientation.renormalize(); + + // zoom if input.scroll_delta != 0.0 { - state.camera_scroll += input.scroll_delta; - state.camera.scale = (state.camera_scroll * 0.2).exp(); + if input.pressed(Key::ControlLeft) { + state.camera_scroll += input.scroll_delta; + state.camera.scale = (state.camera_scroll * 0.2).exp(); + } else { + state.speed += input.scroll_delta * 0.2; + } } // camera position - let move_dist = dt * (chunk::SIDE_LENGTH / 16) as f32; + let move_dist = dt * state.speed.exp() * (chunk::SIDE_LENGTH / 16) as f32; if input.pressed(Key::KeyW) { state.camera.pos += *state.camera.forward() * move_dist; } diff --git a/src/client/render/voxel/ray_oct/shader/compute.wgsl b/src/client/render/voxel/ray_oct/shader/compute.wgsl index 5ed73bd..7547b5a 100644 --- a/src/client/render/voxel/ray_oct/shader/compute.wgsl +++ b/src/client/render/voxel/ray_oct/shader/compute.wgsl @@ -35,12 +35,11 @@ fn main(@builtin(global_invocation_id) cell: vec3) { } let view_dim_f = vec2(view_dim); let aspect = view_dim_f.y / view_dim_f.x; - let pixel_pos = vec3( - (vec2(cell.xy) / view_dim_f - vec2(0.5)) * vec2(2.0, -2.0 * aspect), - view.zoom + let pixel_pos = vec2( + (vec2(cell.xy) / view_dim_f - vec2(0.5)) * vec2(2.0, -2.0 * aspect) ); - let pos = view.transform * vec4(pixel_pos, 1.0); - let dir = view.transform * vec4(normalize(pixel_pos), 0.0); + let pos = view.transform * vec4(pixel_pos, 1.0, 1.0); + let dir = view.transform * vec4(normalize(vec3(pixel_pos, view.zoom)), 0.0); var color = trace_full(pos, dir); let light_mult = clamp((-dot(dir.xyz, global_lights[0].dir) - 0.99) * 200.0, 0.0, 1.0); @@ -115,7 +114,7 @@ fn trace_full(pos_view: vec4, dir_view: vec4) -> vec4 { } axis = select(select(2u, 1u, hit.y), 0u, hit.x); } - let t_mult =f32(1u << (MAX_SCALE - group.scale)); + let t_mult = f32(1u << (MAX_SCALE - group.scale)); t_min *= t_mult; // time to move 1 unit in each direction let full = f32(1u << MAX_SCALE); @@ -262,7 +261,7 @@ fn get_color(id: u32, pos: vec3) -> vec4 { } fn random(pos: vec3) -> f32 { - return fract(sin(dot(pos,vec3(12.9898,78.233,25.1279)))*43758.5453123); + return fract(sin(dot(pos, vec3(12.9898, 78.233, 25.1279))) * 43758.5453123); } fn outside3f(v: vec3, low: vec3, high: vec3) -> bool { diff --git a/src/client/state.rs b/src/client/state.rs index c3558de..f6bde8c 100644 --- a/src/client/state.rs +++ b/src/client/state.rs @@ -3,6 +3,7 @@ use super::camera::Camera; pub struct ClientState { pub camera: Camera, pub camera_scroll: f32, + pub speed: f32, } impl ClientState { @@ -10,6 +11,7 @@ impl ClientState { Self { camera: Camera::default(), camera_scroll: 0.0, + speed: 0.0, } } }