From 7fc53db3289d6847d9fddf358ba0fc0267bdf8d8 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Sun, 16 Jun 2019 19:45:01 +0200 Subject: [PATCH] Fix fps dependent animation interpolation by using dt --- voxygen/src/anim/character/mod.rs | 32 ++++++++++++------------ voxygen/src/anim/fixture/mod.rs | 2 +- voxygen/src/anim/mod.rs | 6 ++--- voxygen/src/anim/quadruped/mod.rs | 14 +++++------ voxygen/src/anim/quadrupedmedium/mod.rs | 27 +++++++++++--------- voxygen/src/menu/char_selection/scene.rs | 9 ++++--- voxygen/src/scene/figure.rs | 16 +++++++++--- 7 files changed, 61 insertions(+), 45 deletions(-) diff --git a/voxygen/src/anim/character/mod.rs b/voxygen/src/anim/character/mod.rs index e570b7cf0a..0df69ad69b 100644 --- a/voxygen/src/anim/character/mod.rs +++ b/voxygen/src/anim/character/mod.rs @@ -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); } } diff --git a/voxygen/src/anim/fixture/mod.rs b/voxygen/src/anim/fixture/mod.rs index 6be6430b1f..b47d62913b 100644 --- a/voxygen/src/anim/fixture/mod.rs +++ b/voxygen/src/anim/fixture/mod.rs @@ -33,5 +33,5 @@ impl Skeleton for FixtureSkeleton { ] } - fn interpolate(&mut self, target: &Self) {} + fn interpolate(&mut self, target: &Self, dt: f32) {} } diff --git a/voxygen/src/anim/mod.rs b/voxygen/src/anim/mod.rs index 6e8f505095..a7b2e5e630 100644 --- a/voxygen/src/anim/mod.rs +++ b/voxygen/src/anim/mod.rs @@ -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 { diff --git a/voxygen/src/anim/quadruped/mod.rs b/voxygen/src/anim/quadruped/mod.rs index c562bd3e99..51e4a23666 100644 --- a/voxygen/src/anim/quadruped/mod.rs +++ b/voxygen/src/anim/quadruped/mod.rs @@ -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); } } diff --git a/voxygen/src/anim/quadrupedmedium/mod.rs b/voxygen/src/anim/quadrupedmedium/mod.rs index 586a03f8af..ea40e20f2d 100644 --- a/voxygen/src/anim/quadrupedmedium/mod.rs +++ b/voxygen/src/anim/quadrupedmedium/mod.rs @@ -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); } } diff --git a/voxygen/src/menu/char_selection/scene.rs b/voxygen/src/menu/char_selection/scene.rs index 6dc51c20f7..cee590eaa0 100644 --- a/voxygen/src/menu/char_selection/scene.rs +++ b/voxygen/src/menu/char_selection/scene.rs @@ -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::().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( diff --git a/voxygen/src/scene/figure.rs b/voxygen/src/scene/figure.rs index 1e4c393f7b..000c38233c 100644 --- a/voxygen/src/scene/figure.rs +++ b/voxygen/src/scene/figure.rs @@ -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::().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::().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::().0, + ); state.update(renderer, pos.0, ori.0, col); } },