mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Improves fish_small, new npc
This commit is contained in:
parent
72d73ecd38
commit
f94a4ec90d
@ -686,7 +686,7 @@
|
|||||||
"species": {
|
"species": {
|
||||||
"reddragon": {
|
"reddragon": {
|
||||||
"keyword": "reddragon",
|
"keyword": "reddragon",
|
||||||
"generic": "Reddragon"
|
"generic": "Red Dragon"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -705,9 +705,9 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"species": {
|
"species": {
|
||||||
"sardine": {
|
"clownfish": {
|
||||||
"keyword": "sardine",
|
"keyword": "clownfish",
|
||||||
"generic": "Sardine"
|
"generic": "Clownfish"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1,30 +1,22 @@
|
|||||||
({
|
({
|
||||||
(Sardine, Male): (
|
(Clownfish, Male): (
|
||||||
head: (
|
|
||||||
offset: (-4.0, 0.0, -3.0),
|
|
||||||
central: ("npc.sardine.male.head"),
|
|
||||||
),
|
|
||||||
chest: (
|
chest: (
|
||||||
offset: (-5.0, -7.5, -3.0),
|
offset: (-1.5, -7.5, -5.0),
|
||||||
central: ("npc.sardine.male.chest"),
|
central: ("npc.clownfish.male.chest"),
|
||||||
),
|
),
|
||||||
tail: (
|
tail: (
|
||||||
offset: (-1.0, -9.0, -1.5),
|
offset: (-0.5, -5.0, -2.5),
|
||||||
central: ("npc.sardine.male.tail"),
|
central: ("npc.clownfish.male.tail"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(Sardine, Female): (
|
(Clownfish, Female): (
|
||||||
head: (
|
|
||||||
offset: (-4.0, 0.0, -3.0),
|
|
||||||
central: ("npc.sardine.male.head"),
|
|
||||||
),
|
|
||||||
chest: (
|
chest: (
|
||||||
offset: (-5.0, -7.5, -3.0),
|
offset: (-1.5, -7.5, -5.0),
|
||||||
central: ("npc.sardine.male.chest"),
|
central: ("npc.clownfish.male.chest"),
|
||||||
),
|
),
|
||||||
tail: (
|
tail: (
|
||||||
offset: (-1.0, -9.0, -1.5),
|
offset: (-0.5, -5.0, -2.5),
|
||||||
central: ("npc.sardine.male.tail"),
|
central: ("npc.clownfish.male.tail"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
({
|
({
|
||||||
(Sardine, Male): (
|
(Clownfish, Male): (
|
||||||
fin_l: (
|
fin_l: (
|
||||||
offset: (-1.5, -5.0, -3.0),
|
offset: (-0.5, -3.0, -4.0),
|
||||||
lateral: ("npc.sardine.male.fin_l"),
|
lateral: ("npc.clownfish.male.fin_l"),
|
||||||
),
|
),
|
||||||
fin_r: (
|
fin_r: (
|
||||||
offset: (-1.5, -5.0, -3.0),
|
offset: (-0.5, -3.0, -4.0),
|
||||||
lateral: ("npc.sardine.male.fin_r"),
|
lateral: ("npc.clownfish.male.fin_r"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(Sardine, Female): (
|
(Clownfish, Female): (
|
||||||
fin_l: (
|
fin_l: (
|
||||||
offset: (-1.5, -5.0, -3.0),
|
offset: (-0.5, -3.0, -4.0),
|
||||||
lateral: ("npc.sardine.male.fin_l"),
|
lateral: ("npc.clownfish.male.fin_l"),
|
||||||
),
|
),
|
||||||
fin_r: (
|
fin_r: (
|
||||||
offset: (-1.5, -5.0, -3.0),
|
offset: (-0.5, -3.0, -4.0),
|
||||||
lateral: ("npc.sardine.male.fin_r"),
|
lateral: ("npc.clownfish.male.fin_r"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
BIN
assets/voxygen/voxel/npc/clownfish/male/chest.vox
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/voxel/npc/clownfish/male/chest.vox
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/voxel/npc/clownfish/male/fin_l.vox
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/voxel/npc/clownfish/male/fin_l.vox
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/voxel/npc/clownfish/male/fin_r.vox
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/voxel/npc/clownfish/male/fin_r.vox
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/voxel/npc/clownfish/male/tail.vox
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/voxel/npc/clownfish/male/tail.vox
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/voxel/npc/gecko/male/Gecko.vox
(Stored with Git LFS)
BIN
assets/voxygen/voxel/npc/gecko/male/Gecko.vox
(Stored with Git LFS)
Binary file not shown.
BIN
assets/voxygen/voxel/npc/mindflayer/leg_l.vox
(Stored with Git LFS)
BIN
assets/voxygen/voxel/npc/mindflayer/leg_l.vox
(Stored with Git LFS)
Binary file not shown.
BIN
assets/voxygen/voxel/npc/mindflayer/leg_r.vox
(Stored with Git LFS)
BIN
assets/voxygen/voxel/npc/mindflayer/leg_r.vox
(Stored with Git LFS)
Binary file not shown.
BIN
assets/voxygen/voxel/npc/mindflayer/torso_lower.vox
(Stored with Git LFS)
BIN
assets/voxygen/voxel/npc/mindflayer/torso_lower.vox
(Stored with Git LFS)
Binary file not shown.
BIN
assets/voxygen/voxel/npc/mindflayer/torso_lower2.vox
(Stored with Git LFS)
BIN
assets/voxygen/voxel/npc/mindflayer/torso_lower2.vox
(Stored with Git LFS)
Binary file not shown.
@ -87,7 +87,7 @@ impl<BodyMeta, SpeciesMeta> core::ops::Index<NpcKind> for AllBodies<BodyMeta, Sp
|
|||||||
NpcKind::Pig => &self.quadruped_small.body,
|
NpcKind::Pig => &self.quadruped_small.body,
|
||||||
NpcKind::Wolf => &self.quadruped_medium.body,
|
NpcKind::Wolf => &self.quadruped_medium.body,
|
||||||
NpcKind::Duck => &self.bird_medium.body,
|
NpcKind::Duck => &self.bird_medium.body,
|
||||||
NpcKind::Sardine => &self.fish_medium.body,
|
NpcKind::Clownfish => &self.fish_medium.body,
|
||||||
NpcKind::Marlin => &self.fish_small.body,
|
NpcKind::Marlin => &self.fish_small.body,
|
||||||
NpcKind::Ogre => &self.biped_large.body,
|
NpcKind::Ogre => &self.biped_large.body,
|
||||||
NpcKind::StoneGolem => &self.golem.body,
|
NpcKind::StoneGolem => &self.golem.body,
|
||||||
|
@ -34,7 +34,7 @@ make_case_elim!(
|
|||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
pub enum Species {
|
pub enum Species {
|
||||||
Sardine = 0,
|
Clownfish = 0,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ make_case_elim!(
|
|||||||
/// NOTE: Deliberately don't (yet?) implement serialize.
|
/// NOTE: Deliberately don't (yet?) implement serialize.
|
||||||
#[derive(Clone, Debug, Deserialize)]
|
#[derive(Clone, Debug, Deserialize)]
|
||||||
pub struct AllSpecies<SpeciesMeta> {
|
pub struct AllSpecies<SpeciesMeta> {
|
||||||
pub sardine: SpeciesMeta,
|
pub clownfish: SpeciesMeta,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta> {
|
impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta> {
|
||||||
@ -52,12 +52,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies<SpeciesMeta>
|
|||||||
#[inline]
|
#[inline]
|
||||||
fn index(&self, &index: &'a Species) -> &Self::Output {
|
fn index(&self, &index: &'a Species) -> &Self::Output {
|
||||||
match index {
|
match index {
|
||||||
Species::Sardine => &self.sardine,
|
Species::Clownfish => &self.clownfish,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const ALL_SPECIES: [Species; 1] = [Species::Sardine];
|
pub const ALL_SPECIES: [Species; 1] = [Species::Clownfish];
|
||||||
|
|
||||||
impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies<SpeciesMeta> {
|
impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies<SpeciesMeta> {
|
||||||
type IntoIter = std::iter::Copied<std::slice::Iter<'static, Self::Item>>;
|
type IntoIter = std::iter::Copied<std::slice::Iter<'static, Self::Item>>;
|
||||||
|
@ -13,7 +13,7 @@ pub enum NpcKind {
|
|||||||
Wolf,
|
Wolf,
|
||||||
Pig,
|
Pig,
|
||||||
Duck,
|
Duck,
|
||||||
Sardine,
|
Clownfish,
|
||||||
Marlin,
|
Marlin,
|
||||||
Ogre,
|
Ogre,
|
||||||
Archaeos,
|
Archaeos,
|
||||||
@ -27,7 +27,7 @@ pub const ALL_NPCS: [NpcKind; 11] = [
|
|||||||
NpcKind::Wolf,
|
NpcKind::Wolf,
|
||||||
NpcKind::Pig,
|
NpcKind::Pig,
|
||||||
NpcKind::Duck,
|
NpcKind::Duck,
|
||||||
NpcKind::Sardine,
|
NpcKind::Clownfish,
|
||||||
NpcKind::Marlin,
|
NpcKind::Marlin,
|
||||||
NpcKind::Ogre,
|
NpcKind::Ogre,
|
||||||
NpcKind::Archaeos,
|
NpcKind::Archaeos,
|
||||||
@ -97,7 +97,7 @@ pub fn kind_to_body(kind: NpcKind) -> Body {
|
|||||||
NpcKind::Pig => comp::quadruped_small::Body::random().into(),
|
NpcKind::Pig => comp::quadruped_small::Body::random().into(),
|
||||||
NpcKind::Wolf => comp::quadruped_medium::Body::random().into(),
|
NpcKind::Wolf => comp::quadruped_medium::Body::random().into(),
|
||||||
NpcKind::Duck => comp::bird_medium::Body::random().into(),
|
NpcKind::Duck => comp::bird_medium::Body::random().into(),
|
||||||
NpcKind::Sardine => comp::fish_small::Body::random().into(),
|
NpcKind::Clownfish => comp::fish_small::Body::random().into(),
|
||||||
NpcKind::Marlin => comp::fish_medium::Body::random().into(),
|
NpcKind::Marlin => comp::fish_medium::Body::random().into(),
|
||||||
NpcKind::Ogre => comp::biped_large::Body::random().into(),
|
NpcKind::Ogre => comp::biped_large::Body::random().into(),
|
||||||
NpcKind::Archaeos => comp::theropod::Body::random().into(),
|
NpcKind::Archaeos => comp::theropod::Body::random().into(),
|
||||||
@ -204,7 +204,7 @@ impl NpcBody {
|
|||||||
.or_else(|| {
|
.or_else(|| {
|
||||||
parse(
|
parse(
|
||||||
s,
|
s,
|
||||||
NpcKind::Sardine,
|
NpcKind::Clownfish,
|
||||||
&npc_names.fish_small,
|
&npc_names.fish_small,
|
||||||
comp::fish_small::Body::random_with,
|
comp::fish_small::Body::random_with,
|
||||||
)
|
)
|
||||||
|
@ -22,7 +22,6 @@ impl Animation for IdleAnimation {
|
|||||||
) -> Self::Skeleton {
|
) -> Self::Skeleton {
|
||||||
let mut next = (*skeleton).clone();
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
let slower = (anim_time as f32 * 1.0 + PI).sin();
|
|
||||||
let slow = (anim_time as f32 * 3.5 + PI).sin();
|
let slow = (anim_time as f32 * 3.5 + PI).sin();
|
||||||
let slowalt = (anim_time as f32 * 3.5 + PI + 0.2).sin();
|
let slowalt = (anim_time as f32 * 3.5 + PI + 0.2).sin();
|
||||||
|
|
||||||
|
@ -21,10 +21,7 @@ impl Animation for IdleAnimation {
|
|||||||
) -> Self::Skeleton {
|
) -> Self::Skeleton {
|
||||||
let mut next = (*skeleton).clone();
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
next.head.scale = Vec3::one() / 11.0;
|
next.chest.scale = Vec3::one() / 11.0;
|
||||||
|
|
||||||
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1);
|
|
||||||
next.head.orientation = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0);
|
|
||||||
|
|
||||||
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
||||||
next.chest.orientation = Quaternion::rotation_x(0.0);
|
next.chest.orientation = Quaternion::rotation_x(0.0);
|
||||||
|
@ -21,10 +21,7 @@ impl Animation for JumpAnimation {
|
|||||||
) -> Self::Skeleton {
|
) -> Self::Skeleton {
|
||||||
let mut next = (*skeleton).clone();
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
next.head.scale = Vec3::one() / 11.0;
|
next.chest.scale = Vec3::one() / 11.0;
|
||||||
|
|
||||||
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1);
|
|
||||||
next.head.orientation = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0);
|
|
||||||
|
|
||||||
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
||||||
next.chest.orientation = Quaternion::rotation_x(0.0);
|
next.chest.orientation = Quaternion::rotation_x(0.0);
|
||||||
|
@ -2,9 +2,13 @@ pub mod idle;
|
|||||||
pub mod jump;
|
pub mod jump;
|
||||||
pub mod run;
|
pub mod run;
|
||||||
pub mod swim;
|
pub mod swim;
|
||||||
|
pub mod swimidle;
|
||||||
|
|
||||||
// Reexports
|
// Reexports
|
||||||
pub use self::{idle::IdleAnimation, jump::JumpAnimation, run::RunAnimation, swim::SwimAnimation};
|
pub use self::{
|
||||||
|
idle::IdleAnimation, jump::JumpAnimation, run::RunAnimation, swim::SwimAnimation,
|
||||||
|
swimidle::SwimIdleAnimation,
|
||||||
|
};
|
||||||
|
|
||||||
use super::{make_bone, vek::*, FigureBoneData, Skeleton};
|
use super::{make_bone, vek::*, FigureBoneData, Skeleton};
|
||||||
use common::comp::{self};
|
use common::comp::{self};
|
||||||
@ -13,7 +17,6 @@ use core::convert::TryFrom;
|
|||||||
pub type Body = comp::fish_small::Body;
|
pub type Body = comp::fish_small::Body;
|
||||||
|
|
||||||
skeleton_impls!(struct FishSmallSkeleton {
|
skeleton_impls!(struct FishSmallSkeleton {
|
||||||
+ head,
|
|
||||||
+ chest,
|
+ chest,
|
||||||
+ tail,
|
+ tail,
|
||||||
+ fin_l,
|
+ fin_l,
|
||||||
@ -24,7 +27,7 @@ impl Skeleton for FishSmallSkeleton {
|
|||||||
type Attr = SkeletonAttr;
|
type Attr = SkeletonAttr;
|
||||||
type Body = Body;
|
type Body = Body;
|
||||||
|
|
||||||
const BONE_COUNT: usize = 5;
|
const BONE_COUNT: usize = 4;
|
||||||
#[cfg(feature = "use-dyn-lib")]
|
#[cfg(feature = "use-dyn-lib")]
|
||||||
const COMPUTE_FN: &'static [u8] = b"fish_small_compute_mats\0";
|
const COMPUTE_FN: &'static [u8] = b"fish_small_compute_mats\0";
|
||||||
|
|
||||||
@ -37,7 +40,6 @@ impl Skeleton for FishSmallSkeleton {
|
|||||||
let chest_mat = base_mat * Mat4::<f32>::from(self.chest);
|
let chest_mat = base_mat * Mat4::<f32>::from(self.chest);
|
||||||
|
|
||||||
*(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [
|
*(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [
|
||||||
make_bone(chest_mat * Mat4::<f32>::from(self.head)),
|
|
||||||
make_bone(chest_mat),
|
make_bone(chest_mat),
|
||||||
make_bone(chest_mat * Mat4::<f32>::from(self.tail)),
|
make_bone(chest_mat * Mat4::<f32>::from(self.tail)),
|
||||||
make_bone(chest_mat * Mat4::<f32>::from(self.fin_l)),
|
make_bone(chest_mat * Mat4::<f32>::from(self.fin_l)),
|
||||||
@ -48,7 +50,6 @@ impl Skeleton for FishSmallSkeleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct SkeletonAttr {
|
pub struct SkeletonAttr {
|
||||||
head: (f32, f32),
|
|
||||||
chest: (f32, f32),
|
chest: (f32, f32),
|
||||||
tail: (f32, f32),
|
tail: (f32, f32),
|
||||||
fin: (f32, f32, f32),
|
fin: (f32, f32, f32),
|
||||||
@ -68,7 +69,6 @@ impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr {
|
|||||||
impl Default for SkeletonAttr {
|
impl Default for SkeletonAttr {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
head: (0.0, 0.0),
|
|
||||||
chest: (0.0, 0.0),
|
chest: (0.0, 0.0),
|
||||||
tail: (0.0, 0.0),
|
tail: (0.0, 0.0),
|
||||||
fin: (0.0, 0.0, 0.0),
|
fin: (0.0, 0.0, 0.0),
|
||||||
@ -80,17 +80,14 @@ impl<'a> From<&'a Body> for SkeletonAttr {
|
|||||||
fn from(body: &'a Body) -> Self {
|
fn from(body: &'a Body) -> Self {
|
||||||
use comp::fish_small::Species::*;
|
use comp::fish_small::Species::*;
|
||||||
Self {
|
Self {
|
||||||
head: match (body.species, body.body_type) {
|
|
||||||
(Sardine, _) => (1.5, 2.0),
|
|
||||||
},
|
|
||||||
chest: match (body.species, body.body_type) {
|
chest: match (body.species, body.body_type) {
|
||||||
(Sardine, _) => (0.0, 5.0),
|
(Clownfish, _) => (0.0, 5.0),
|
||||||
},
|
},
|
||||||
tail: match (body.species, body.body_type) {
|
tail: match (body.species, body.body_type) {
|
||||||
(Sardine, _) => (-6.0, 0.0),
|
(Clownfish, _) => (-7.5, -0.5),
|
||||||
},
|
},
|
||||||
fin: match (body.species, body.body_type) {
|
fin: match (body.species, body.body_type) {
|
||||||
(Sardine, _) => (3.5, 6.0, -1.0),
|
(Clownfish, _) => (2.0, 0.5, 1.0),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,10 +21,7 @@ impl Animation for RunAnimation {
|
|||||||
) -> Self::Skeleton {
|
) -> Self::Skeleton {
|
||||||
let mut next = (*skeleton).clone();
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
next.head.scale = Vec3::one() / 11.0;
|
next.chest.scale = Vec3::one() / 11.0;
|
||||||
|
|
||||||
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1);
|
|
||||||
next.head.orientation = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0);
|
|
||||||
|
|
||||||
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
||||||
next.chest.orientation = Quaternion::rotation_x(0.0);
|
next.chest.orientation = Quaternion::rotation_x(0.0);
|
||||||
|
@ -19,15 +19,13 @@ impl Animation for SwimAnimation {
|
|||||||
|
|
||||||
fn update_skeleton_inner(
|
fn update_skeleton_inner(
|
||||||
skeleton: &Self::Skeleton,
|
skeleton: &Self::Skeleton,
|
||||||
(velocity, orientation, last_ori, global_time, avg_vel): Self::Dependency,
|
(velocity, orientation, last_ori, _global_time, avg_vel): Self::Dependency,
|
||||||
anim_time: f64,
|
anim_time: f64,
|
||||||
rate: &mut f32,
|
_rate: &mut f32,
|
||||||
s_a: &SkeletonAttr,
|
s_a: &SkeletonAttr,
|
||||||
) -> Self::Skeleton {
|
) -> Self::Skeleton {
|
||||||
let mut next = (*skeleton).clone();
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
let slower = (anim_time as f32 * 1.0 + PI).sin();
|
|
||||||
let slow = (anim_time as f32 * 3.5 + PI).sin();
|
|
||||||
let slowalt = (anim_time as f32 * 3.5 + PI + 0.2).sin();
|
let slowalt = (anim_time as f32 * 3.5 + PI + 0.2).sin();
|
||||||
let fast = (anim_time as f32 * 5.5 + PI).sin();
|
let fast = (anim_time as f32 * 5.5 + PI).sin();
|
||||||
let fastalt = (anim_time as f32 * 5.5 + PI + 0.2).sin();
|
let fastalt = (anim_time as f32 * 5.5 + PI + 0.2).sin();
|
||||||
@ -48,8 +46,6 @@ impl Animation for SwimAnimation {
|
|||||||
let abstilt = tilt.abs();
|
let abstilt = tilt.abs();
|
||||||
let x_tilt = avg_vel.z.atan2(avg_vel.xy().magnitude());
|
let x_tilt = avg_vel.z.atan2(avg_vel.xy().magnitude());
|
||||||
|
|
||||||
let squash = if abstilt > 0.2 { 0.35 } else { 1.0 }; //condenses the body at strong turns
|
|
||||||
|
|
||||||
next.chest_front.scale = Vec3::one() / 11.0;
|
next.chest_front.scale = Vec3::one() / 11.0;
|
||||||
|
|
||||||
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1);
|
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1);
|
||||||
|
@ -2,7 +2,7 @@ use super::{
|
|||||||
super::{vek::*, Animation},
|
super::{vek::*, Animation},
|
||||||
FishMediumSkeleton, SkeletonAttr,
|
FishMediumSkeleton, SkeletonAttr,
|
||||||
};
|
};
|
||||||
use std::{f32::consts::PI, ops::Mul};
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
pub struct SwimIdleAnimation;
|
pub struct SwimIdleAnimation;
|
||||||
|
|
||||||
@ -19,14 +19,13 @@ impl Animation for SwimIdleAnimation {
|
|||||||
|
|
||||||
fn update_skeleton_inner(
|
fn update_skeleton_inner(
|
||||||
skeleton: &Self::Skeleton,
|
skeleton: &Self::Skeleton,
|
||||||
(velocity, orientation, last_ori, global_time, avg_vel): Self::Dependency,
|
(_velocity, _orientation, _last_ori, _global_time, _avg_vel): Self::Dependency,
|
||||||
anim_time: f64,
|
anim_time: f64,
|
||||||
rate: &mut f32,
|
_rate: &mut f32,
|
||||||
s_a: &SkeletonAttr,
|
s_a: &SkeletonAttr,
|
||||||
) -> Self::Skeleton {
|
) -> Self::Skeleton {
|
||||||
let mut next = (*skeleton).clone();
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
let slower = (anim_time as f32 * 1.0 + PI).sin();
|
|
||||||
let slow = (anim_time as f32 * 3.5 + PI).sin();
|
let slow = (anim_time as f32 * 3.5 + PI).sin();
|
||||||
let slowalt = (anim_time as f32 * 3.5 + PI + 0.2).sin();
|
let slowalt = (anim_time as f32 * 3.5 + PI + 0.2).sin();
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ use super::{
|
|||||||
super::{vek::*, Animation},
|
super::{vek::*, Animation},
|
||||||
FishSmallSkeleton, SkeletonAttr,
|
FishSmallSkeleton, SkeletonAttr,
|
||||||
};
|
};
|
||||||
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
pub struct SwimAnimation;
|
pub struct SwimAnimation;
|
||||||
|
|
||||||
@ -18,29 +19,45 @@ impl Animation for SwimAnimation {
|
|||||||
|
|
||||||
fn update_skeleton_inner(
|
fn update_skeleton_inner(
|
||||||
skeleton: &Self::Skeleton,
|
skeleton: &Self::Skeleton,
|
||||||
(velocity, orientation, last_ori, global_time, avg_vel): Self::Dependency,
|
(velocity, orientation, last_ori, _global_time, avg_vel): Self::Dependency,
|
||||||
_anim_time: f64,
|
anim_time: f64,
|
||||||
_rate: &mut f32,
|
_rate: &mut f32,
|
||||||
s_a: &SkeletonAttr,
|
s_a: &SkeletonAttr,
|
||||||
) -> Self::Skeleton {
|
) -> Self::Skeleton {
|
||||||
let mut next = (*skeleton).clone();
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
next.head.scale = Vec3::one() / 11.0;
|
let fast = (anim_time as f32 * 7.0 + PI).sin();
|
||||||
|
|
||||||
next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1);
|
let ori: Vec2<f32> = Vec2::from(orientation);
|
||||||
next.head.orientation = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0);
|
let last_ori = Vec2::from(last_ori);
|
||||||
|
let tilt = if ::vek::Vec2::new(ori, last_ori)
|
||||||
|
.map(|o| o.magnitude_squared())
|
||||||
|
.map(|m| m > 0.001 && m.is_finite())
|
||||||
|
.reduce_and()
|
||||||
|
&& ori.angle_between(last_ori).is_finite()
|
||||||
|
{
|
||||||
|
ori.angle_between(last_ori).min(0.8)
|
||||||
|
* last_ori.determine_side(Vec2::zero(), ori).signum()
|
||||||
|
} else {
|
||||||
|
0.0
|
||||||
|
} * 1.3;
|
||||||
|
let abstilt = tilt.abs();
|
||||||
|
let x_tilt = avg_vel.z.atan2(avg_vel.xy().magnitude());
|
||||||
|
|
||||||
|
next.chest.scale = Vec3::one() / 11.0;
|
||||||
|
|
||||||
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
||||||
next.chest.orientation = Quaternion::rotation_x(0.0);
|
next.chest.orientation = Quaternion::rotation_z(fast * -0.1)
|
||||||
|
+ Quaternion::rotation_x(velocity.z.abs() * -0.005 + abstilt * 1.0 + x_tilt);
|
||||||
|
|
||||||
next.tail.position = Vec3::new(0.0, s_a.tail.0, s_a.tail.1);
|
next.tail.position = Vec3::new(0.0, s_a.tail.0, s_a.tail.1);
|
||||||
next.tail.orientation = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0);
|
next.tail.orientation = Quaternion::rotation_z(fast * 0.3 + tilt * 2.0);
|
||||||
|
|
||||||
next.fin_l.position = Vec3::new(-s_a.fin.0, s_a.fin.1, s_a.fin.2);
|
next.fin_l.position = Vec3::new(-s_a.fin.0, s_a.fin.1, s_a.fin.2);
|
||||||
next.fin_l.orientation = Quaternion::rotation_y(0.0);
|
next.fin_l.orientation = Quaternion::rotation_z(fast * 0.3 - 0.3 + tilt * -0.5);
|
||||||
|
|
||||||
next.fin_r.position = Vec3::new(s_a.fin.0, s_a.fin.1, s_a.fin.2);
|
next.fin_r.position = Vec3::new(s_a.fin.0, s_a.fin.1, s_a.fin.2);
|
||||||
next.fin_r.orientation = Quaternion::rotation_y(0.0);
|
next.fin_r.orientation = Quaternion::rotation_z(-fast * 0.3 + 0.3 + tilt * -0.5);
|
||||||
next
|
next
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
46
voxygen/src/anim/src/fish_small/swimidle.rs
Normal file
46
voxygen/src/anim/src/fish_small/swimidle.rs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
use super::{
|
||||||
|
super::{vek::*, Animation},
|
||||||
|
FishSmallSkeleton, SkeletonAttr,
|
||||||
|
};
|
||||||
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
|
pub struct SwimIdleAnimation;
|
||||||
|
|
||||||
|
type SwimIdleAnimationDependency = (Vec3<f32>, Vec3<f32>, Vec3<f32>, f64, Vec3<f32>);
|
||||||
|
|
||||||
|
impl Animation for SwimIdleAnimation {
|
||||||
|
type Dependency = SwimIdleAnimationDependency;
|
||||||
|
type Skeleton = FishSmallSkeleton;
|
||||||
|
|
||||||
|
#[cfg(feature = "use-dyn-lib")]
|
||||||
|
const UPDATE_FN: &'static [u8] = b"fish_small_swimidle\0";
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "be-dyn-lib", export_name = "fish_small_swimidle")]
|
||||||
|
|
||||||
|
fn update_skeleton_inner(
|
||||||
|
skeleton: &Self::Skeleton,
|
||||||
|
(_velocity, _orientation, _last_ori, _global_time, _avg_vel): Self::Dependency,
|
||||||
|
anim_time: f64,
|
||||||
|
_rate: &mut f32,
|
||||||
|
s_a: &SkeletonAttr,
|
||||||
|
) -> Self::Skeleton {
|
||||||
|
let mut next = (*skeleton).clone();
|
||||||
|
|
||||||
|
let slow = (anim_time as f32 * 3.5 + PI).sin();
|
||||||
|
|
||||||
|
next.chest.scale = Vec3::one() / 11.0;
|
||||||
|
|
||||||
|
next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1) / 11.0;
|
||||||
|
next.chest.orientation = Quaternion::rotation_x(0.0);
|
||||||
|
|
||||||
|
next.tail.position = Vec3::new(0.0, s_a.tail.0, s_a.tail.1);
|
||||||
|
next.tail.orientation = Quaternion::rotation_z(slow * 0.1);
|
||||||
|
|
||||||
|
next.fin_l.position = Vec3::new(-s_a.fin.0, s_a.fin.1, s_a.fin.2);
|
||||||
|
next.fin_l.orientation = Quaternion::rotation_z(slow * 0.1 - 0.1);
|
||||||
|
|
||||||
|
next.fin_r.position = Vec3::new(s_a.fin.0, s_a.fin.1, s_a.fin.2);
|
||||||
|
next.fin_r.orientation = Quaternion::rotation_z(-slow * 0.1 + 0.1);
|
||||||
|
next
|
||||||
|
}
|
||||||
|
}
|
@ -2287,7 +2287,6 @@ struct FishSmallCentralSpec(HashMap<(FSSpecies, FSBodyType), SidedFSCentralVoxSp
|
|||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct SidedFSCentralVoxSpec {
|
struct SidedFSCentralVoxSpec {
|
||||||
head: FishSmallCentralSubSpec,
|
|
||||||
chest: FishSmallCentralSubSpec,
|
chest: FishSmallCentralSubSpec,
|
||||||
tail: FishSmallCentralSubSpec,
|
tail: FishSmallCentralSubSpec,
|
||||||
}
|
}
|
||||||
@ -2317,10 +2316,6 @@ make_vox_spec!(
|
|||||||
},
|
},
|
||||||
|FigureKey { body, .. }, spec| {
|
|FigureKey { body, .. }, spec| {
|
||||||
[
|
[
|
||||||
Some(spec.central.asset.mesh_head(
|
|
||||||
body.species,
|
|
||||||
body.body_type,
|
|
||||||
)),
|
|
||||||
Some(spec.central.asset.mesh_chest(
|
Some(spec.central.asset.mesh_chest(
|
||||||
body.species,
|
body.species,
|
||||||
body.body_type,
|
body.body_type,
|
||||||
@ -2348,27 +2343,12 @@ make_vox_spec!(
|
|||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
|
None,
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
impl FishSmallCentralSpec {
|
impl FishSmallCentralSpec {
|
||||||
fn mesh_head(&self, species: FSSpecies, body_type: FSBodyType) -> BoneMeshes {
|
|
||||||
let spec = match self.0.get(&(species, body_type)) {
|
|
||||||
Some(spec) => spec,
|
|
||||||
None => {
|
|
||||||
error!(
|
|
||||||
"No head specification exists for the combination of {:?} and {:?}",
|
|
||||||
species, body_type
|
|
||||||
);
|
|
||||||
return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5));
|
|
||||||
},
|
|
||||||
};
|
|
||||||
let central = graceful_load_segment(&spec.head.central.0);
|
|
||||||
|
|
||||||
(central, Vec3::from(spec.head.offset))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn mesh_chest(&self, species: FSSpecies, body_type: FSBodyType) -> BoneMeshes {
|
fn mesh_chest(&self, species: FSSpecies, body_type: FSBodyType) -> BoneMeshes {
|
||||||
let spec = match self.0.get(&(species, body_type)) {
|
let spec = match self.0.get(&(species, body_type)) {
|
||||||
Some(spec) => spec,
|
Some(spec) => spec,
|
||||||
|
@ -2605,8 +2605,16 @@ impl FigureMgr {
|
|||||||
&mut state_animation_rate,
|
&mut state_animation_rate,
|
||||||
skeleton_attr,
|
skeleton_attr,
|
||||||
),
|
),
|
||||||
|
// Idle Water
|
||||||
|
(_, false, true) => anim::fish_small::SwimIdleAnimation::update_skeleton(
|
||||||
|
&FishSmallSkeleton::default(),
|
||||||
|
(vel.0, ori, state.last_ori, time, state.avg_vel),
|
||||||
|
state.state_time,
|
||||||
|
&mut state_animation_rate,
|
||||||
|
skeleton_attr,
|
||||||
|
),
|
||||||
// Swim
|
// Swim
|
||||||
(_, _, true) => anim::fish_small::SwimAnimation::update_skeleton(
|
(_, true, true) => anim::fish_small::SwimAnimation::update_skeleton(
|
||||||
&FishSmallSkeleton::default(),
|
&FishSmallSkeleton::default(),
|
||||||
(vel.0, ori, state.last_ori, time, state.avg_vel),
|
(vel.0, ori, state.last_ori, time, state.avg_vel),
|
||||||
state.state_time,
|
state.state_time,
|
||||||
|
Loading…
Reference in New Issue
Block a user