mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Fix fps dependent animation interpolation by using dt
This commit is contained in:
parent
81932ac509
commit
7fc53db328
@ -89,21 +89,21 @@ impl Skeleton for CharacterSkeleton {
|
||||
]
|
||||
}
|
||||
|
||||
fn interpolate(&mut self, target: &Self) {
|
||||
self.head.interpolate(&target.head);
|
||||
self.chest.interpolate(&target.chest);
|
||||
self.belt.interpolate(&target.belt);
|
||||
self.shorts.interpolate(&target.shorts);
|
||||
self.l_hand.interpolate(&target.l_hand);
|
||||
self.r_hand.interpolate(&target.r_hand);
|
||||
self.l_foot.interpolate(&target.l_foot);
|
||||
self.r_foot.interpolate(&target.r_foot);
|
||||
self.weapon.interpolate(&target.weapon);
|
||||
self.l_shoulder.interpolate(&target.l_shoulder);
|
||||
self.r_shoulder.interpolate(&target.r_shoulder);
|
||||
self.draw.interpolate(&target.draw);
|
||||
self.left_equip.interpolate(&target.left_equip);
|
||||
self.right_equip.interpolate(&target.right_equip);
|
||||
self.torso.interpolate(&target.torso);
|
||||
fn interpolate(&mut self, target: &Self, dt: f32) {
|
||||
self.head.interpolate(&target.head, dt);
|
||||
self.chest.interpolate(&target.chest, dt);
|
||||
self.belt.interpolate(&target.belt, dt);
|
||||
self.shorts.interpolate(&target.shorts, dt);
|
||||
self.l_hand.interpolate(&target.l_hand, dt);
|
||||
self.r_hand.interpolate(&target.r_hand, dt);
|
||||
self.l_foot.interpolate(&target.l_foot, dt);
|
||||
self.r_foot.interpolate(&target.r_foot, dt);
|
||||
self.weapon.interpolate(&target.weapon, dt);
|
||||
self.l_shoulder.interpolate(&target.l_shoulder, dt);
|
||||
self.r_shoulder.interpolate(&target.r_shoulder, dt);
|
||||
self.draw.interpolate(&target.draw, dt);
|
||||
self.left_equip.interpolate(&target.left_equip, dt);
|
||||
self.right_equip.interpolate(&target.right_equip, dt);
|
||||
self.torso.interpolate(&target.torso, dt);
|
||||
}
|
||||
}
|
||||
|
@ -33,5 +33,5 @@ impl Skeleton for FixtureSkeleton {
|
||||
]
|
||||
}
|
||||
|
||||
fn interpolate(&mut self, target: &Self) {}
|
||||
fn interpolate(&mut self, target: &Self, dt: f32) {}
|
||||
}
|
||||
|
@ -29,9 +29,9 @@ impl Bone {
|
||||
}
|
||||
|
||||
/// Change the current bone to be more like `target`.
|
||||
fn interpolate(&mut self, target: &Bone) {
|
||||
fn interpolate(&mut self, target: &Bone, dt: f32) {
|
||||
// TODO: Make configurable.
|
||||
let factor = 0.3;
|
||||
let factor = dbg!((15.0 * dt).min(1.0));
|
||||
self.offset += (target.offset - self.offset) * factor;
|
||||
self.ori = vek::ops::Slerp::slerp(self.ori, target.ori, factor);
|
||||
self.scale += (target.scale - self.scale) * factor;
|
||||
@ -42,7 +42,7 @@ pub trait Skeleton: Send + Sync + 'static {
|
||||
fn compute_matrices(&self) -> [FigureBoneData; 16];
|
||||
|
||||
/// Change the current skeleton to be more like `target`.
|
||||
fn interpolate(&mut self, target: &Self);
|
||||
fn interpolate(&mut self, target: &Self, dt: f32);
|
||||
}
|
||||
|
||||
pub trait Animation {
|
||||
|
@ -57,12 +57,12 @@ impl Skeleton for QuadrupedSkeleton {
|
||||
]
|
||||
}
|
||||
|
||||
fn interpolate(&mut self, target: &Self) {
|
||||
self.pig_head.interpolate(&target.pig_head);
|
||||
self.pig_chest.interpolate(&target.pig_chest);
|
||||
self.pig_leg_lf.interpolate(&target.pig_leg_lf);
|
||||
self.pig_leg_rf.interpolate(&target.pig_leg_rf);
|
||||
self.pig_leg_lb.interpolate(&target.pig_leg_lb);
|
||||
self.pig_leg_rb.interpolate(&target.pig_leg_rb);
|
||||
fn interpolate(&mut self, target: &Self, dt: f32) {
|
||||
self.pig_head.interpolate(&target.pig_head, dt);
|
||||
self.pig_chest.interpolate(&target.pig_chest, dt);
|
||||
self.pig_leg_lf.interpolate(&target.pig_leg_lf, dt);
|
||||
self.pig_leg_rf.interpolate(&target.pig_leg_rf, dt);
|
||||
self.pig_leg_lb.interpolate(&target.pig_leg_lb, dt);
|
||||
self.pig_leg_rb.interpolate(&target.pig_leg_rb, dt);
|
||||
}
|
||||
}
|
||||
|
@ -73,17 +73,20 @@ impl Skeleton for QuadrupedMediumSkeleton {
|
||||
]
|
||||
}
|
||||
|
||||
fn interpolate(&mut self, target: &Self) {
|
||||
self.wolf_head_upper.interpolate(&target.wolf_head_upper);
|
||||
self.wolf_jaw.interpolate(&target.wolf_jaw);
|
||||
self.wolf_head_lower.interpolate(&target.wolf_head_lower);
|
||||
self.wolf_tail.interpolate(&target.wolf_tail);
|
||||
self.wolf_torso_back.interpolate(&target.wolf_torso_back);
|
||||
self.wolf_torso_mid.interpolate(&target.wolf_torso_mid);
|
||||
self.wolf_ears.interpolate(&target.wolf_ears);
|
||||
self.wolf_foot_lf.interpolate(&target.wolf_foot_lf);
|
||||
self.wolf_foot_rf.interpolate(&target.wolf_foot_rf);
|
||||
self.wolf_foot_lb.interpolate(&target.wolf_foot_lb);
|
||||
self.wolf_foot_rb.interpolate(&target.wolf_foot_rb);
|
||||
fn interpolate(&mut self, target: &Self, dt: f32) {
|
||||
self.wolf_head_upper
|
||||
.interpolate(&target.wolf_head_upper, dt);
|
||||
self.wolf_jaw.interpolate(&target.wolf_jaw, dt);
|
||||
self.wolf_head_lower
|
||||
.interpolate(&target.wolf_head_lower, dt);
|
||||
self.wolf_tail.interpolate(&target.wolf_tail, dt);
|
||||
self.wolf_torso_back
|
||||
.interpolate(&target.wolf_torso_back, dt);
|
||||
self.wolf_torso_mid.interpolate(&target.wolf_torso_mid, dt);
|
||||
self.wolf_ears.interpolate(&target.wolf_ears, dt);
|
||||
self.wolf_foot_lf.interpolate(&target.wolf_foot_lf, dt);
|
||||
self.wolf_foot_rf.interpolate(&target.wolf_foot_rf, dt);
|
||||
self.wolf_foot_lb.interpolate(&target.wolf_foot_lb, dt);
|
||||
self.wolf_foot_rb.interpolate(&target.wolf_foot_rb, dt);
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ use crate::{
|
||||
},
|
||||
};
|
||||
use client::Client;
|
||||
use common::comp::{self, HumanoidBody};
|
||||
use common::{comp, state::DeltaTime};
|
||||
use log::error;
|
||||
use vek::*;
|
||||
|
||||
@ -108,7 +108,10 @@ impl Scene {
|
||||
client.state().get_time(),
|
||||
client.state().get_time(),
|
||||
);
|
||||
self.figure_state.skeleton_mut().interpolate(&tgt_skeleton);
|
||||
self.figure_state.skeleton_mut().interpolate(
|
||||
&tgt_skeleton,
|
||||
client.state().ecs().read_resource::<DeltaTime>().0,
|
||||
);
|
||||
|
||||
self.figure_state.update(
|
||||
renderer,
|
||||
@ -118,7 +121,7 @@ impl Scene {
|
||||
);
|
||||
}
|
||||
|
||||
pub fn render(&mut self, renderer: &mut Renderer, client: &Client, body: HumanoidBody) {
|
||||
pub fn render(&mut self, renderer: &mut Renderer, client: &Client, body: comp::HumanoidBody) {
|
||||
renderer.render_skybox(&self.skybox.model, &self.globals, &self.skybox.locals);
|
||||
|
||||
let model = self.figure_model_cache.get_or_create_model(
|
||||
|
@ -23,6 +23,7 @@ use common::{
|
||||
Body,
|
||||
},
|
||||
figure::Segment,
|
||||
state::DeltaTime,
|
||||
terrain::TerrainChunkSize,
|
||||
vol::VolSize,
|
||||
};
|
||||
@ -579,7 +580,10 @@ impl FigureMgr {
|
||||
}
|
||||
};
|
||||
|
||||
state.skeleton.interpolate(&target_skeleton);
|
||||
state.skeleton.interpolate(
|
||||
&target_skeleton,
|
||||
client.state().ecs().read_resource::<DeltaTime>().0,
|
||||
);
|
||||
state.update(renderer, pos.0, ori.0, col);
|
||||
}
|
||||
Body::Quadruped(_) => {
|
||||
@ -608,7 +612,10 @@ impl FigureMgr {
|
||||
_ => state.skeleton_mut().clone(),
|
||||
};
|
||||
|
||||
state.skeleton.interpolate(&target_skeleton);
|
||||
state.skeleton.interpolate(
|
||||
&target_skeleton,
|
||||
client.state().ecs().read_resource::<DeltaTime>().0,
|
||||
);
|
||||
state.update(renderer, pos.0, ori.0, col);
|
||||
}
|
||||
Body::QuadrupedMedium(_) => {
|
||||
@ -644,7 +651,10 @@ impl FigureMgr {
|
||||
_ => state.skeleton_mut().clone(),
|
||||
};
|
||||
|
||||
state.skeleton.interpolate(&target_skeleton);
|
||||
state.skeleton.interpolate(
|
||||
&target_skeleton,
|
||||
client.state().ecs().read_resource::<DeltaTime>().0,
|
||||
);
|
||||
state.update(renderer, pos.0, ori.0, col);
|
||||
}
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user