2019-05-24 23:01:10 +00:00
|
|
|
pub mod attack;
|
2019-08-25 16:48:12 +00:00
|
|
|
pub mod block;
|
2019-08-29 02:17:08 +00:00
|
|
|
pub mod blockidle;
|
2019-12-03 06:30:08 +00:00
|
|
|
pub mod charge;
|
2019-06-13 18:09:50 +00:00
|
|
|
pub mod cidle;
|
2019-09-09 19:11:40 +00:00
|
|
|
pub mod climb;
|
2019-05-16 19:23:45 +00:00
|
|
|
pub mod gliding;
|
2019-04-21 17:35:43 +00:00
|
|
|
pub mod idle;
|
2019-05-09 10:32:44 +00:00
|
|
|
pub mod jump;
|
2019-06-11 04:08:55 +00:00
|
|
|
pub mod roll;
|
2019-06-13 18:09:50 +00:00
|
|
|
pub mod run;
|
2020-03-20 22:54:27 +00:00
|
|
|
pub mod shoot;
|
2019-09-09 19:11:40 +00:00
|
|
|
pub mod sit;
|
2020-03-21 18:54:29 +00:00
|
|
|
pub mod spin;
|
2019-08-29 02:17:08 +00:00
|
|
|
pub mod stand;
|
2019-09-09 19:11:40 +00:00
|
|
|
pub mod swim;
|
2019-08-29 02:17:08 +00:00
|
|
|
pub mod wield;
|
2019-01-14 14:40:22 +00:00
|
|
|
|
2019-04-21 17:35:43 +00:00
|
|
|
// Reexports
|
2020-02-01 20:39:39 +00:00
|
|
|
pub use self::{
|
|
|
|
attack::AttackAnimation, block::BlockAnimation, blockidle::BlockIdleAnimation,
|
|
|
|
charge::ChargeAnimation, cidle::CidleAnimation, climb::ClimbAnimation,
|
|
|
|
gliding::GlidingAnimation, idle::IdleAnimation, jump::JumpAnimation, roll::RollAnimation,
|
2020-03-21 19:47:16 +00:00
|
|
|
run::RunAnimation, shoot::ShootAnimation, sit::SitAnimation, spin::SpinAnimation,
|
|
|
|
stand::StandAnimation, swim::SwimAnimation, wield::WieldAnimation,
|
2020-02-01 20:39:39 +00:00
|
|
|
};
|
2019-05-19 17:36:55 +00:00
|
|
|
|
2019-04-29 20:37:19 +00:00
|
|
|
use super::{Bone, Skeleton};
|
2019-06-06 14:48:41 +00:00
|
|
|
use crate::render::FigureBoneData;
|
2020-02-03 21:02:32 +00:00
|
|
|
use common::comp::{self, item::ToolKind};
|
2019-01-14 14:40:22 +00:00
|
|
|
|
2020-01-26 00:22:48 +00:00
|
|
|
#[derive(Clone, Default)]
|
2019-04-21 17:35:43 +00:00
|
|
|
pub struct CharacterSkeleton {
|
|
|
|
head: Bone,
|
|
|
|
chest: Bone,
|
|
|
|
belt: Bone,
|
|
|
|
shorts: Bone,
|
|
|
|
l_hand: Bone,
|
|
|
|
r_hand: Bone,
|
|
|
|
l_foot: Bone,
|
|
|
|
r_foot: Bone,
|
|
|
|
l_shoulder: Bone,
|
|
|
|
r_shoulder: Bone,
|
2019-12-03 06:30:08 +00:00
|
|
|
glider: Bone,
|
2020-03-05 14:02:11 +00:00
|
|
|
main: Bone,
|
|
|
|
second: Bone,
|
2019-12-03 06:30:08 +00:00
|
|
|
lantern: Bone,
|
2019-05-16 04:40:35 +00:00
|
|
|
torso: Bone,
|
2020-03-05 14:02:11 +00:00
|
|
|
control: Bone,
|
|
|
|
l_control: Bone,
|
|
|
|
r_control: Bone,
|
2019-04-21 17:35:43 +00:00
|
|
|
}
|
2019-04-24 00:17:50 +00:00
|
|
|
|
2019-04-21 17:35:43 +00:00
|
|
|
impl CharacterSkeleton {
|
2020-02-01 20:39:39 +00:00
|
|
|
pub fn new() -> Self { Self::default() }
|
2019-04-21 17:35:43 +00:00
|
|
|
}
|
2019-01-14 14:40:22 +00:00
|
|
|
|
2019-04-21 17:35:43 +00:00
|
|
|
impl Skeleton for CharacterSkeleton {
|
2020-01-26 00:22:48 +00:00
|
|
|
type Attr = SkeletonAttr;
|
2020-02-01 20:39:39 +00:00
|
|
|
|
2020-03-05 14:02:11 +00:00
|
|
|
fn compute_matrices(&self) -> [FigureBoneData; 18] {
|
2019-04-21 17:35:43 +00:00
|
|
|
let chest_mat = self.chest.compute_base_matrix();
|
|
|
|
let torso_mat = self.torso.compute_base_matrix();
|
2019-05-13 00:52:30 +00:00
|
|
|
let l_hand_mat = self.l_hand.compute_base_matrix();
|
2020-03-05 14:02:11 +00:00
|
|
|
let r_hand_mat = self.r_hand.compute_base_matrix();
|
|
|
|
let control_mat = self.control.compute_base_matrix();
|
|
|
|
let l_control_mat = self.l_control.compute_base_matrix();
|
|
|
|
let r_control_mat = self.r_control.compute_base_matrix();
|
2019-12-03 06:30:08 +00:00
|
|
|
let main_mat = self.main.compute_base_matrix();
|
2020-03-05 14:02:11 +00:00
|
|
|
let second_mat = self.second.compute_base_matrix();
|
2019-12-03 06:30:08 +00:00
|
|
|
|
2019-06-28 08:24:13 +00:00
|
|
|
let head_mat = self.head.compute_base_matrix();
|
2019-04-21 17:35:43 +00:00
|
|
|
[
|
2019-06-28 08:24:13 +00:00
|
|
|
FigureBoneData::new(torso_mat * head_mat),
|
2019-04-21 17:35:43 +00:00
|
|
|
FigureBoneData::new(torso_mat * chest_mat),
|
|
|
|
FigureBoneData::new(torso_mat * self.belt.compute_base_matrix()),
|
|
|
|
FigureBoneData::new(torso_mat * self.shorts.compute_base_matrix()),
|
2020-03-05 14:02:11 +00:00
|
|
|
FigureBoneData::new(torso_mat * chest_mat * control_mat * l_control_mat * l_hand_mat),
|
|
|
|
FigureBoneData::new(torso_mat * chest_mat * control_mat * r_control_mat * r_hand_mat),
|
2019-04-21 17:35:43 +00:00
|
|
|
FigureBoneData::new(torso_mat * self.l_foot.compute_base_matrix()),
|
|
|
|
FigureBoneData::new(torso_mat * self.r_foot.compute_base_matrix()),
|
2019-05-13 00:52:30 +00:00
|
|
|
FigureBoneData::new(torso_mat * chest_mat * self.l_shoulder.compute_base_matrix()),
|
|
|
|
FigureBoneData::new(torso_mat * chest_mat * self.r_shoulder.compute_base_matrix()),
|
2019-12-03 06:30:08 +00:00
|
|
|
FigureBoneData::new(torso_mat * self.glider.compute_base_matrix()),
|
2020-03-05 14:02:11 +00:00
|
|
|
FigureBoneData::new(torso_mat * chest_mat * control_mat * l_control_mat * main_mat),
|
|
|
|
FigureBoneData::new(torso_mat * chest_mat * control_mat * r_control_mat * second_mat),
|
2019-12-03 06:30:08 +00:00
|
|
|
FigureBoneData::new(torso_mat * chest_mat * self.lantern.compute_base_matrix()),
|
2019-05-16 04:40:35 +00:00
|
|
|
FigureBoneData::new(torso_mat),
|
2020-03-05 14:02:11 +00:00
|
|
|
FigureBoneData::new(control_mat),
|
|
|
|
FigureBoneData::new(l_control_mat),
|
|
|
|
FigureBoneData::new(r_control_mat),
|
2019-04-21 17:35:43 +00:00
|
|
|
]
|
|
|
|
}
|
2019-04-16 18:15:49 +00:00
|
|
|
|
2019-06-16 17:45:01 +00:00
|
|
|
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.l_shoulder.interpolate(&target.l_shoulder, dt);
|
|
|
|
self.r_shoulder.interpolate(&target.r_shoulder, dt);
|
2019-12-03 06:30:08 +00:00
|
|
|
self.glider.interpolate(&target.glider, dt);
|
2020-03-05 14:02:11 +00:00
|
|
|
self.main.interpolate(&target.main, dt);
|
|
|
|
self.second.interpolate(&target.second, dt);
|
2019-12-03 06:30:08 +00:00
|
|
|
self.lantern.interpolate(&target.lantern, dt);
|
2019-06-16 17:45:01 +00:00
|
|
|
self.torso.interpolate(&target.torso, dt);
|
2020-03-05 14:02:11 +00:00
|
|
|
self.control.interpolate(&target.control, dt);
|
|
|
|
self.l_control.interpolate(&target.l_control, dt);
|
|
|
|
self.r_control.interpolate(&target.r_control, dt);
|
2019-04-16 18:15:49 +00:00
|
|
|
}
|
2019-01-14 14:40:22 +00:00
|
|
|
}
|
2020-01-26 00:22:48 +00:00
|
|
|
|
|
|
|
pub struct SkeletonAttr {
|
|
|
|
scaler: f32,
|
|
|
|
head_scale: f32,
|
|
|
|
neck_height: f32,
|
|
|
|
neck_forward: f32,
|
|
|
|
neck_right: f32,
|
|
|
|
weapon_x: f32,
|
|
|
|
weapon_y: f32,
|
|
|
|
}
|
|
|
|
impl SkeletonAttr {
|
|
|
|
pub fn calculate_scale(body: &comp::humanoid::Body) -> f32 {
|
|
|
|
use comp::humanoid::{BodyType::*, Race::*};
|
|
|
|
match (body.race, body.body_type) {
|
|
|
|
(Orc, Male) => 0.95,
|
|
|
|
(Orc, Female) => 0.8,
|
|
|
|
(Human, Male) => 0.8,
|
|
|
|
(Human, Female) => 0.75,
|
|
|
|
(Elf, Male) => 0.85,
|
|
|
|
(Elf, Female) => 0.8,
|
|
|
|
(Dwarf, Male) => 0.7,
|
|
|
|
(Dwarf, Female) => 0.65,
|
|
|
|
(Undead, Male) => 0.8,
|
|
|
|
(Undead, Female) => 0.75,
|
|
|
|
(Danari, Male) => 0.58,
|
|
|
|
(Danari, Female) => 0.58,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for SkeletonAttr {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
|
|
|
scaler: 1.0,
|
|
|
|
head_scale: 1.0,
|
|
|
|
neck_height: 1.0,
|
|
|
|
neck_forward: 1.0,
|
|
|
|
neck_right: 1.0,
|
|
|
|
weapon_x: 1.0,
|
|
|
|
weapon_y: 1.0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr {
|
|
|
|
type Error = ();
|
|
|
|
|
|
|
|
fn try_from(body: &'a comp::Body) -> Result<Self, Self::Error> {
|
|
|
|
match body {
|
|
|
|
comp::Body::Humanoid(body) => Ok(SkeletonAttr::from(body)),
|
|
|
|
_ => Err(()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> From<&'a comp::humanoid::Body> for SkeletonAttr {
|
|
|
|
fn from(body: &'a comp::humanoid::Body) -> Self {
|
|
|
|
use comp::humanoid::{BodyType::*, Race::*};
|
|
|
|
Self {
|
|
|
|
scaler: SkeletonAttr::calculate_scale(body),
|
|
|
|
head_scale: match (body.race, body.body_type) {
|
|
|
|
(Orc, Male) => 0.9,
|
|
|
|
(Orc, Female) => 1.0,
|
|
|
|
(Human, Male) => 1.0,
|
|
|
|
(Human, Female) => 1.0,
|
|
|
|
(Elf, Male) => 0.95,
|
|
|
|
(Elf, Female) => 1.0,
|
|
|
|
(Dwarf, Male) => 1.0,
|
|
|
|
(Dwarf, Female) => 1.0,
|
|
|
|
(Undead, Male) => 1.0,
|
|
|
|
(Undead, Female) => 1.0,
|
|
|
|
(Danari, Male) => 1.15,
|
|
|
|
(Danari, Female) => 1.15,
|
|
|
|
},
|
|
|
|
neck_height: match (body.race, body.body_type) {
|
|
|
|
(Orc, Male) => 0.0,
|
|
|
|
(Orc, Female) => 0.0,
|
|
|
|
(Human, Male) => 0.0,
|
|
|
|
(Human, Female) => 0.0,
|
|
|
|
(Elf, Male) => 0.0,
|
|
|
|
(Elf, Female) => 0.0,
|
|
|
|
(Dwarf, Male) => 0.0,
|
|
|
|
(Dwarf, Female) => 0.0,
|
|
|
|
(Undead, Male) => 0.5,
|
|
|
|
(Undead, Female) => 0.5,
|
|
|
|
(Danari, Male) => 0.5,
|
|
|
|
(Danari, Female) => 0.5,
|
|
|
|
},
|
|
|
|
neck_forward: match (body.race, body.body_type) {
|
|
|
|
(Orc, Male) => 0.0,
|
|
|
|
(Orc, Female) => 0.0,
|
|
|
|
(Human, Male) => 0.5,
|
|
|
|
(Human, Female) => 0.0,
|
|
|
|
(Elf, Male) => 0.5,
|
|
|
|
(Elf, Female) => 0.5,
|
|
|
|
(Dwarf, Male) => 0.5,
|
|
|
|
(Dwarf, Female) => 0.0,
|
|
|
|
(Undead, Male) => 0.5,
|
|
|
|
(Undead, Female) => 0.5,
|
|
|
|
(Danari, Male) => 0.0,
|
|
|
|
(Danari, Female) => 0.0,
|
|
|
|
},
|
|
|
|
neck_right: match (body.race, body.body_type) {
|
|
|
|
(Orc, Male) => 0.0,
|
|
|
|
(Orc, Female) => 0.0,
|
|
|
|
(Human, Male) => 0.0,
|
|
|
|
(Human, Female) => 0.0,
|
|
|
|
(Elf, Male) => 0.0,
|
|
|
|
(Elf, Female) => 0.0,
|
|
|
|
(Dwarf, Male) => 0.0,
|
|
|
|
(Dwarf, Female) => 0.0,
|
|
|
|
(Undead, Male) => 0.0,
|
|
|
|
(Undead, Female) => 0.0,
|
|
|
|
(Danari, Male) => 0.0,
|
|
|
|
(Danari, Female) => 0.0,
|
|
|
|
},
|
2020-03-17 17:27:52 +00:00
|
|
|
weapon_x: match ToolKind::Empty {
|
2020-02-03 21:02:32 +00:00
|
|
|
ToolKind::Sword(_) => 0.0,
|
2020-03-17 17:27:52 +00:00
|
|
|
ToolKind::Axe(_) => 3.0,
|
|
|
|
ToolKind::Hammer(_) => 0.0,
|
|
|
|
ToolKind::Shield(_) => 3.0,
|
|
|
|
ToolKind::Staff(_) => 3.0,
|
|
|
|
ToolKind::Bow(_) => 0.0,
|
|
|
|
ToolKind::Dagger(_) => 0.0,
|
2020-02-03 21:02:32 +00:00
|
|
|
ToolKind::Debug(_) => 0.0,
|
2020-03-16 13:27:52 +00:00
|
|
|
ToolKind::Empty => 0.0,
|
2020-01-26 00:22:48 +00:00
|
|
|
},
|
2020-03-17 17:27:52 +00:00
|
|
|
weapon_y: match ToolKind::Empty {
|
2020-02-03 21:02:32 +00:00
|
|
|
ToolKind::Sword(_) => -1.25,
|
2020-03-17 17:27:52 +00:00
|
|
|
ToolKind::Axe(_) => 0.0,
|
|
|
|
ToolKind::Hammer(_) => -2.0,
|
|
|
|
ToolKind::Shield(_) => 0.0,
|
|
|
|
ToolKind::Staff(_) => 0.0,
|
|
|
|
ToolKind::Bow(_) => -2.0,
|
|
|
|
ToolKind::Dagger(_) => -2.0,
|
2020-02-03 21:02:32 +00:00
|
|
|
ToolKind::Debug(_) => 0.0,
|
2020-03-16 13:27:52 +00:00
|
|
|
ToolKind::Empty => 0.0,
|
2020-01-26 00:22:48 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|