Fix fps dependent animation interpolation by using dt

This commit is contained in:
timokoesters 2019-06-16 19:45:01 +02:00
parent 81932ac509
commit 7fc53db328
No known key found for this signature in database
GPG Key ID: CD80BE9AAEE78097
7 changed files with 61 additions and 45 deletions

View File

@ -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);
}
}

View File

@ -33,5 +33,5 @@ impl Skeleton for FixtureSkeleton {
]
}
fn interpolate(&mut self, target: &Self) {}
fn interpolate(&mut self, target: &Self, dt: f32) {}
}

View File

@ -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 {

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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(

View File

@ -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);
}
},