mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Add zoom scaling as well as FOV scaling to ChargedRanged, and restore the old zoom afterwards.
This commit is contained in:
parent
4d7828ec94
commit
7a97fbb5cf
@ -64,7 +64,11 @@ pub struct Data {
|
||||
impl Data {
|
||||
/// How complete the charge is, on a scale of 0.0 to 1.0
|
||||
pub fn charge_frac(&self) -> f32 {
|
||||
(self.timer.as_secs_f32() / self.static_data.charge_duration.as_secs_f32()).min(1.0)
|
||||
if let StageSection::Charge = self.stage_section {
|
||||
(self.timer.as_secs_f32() / self.static_data.charge_duration.as_secs_f32()).min(1.0)
|
||||
} else {
|
||||
0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,6 +42,7 @@ pub struct Camera {
|
||||
ori: Vec3<f32>,
|
||||
tgt_dist: f32,
|
||||
dist: f32,
|
||||
tgt_fov: f32,
|
||||
fov: f32,
|
||||
aspect: f32,
|
||||
mode: CameraMode,
|
||||
@ -76,6 +77,7 @@ impl Camera {
|
||||
ori: Vec3::zero(),
|
||||
tgt_dist: 10.0,
|
||||
dist: 10.0,
|
||||
tgt_fov: 1.1,
|
||||
fov: 1.1,
|
||||
aspect,
|
||||
mode,
|
||||
@ -222,6 +224,14 @@ impl Camera {
|
||||
);
|
||||
}
|
||||
|
||||
if (self.fov - self.tgt_fov).abs() > 0.01 {
|
||||
self.fov = f32::lerp(
|
||||
self.fov,
|
||||
self.tgt_fov,
|
||||
0.65 * (delta as f32) / self.interp_time(),
|
||||
);
|
||||
}
|
||||
|
||||
if (self.focus - self.tgt_focus).magnitude_squared() > 0.001 {
|
||||
let lerped_focus = Lerp::lerp(
|
||||
self.focus,
|
||||
@ -290,7 +300,7 @@ impl Camera {
|
||||
pub fn get_fov(&self) -> f32 { self.fov }
|
||||
|
||||
/// Set the field of view of the camera in radians.
|
||||
pub fn set_fov(&mut self, fov: f32) { self.fov = fov; }
|
||||
pub fn set_fov(&mut self, fov: f32) { self.tgt_fov = fov; }
|
||||
|
||||
/// Set the FOV in degrees
|
||||
pub fn set_fov_deg(&mut self, fov: u16) {
|
||||
|
@ -72,6 +72,7 @@ pub struct SessionState {
|
||||
target_entity: Option<specs::Entity>,
|
||||
selected_entity: Option<(specs::Entity, std::time::Instant)>,
|
||||
interactable: Option<Interactable>,
|
||||
saved_zoom_dist: Option<f32>,
|
||||
}
|
||||
|
||||
/// Represents an active game session (i.e., the one being played).
|
||||
@ -118,6 +119,7 @@ impl SessionState {
|
||||
target_entity: None,
|
||||
selected_entity: None,
|
||||
interactable: None,
|
||||
saved_zoom_dist: None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -298,17 +300,20 @@ impl PlayState for SessionState {
|
||||
let client = self.client.borrow();
|
||||
let player_entity = client.entity();
|
||||
|
||||
let fov_scaling = {
|
||||
if let Some(comp::CharacterState::ChargedRanged(cr)) = client
|
||||
.state()
|
||||
.read_storage::<comp::CharacterState>()
|
||||
.get(player_entity)
|
||||
{
|
||||
1.0 - 3.0 * cr.charge_frac() / 4.0
|
||||
} else {
|
||||
1.0
|
||||
let mut fov_scaling = 1.0;
|
||||
if let Some(comp::CharacterState::ChargedRanged(cr)) = client
|
||||
.state()
|
||||
.read_storage::<comp::CharacterState>()
|
||||
.get(player_entity)
|
||||
{
|
||||
fov_scaling -= 3.0 * cr.charge_frac() / 4.0;
|
||||
if self.saved_zoom_dist.is_none() {
|
||||
self.saved_zoom_dist = Some(camera.get_distance());
|
||||
camera.set_distance(0.0);
|
||||
}
|
||||
};
|
||||
} else if let Some(dist) = self.saved_zoom_dist.take() {
|
||||
camera.set_distance(dist);
|
||||
}
|
||||
camera.set_fov((global_state.settings.graphics.fov as f32 * fov_scaling).to_radians());
|
||||
|
||||
// Compute camera data
|
||||
|
Loading…
Reference in New Issue
Block a user