New dragon model, added jaw, splitted head into upper/lower

This commit is contained in:
Snowram 2020-05-06 02:04:56 +02:00 committed by jshipsey
parent 875838ecdf
commit cd452cc715
66 changed files with 375 additions and 116 deletions

View File

@ -1,45 +1,61 @@
({ ({
(Reddragon, Male): ( (Reddragon, Male): (
head: ( upper: (
offset: (-4.5, -2.0, -7.5), offset: (-6.5, -2.0, -6.0),
center: ("npc.reddragon.male.head"), center: ("npc.reddragon.male.head_upper"),
),
lower: (
offset: (-2.5, -2.0, -5.0),
center: ("npc.reddragon.male.head_lower"),
),
jaw: (
offset: (-3.5, -2.0, -1.5),
center: ("npc.reddragon.male.jaw"),
), ),
chest_front: ( chest_front: (
offset: (-6.5, -6.0, -6.0), offset: (-6.5, -6.0, -7.5),
center: ("npc.reddragon.male.chest_front"), center: ("npc.reddragon.male.chest_front"),
), ),
chest_rear: ( chest_rear: (
offset: (-6.5, -7.0, -6.0), offset: (-6.5, -7.0, -7.0),
center: ("npc.reddragon.male.chest_rear"), center: ("npc.reddragon.male.chest_rear"),
), ),
tail_front: ( tail_front: (
offset: (-2.5, -5.5, -3.0), offset: (-2.5, -6.0, -3.5),
center: ("npc.reddragon.male.tail_front"), center: ("npc.reddragon.male.tail_front"),
), ),
tail_rear: ( tail_rear: (
offset: (-1.5, -7.0, -2.5), offset: (-3.5, -8.0, -3.0),
center: ("npc.reddragon.male.tail_rear"), center: ("npc.reddragon.male.tail_rear"),
) )
), ),
(Reddragon, Female): ( (Reddragon, Female): (
head: ( upper: (
offset: (-4.5, -2.0, -7.5), offset: (-6.5, -2.0, -6.0),
center: ("npc.reddragon.female.head"), center: ("npc.reddragon.female.head_upper"),
),
lower: (
offset: (-2.5, -2.0, -5.0),
center: ("npc.reddragon.female.head_lower"),
),
jaw: (
offset: (-3.5, -2.0, -1.5),
center: ("npc.reddragon.female.jaw"),
), ),
chest_front: ( chest_front: (
offset: (-6.5, -6.0, -6.0), offset: (-6.5, -6.0, -7.5),
center: ("npc.reddragon.female.chest_front"), center: ("npc.reddragon.female.chest_front"),
), ),
chest_rear: ( chest_rear: (
offset: (-6.5, -7.0, -6.0), offset: (-6.5, -7.0, -7.0),
center: ("npc.reddragon.female.chest_rear"), center: ("npc.reddragon.female.chest_rear"),
), ),
tail_front: ( tail_front: (
offset: (-2.5, -5.5, -3.0), offset: (-2.5, -6.0, -3.5),
center: ("npc.reddragon.female.tail_front"), center: ("npc.reddragon.female.tail_front"),
), ),
tail_rear: ( tail_rear: (
offset: (-1.5, -7.0, -2.5), offset: (-3.5, -8.0, -3.0),
center: ("npc.reddragon.female.tail_rear"), center: ("npc.reddragon.female.tail_rear"),
) )
), ),

View File

@ -1,69 +1,69 @@
({ ({
(Reddragon, Male): ( (Reddragon, Male): (
wing_in_l: ( wing_in_l: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -44.0),
lateral: ("npc.reddragon.male.wing_in_l"), lateral: ("npc.reddragon.male.wing_in_l"),
), ),
wing_in_r: ( wing_in_r: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -44.0),
lateral: ("npc.reddragon.male.wing_in_r"), lateral: ("npc.reddragon.male.wing_in_r"),
), ),
wing_out_l: ( wing_out_l: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -38.0),
lateral: ("npc.reddragon.male.wing_out_l"), lateral: ("npc.reddragon.male.wing_out_l"),
), ),
wing_out_r: ( wing_out_r: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -38.0),
lateral: ("npc.reddragon.male.wing_out_r"), lateral: ("npc.reddragon.male.wing_out_r"),
), ),
foot_fl: ( foot_fl: (
offset: (-2.5, -4.0, -1.5), offset: (-6.5, -4.0, -1.5),
lateral: ("npc.reddragon.male.foot_fl"), lateral: ("npc.reddragon.male.foot_fl"),
), ),
foot_fr: ( foot_fr: (
offset: (-2.5, -4.0, -1.5), offset: (-6.5, -4.0, -1.5),
lateral: ("npc.reddragon.male.foot_fr"), lateral: ("npc.reddragon.male.foot_fr"),
), ),
foot_bl: ( foot_bl: (
offset: (-2.5, -4.0, -3.0), offset: (-6.5, -4.0, -3.0),
lateral: ("npc.reddragon.male.foot_bl"), lateral: ("npc.reddragon.male.foot_bl"),
), ),
foot_br: ( foot_br: (
offset: (-2.5, -4.0, -3.0), offset: (-6.5, -4.0, -3.0),
lateral: ("npc.reddragon.male.foot_br"), lateral: ("npc.reddragon.male.foot_br"),
) )
), ),
(Reddragon, Female): ( (Reddragon, Female): (
wing_in_l: ( wing_in_l: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -44.0),
lateral: ("npc.reddragon.female.wing_in_l"), lateral: ("npc.reddragon.female.wing_in_l"),
), ),
wing_in_r: ( wing_in_r: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -44.0),
lateral: ("npc.reddragon.female.wing_in_r"), lateral: ("npc.reddragon.female.wing_in_r"),
), ),
wing_out_l: ( wing_out_l: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -38.0),
lateral: ("npc.reddragon.female.wing_out_l"), lateral: ("npc.reddragon.female.wing_out_l"),
), ),
wing_out_r: ( wing_out_r: (
offset: (-0.5, -3.5, -27.0), offset: (-0.5, -3.5, -38.0),
lateral: ("npc.reddragon.female.wing_out_r"), lateral: ("npc.reddragon.female.wing_out_r"),
), ),
foot_fl: ( foot_fl: (
offset: (-2.5, -4.0, -1.5), offset: (-6.5, -4.0, -1.5),
lateral: ("npc.reddragon.female.foot_fl"), lateral: ("npc.reddragon.female.foot_fl"),
), ),
foot_fr: ( foot_fr: (
offset: (-2.5, -4.0, -1.5), offset: (-6.5, -4.0, -1.5),
lateral: ("npc.reddragon.female.foot_fr"), lateral: ("npc.reddragon.female.foot_fr"),
), ),
foot_bl: ( foot_bl: (
offset: (-2.5, -4.0, -3.0), offset: (-6.5, -4.0, -3.0),
lateral: ("npc.reddragon.female.foot_bl"), lateral: ("npc.reddragon.female.foot_bl"),
), ),
foot_br: ( foot_br: (
offset: (-2.5, -4.0, -3.0), offset: (-6.5, -4.0, -3.0),
lateral: ("npc.reddragon.female.foot_br"), lateral: ("npc.reddragon.female.foot_br"),
) )
), ),

BIN
assets/voxygen/voxel/npc/reddragon/female/6-tail_rear.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/head_lower.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/head_upper.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/jaw.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/chest_rear.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/foot_bl.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/foot_br.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/foot_fl.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/foot_fr.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/tail_front.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/tail_rear.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/wing_in_l.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/wing_in_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/wing_out_l.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/female/old/wing_out_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/head_lower.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/head_upper.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/jaw.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/chest_front.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/chest_rear.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/foot_bl.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/foot_br.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/foot_fl.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/foot_fr.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/tail_front.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/tail_rear.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/wing_in_l.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/wing_in_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/wing_out_l.vox (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/voxel/npc/reddragon/male/old/wing_out_r.vox (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -17,6 +17,11 @@ impl Animation for FlyAnimation {
) -> Self::Skeleton { ) -> Self::Skeleton {
let mut next = (*skeleton).clone(); let mut next = (*skeleton).clone();
let wave_ultra_slow = (anim_time as f32 * 1.0 + PI).sin();
let wave_ultra_slow_cos = (anim_time as f32 * 3.0 + PI).cos();
let wave_slow = (anim_time as f32 * 4.5).sin();
let wave_slow_cos = (anim_time as f32 * 4.5).cos();
let lab = 12.0; //14.0 let lab = 12.0; //14.0
let footl = (anim_time as f32 * lab as f32 + PI).sin(); let footl = (anim_time as f32 * lab as f32 + PI).sin();

View File

@ -19,6 +19,11 @@ impl Animation for FlyAnimation {
let lab = 12.0; let lab = 12.0;
let wave_ultra_slow = (anim_time as f32 * 1.0 + PI).sin();
let wave_ultra_slow_cos = (anim_time as f32 * 3.0 + PI).cos();
let wave_slow = (anim_time as f32 * 4.5).sin();
let wave_slow_cos = (anim_time as f32 * 4.5).cos();
let vertlf = (anim_time as f32 * lab as f32 + PI * 1.8).sin().max(0.15); let vertlf = (anim_time as f32 * lab as f32 + PI * 1.8).sin().max(0.15);
let vertrfoffset = (anim_time as f32 * lab as f32 + PI * 0.80).sin().max(0.15); let vertrfoffset = (anim_time as f32 * lab as f32 + PI * 0.80).sin().max(0.15);
let vertlboffset = (anim_time as f32 * lab as f32).sin().max(0.15); let vertlboffset = (anim_time as f32 * lab as f32).sin().max(0.15);
@ -52,13 +57,27 @@ impl Animation for FlyAnimation {
* 0.125, * 0.125,
); );
next.head.offset = Vec3::new( let wave = (anim_time as f32 * 14.0).sin();
let wave_slow = (anim_time as f32 * 3.5 + PI).sin();
let wave_stop = (anim_time as f32 * 5.0).min(PI / 2.0).sin();
next.head_upper.offset = Vec3::new(0.0, 7.5, 15.0 + wave_stop * 4.8) * 1.05;
next.head_upper.ori =
Quaternion::rotation_z(0.0) * Quaternion::rotation_x(wave_slow * -0.25);
next.head_upper.scale = Vec3::one() * 1.05;
next.head_lower.offset = Vec3::new(0.0, 7.5, 15.0 + wave_stop * 4.8) * 1.05;
next.head_lower.ori =
Quaternion::rotation_z(0.0) * Quaternion::rotation_x(wave_slow * -0.25);
next.head_lower.scale = Vec3::one() * 1.05;
next.jaw.offset = Vec3::new(
0.0, 0.0,
skeleton_attr.head.0 + 0.5, skeleton_attr.jaw.0 - wave_ultra_slow_cos * 0.12,
skeleton_attr.head.1 + center * 0.5 - 1.0, skeleton_attr.jaw.1 + wave_slow * 0.2,
); );
next.head.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0 + center * 0.03); next.jaw.ori = Quaternion::rotation_x(wave_slow * 0.05);
next.head.scale = Vec3::one(); next.jaw.scale = Vec3::one() * 0.98;
next.tail_front.offset = Vec3::new( next.tail_front.offset = Vec3::new(
0.0, 0.0,

View File

@ -1,5 +1,5 @@
use super::{super::Animation, DragonSkeleton, SkeletonAttr}; use super::{super::Animation, DragonSkeleton, SkeletonAttr};
use std::ops::Mul; use std::{f32::consts::PI, ops::Mul};
use vek::*; use vek::*;
pub struct IdleAnimation; pub struct IdleAnimation;
@ -17,10 +17,12 @@ impl Animation for IdleAnimation {
) -> Self::Skeleton { ) -> Self::Skeleton {
let mut next = (*skeleton).clone(); let mut next = (*skeleton).clone();
let wave_ultra_slow = (anim_time as f32 * 1.0 + PI).sin();
let wave_ultra_slow_cos = (anim_time as f32 * 3.0 + PI).cos();
let wave_slow = (anim_time as f32 * 4.5).sin(); let wave_slow = (anim_time as f32 * 4.5).sin();
let wave_slow_cos = (anim_time as f32 * 4.5).cos(); let wave_slow_cos = (anim_time as f32 * 4.5).cos();
let duck_head_look = Vec2::new( let look = Vec2::new(
((global_time + anim_time) as f32 / 8.0) ((global_time + anim_time) as f32 / 8.0)
.floor() .floor()
.mul(7331.0) .mul(7331.0)
@ -33,10 +35,31 @@ impl Animation for IdleAnimation {
* 0.25, * 0.25,
); );
next.head.offset = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1); next.head_upper.offset = Vec3::new(
next.head.ori = Quaternion::rotation_z(duck_head_look.x) 0.0,
* Quaternion::rotation_x(-duck_head_look.y.abs() + wave_slow_cos * 0.03); skeleton_attr.head_upper.0,
next.head.scale = Vec3::one(); skeleton_attr.head_upper.1 + wave_ultra_slow * 0.4,
) * 1.05;
next.head_upper.ori =
Quaternion::rotation_z(0.8 * look.x) * Quaternion::rotation_x(0.8 * look.y);
next.head_upper.scale = Vec3::one() * 1.05;
next.head_lower.offset = Vec3::new(
0.0,
skeleton_attr.head_lower.0,
skeleton_attr.head_lower.1 + wave_ultra_slow * 0.20,
);
next.head_lower.ori =
Quaternion::rotation_z(-0.4 * look.x) * Quaternion::rotation_x(-0.4 * look.y);
next.head_lower.scale = Vec3::one() * 1.05;
next.jaw.offset = Vec3::new(
0.0,
skeleton_attr.jaw.0 - wave_ultra_slow_cos * 0.12,
skeleton_attr.jaw.1 + wave_slow * 0.2,
);
next.jaw.ori = Quaternion::rotation_x(wave_slow * 0.05);
next.jaw.scale = Vec3::one() * 0.98;
next.chest_front.offset = Vec3::new( next.chest_front.offset = Vec3::new(
0.0, 0.0,

View File

@ -11,9 +11,17 @@ use common::comp::{self};
use vek::Vec3; use vek::Vec3;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const HEAD_X: f32 = 4.0; const HEAD_UPPER_X: f32 = 11.5;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const HEAD_Z: f32 = 11.0; const HEAD_UPPER_Z: f32 = 18.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const HEAD_LOWER_X: f32 = -4.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const HEAD_LOWER_Z: f32 = -2.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const JAW_X: f32 = 7.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const JAW_Z: f32 = -5.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const CHEST_F_X: f32 = 0.0; const CHEST_F_X: f32 = 0.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
@ -23,11 +31,11 @@ const CHEST_R_X: f32 = -13.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const CHEST_R_Z: f32 = 0.0; const CHEST_R_Z: f32 = 0.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const TAIL_F_X: f32 = -11.5; const TAIL_F_X: f32 = -13.5;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const TAIL_F_Z: f32 = 16.5; const TAIL_F_Z: f32 = 16.5;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const TAIL_R_X: f32 = -25.5; const TAIL_R_X: f32 = -28.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
const TAIL_R_Z: f32 = 0.0; const TAIL_R_Z: f32 = 0.0;
#[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)] #[const_tweaker::tweak(min = -40.0, max = 40.0, step = 0.5)]
@ -57,7 +65,9 @@ const FEET_B_Z: f32 = 3.0;
#[derive(Clone, Default)] #[derive(Clone, Default)]
pub struct DragonSkeleton { pub struct DragonSkeleton {
head: Bone, head_upper: Bone,
head_lower: Bone,
jaw: Bone,
chest_front: Bone, chest_front: Bone,
chest_rear: Bone, chest_rear: Bone,
tail_front: Bone, tail_front: Bone,
@ -81,7 +91,13 @@ impl Skeleton for DragonSkeleton {
fn bone_count(&self) -> usize { 13 } fn bone_count(&self) -> usize { 13 }
<<<<<<< HEAD
fn compute_matrices(&self) -> ([FigureBoneData; 16], Vec3<f32>) { fn compute_matrices(&self) -> ([FigureBoneData; 16], Vec3<f32>) {
=======
fn compute_matrices(&self) -> [FigureBoneData; 16] {
let head_upper_mat = self.head_upper.compute_base_matrix();
let head_lower_mat = self.head_lower.compute_base_matrix();
>>>>>>> New dragon model, added jaw, splitted head into upper/lower
let chest_front_mat = self.chest_front.compute_base_matrix(); let chest_front_mat = self.chest_front.compute_base_matrix();
let chest_rear_mat = self.chest_rear.compute_base_matrix(); let chest_rear_mat = self.chest_rear.compute_base_matrix();
let wing_in_l_mat = self.wing_in_l.compute_base_matrix(); let wing_in_l_mat = self.wing_in_l.compute_base_matrix();
@ -112,7 +128,9 @@ impl Skeleton for DragonSkeleton {
) )
======= =======
[ [
FigureBoneData::new(self.head.compute_base_matrix() * chest_front_mat), FigureBoneData::new(head_upper_mat),
FigureBoneData::new(head_upper_mat * head_lower_mat),
FigureBoneData::new(head_upper_mat * self.jaw.compute_base_matrix()),
FigureBoneData::new(chest_front_mat), FigureBoneData::new(chest_front_mat),
FigureBoneData::new(self.chest_rear.compute_base_matrix() * chest_front_mat), FigureBoneData::new(self.chest_rear.compute_base_matrix() * chest_front_mat),
FigureBoneData::new(chest_rear_mat * self.tail_front.compute_base_matrix()), FigureBoneData::new(chest_rear_mat * self.tail_front.compute_base_matrix()),
@ -126,14 +144,14 @@ impl Skeleton for DragonSkeleton {
FigureBoneData::new(self.foot_bl.compute_base_matrix()), FigureBoneData::new(self.foot_bl.compute_base_matrix()),
FigureBoneData::new(self.foot_br.compute_base_matrix()), FigureBoneData::new(self.foot_br.compute_base_matrix()),
FigureBoneData::default(), FigureBoneData::default(),
FigureBoneData::default(),
FigureBoneData::default(),
] ]
>>>>>>> Symmetry of dragon skeleton >>>>>>> Symmetry of dragon skeleton
} }
fn interpolate(&mut self, target: &Self, dt: f32) { fn interpolate(&mut self, target: &Self, dt: f32) {
self.head.interpolate(&target.head, dt); self.head_upper.interpolate(&target.head_upper, dt);
self.head_lower.interpolate(&target.head_lower, dt);
self.jaw.interpolate(&target.jaw, dt);
self.chest_front.interpolate(&target.chest_front, dt); self.chest_front.interpolate(&target.chest_front, dt);
self.chest_rear.interpolate(&target.chest_rear, dt); self.chest_rear.interpolate(&target.chest_rear, dt);
self.tail_front.interpolate(&target.tail_front, dt); self.tail_front.interpolate(&target.tail_front, dt);
@ -150,7 +168,9 @@ impl Skeleton for DragonSkeleton {
} }
pub struct SkeletonAttr { pub struct SkeletonAttr {
head: (f32, f32), head_upper: (f32, f32),
head_lower: (f32, f32),
jaw: (f32, f32),
chest_front: (f32, f32), chest_front: (f32, f32),
chest_rear: (f32, f32), chest_rear: (f32, f32),
tail_front: (f32, f32), tail_front: (f32, f32),
@ -176,7 +196,9 @@ 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), head_upper: (0.0, 0.0),
head_lower: (0.0, 0.0),
jaw: (0.0, 0.0),
chest_front: (0.0, 0.0), chest_front: (0.0, 0.0),
chest_rear: (0.0, 0.0), chest_rear: (0.0, 0.0),
tail_front: (0.0, 0.0), tail_front: (0.0, 0.0),
@ -194,8 +216,14 @@ impl<'a> From<&'a comp::dragon::Body> for SkeletonAttr {
fn from(body: &'a comp::dragon::Body) -> Self { fn from(body: &'a comp::dragon::Body) -> Self {
use comp::dragon::Species::*; use comp::dragon::Species::*;
Self { Self {
head: match (body.species, body.body_type) { head_upper: match (body.species, body.body_type) {
(Reddragon, _) => (*HEAD_X, *HEAD_Z), (Reddragon, _) => (*HEAD_UPPER_X, *HEAD_UPPER_Z),
},
head_lower: match (body.species, body.body_type) {
(Reddragon, _) => (*HEAD_LOWER_X, *HEAD_LOWER_Z),
},
jaw: match (body.species, body.body_type) {
(Reddragon, _) => (*JAW_X, *JAW_Z),
}, },
chest_front: match (body.species, body.body_type) { chest_front: match (body.species, body.body_type) {
(Reddragon, _) => (*CHEST_F_X, *CHEST_F_Z), (Reddragon, _) => (*CHEST_F_X, *CHEST_F_Z),

View File

@ -18,6 +18,12 @@ impl Animation for RunAnimation {
let mut next = (*skeleton).clone(); let mut next = (*skeleton).clone();
let lab = 14; let lab = 14;
let wave_ultra_slow = (anim_time as f32 * 1.0 + PI).sin();
let wave_ultra_slow_cos = (anim_time as f32 * 3.0 + PI).cos();
let wave_slow = (anim_time as f32 * 4.5).sin();
let wave_slow_cos = (anim_time as f32 * 4.5).cos();
let vertlf = (anim_time as f32 * lab as f32 + PI * 1.8).sin().max(0.15); let vertlf = (anim_time as f32 * lab as f32 + PI * 1.8).sin().max(0.15);
let vertrfoffset = (anim_time as f32 * lab as f32 + PI * 0.80).sin().max(0.15); let vertrfoffset = (anim_time as f32 * lab as f32 + PI * 0.80).sin().max(0.15);
let vertlboffset = (anim_time as f32 * lab as f32).sin().max(0.15); let vertlboffset = (anim_time as f32 * lab as f32).sin().max(0.15);
@ -51,14 +57,31 @@ impl Animation for RunAnimation {
* 0.125, * 0.125,
); );
next.head.offset = Vec3::new( next.head_upper.offset = Vec3::new(
0.0, 0.0,
skeleton_attr.head.0 + horichest * 0.9, skeleton_attr.head_upper.0 + horichest * 1.8,
skeleton_attr.head.1 + verthead * -0.9, skeleton_attr.head_upper.1 + verthead * -1.8,
) * 1.05; ) * 1.05;
next.head.ori = next.head_upper.ori =
Quaternion::rotation_x(wolf_look.y) * Quaternion::rotation_z(wolf_look.x); Quaternion::rotation_x(wolf_look.y) * Quaternion::rotation_z(wolf_look.x);
next.head.scale = Vec3::one() * 1.05; next.head_upper.scale = Vec3::one() * 1.05;
next.head_lower.offset = Vec3::new(
0.0,
skeleton_attr.head_lower.0 + horichest * 1.8,
skeleton_attr.head_lower.1 + verthead * -1.8,
) * 1.05;
next.head_lower.ori =
Quaternion::rotation_x(wolf_look.y) * Quaternion::rotation_z(wolf_look.x);
next.head_lower.scale = Vec3::one() * 1.05;
next.jaw.offset = Vec3::new(
0.0,
skeleton_attr.jaw.0 - wave_ultra_slow_cos * 0.12,
skeleton_attr.jaw.1 + wave_slow * 0.2,
);
next.jaw.ori = Quaternion::rotation_x(wave_slow * 0.05);
next.jaw.scale = Vec3::one() * 0.98;
next.tail_front.offset = Vec3::new( next.tail_front.offset = Vec3::new(
0.0, 0.0,

View File

@ -417,7 +417,17 @@ impl<Skel: Skeleton> FigureModelCache<Skel> {
DragonLateralSpec::load_watched(manifest_indicator); DragonLateralSpec::load_watched(manifest_indicator);
[ [
Some(dragon_center_spec.mesh_head( Some(dragon_center_spec.mesh_head_upper(
body.species,
body.body_type,
generate_mesh,
)),
Some(dragon_center_spec.mesh_head_lower(
body.species,
body.body_type,
generate_mesh,
)),
Some(dragon_center_spec.mesh_jaw(
body.species, body.species,
body.body_type, body.body_type,
generate_mesh, generate_mesh,
@ -483,8 +493,6 @@ impl<Skel: Skeleton> FigureModelCache<Skel> {
generate_mesh, generate_mesh,
)), )),
None, None,
None,
None,
] ]
}, },
Body::BirdSmall(body) => [ Body::BirdSmall(body) => [

View File

@ -1873,7 +1873,9 @@ pub struct DragonCenterSpec(HashMap<(DSpecies, DBodyType), SidedDCenterVoxSpec>)
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct SidedDCenterVoxSpec { struct SidedDCenterVoxSpec {
head: DragonCenterSubSpec, upper: DragonCenterSubSpec,
lower: DragonCenterSubSpec,
jaw: DragonCenterSubSpec,
chest_front: DragonCenterSubSpec, chest_front: DragonCenterSubSpec,
chest_rear: DragonCenterSubSpec, chest_rear: DragonCenterSubSpec,
tail_front: DragonCenterSubSpec, tail_front: DragonCenterSubSpec,
@ -1927,7 +1929,7 @@ impl DragonCenterSpec {
.unwrap() .unwrap()
} }
pub fn mesh_head( pub fn mesh_head_upper(
&self, &self,
species: DSpecies, species: DSpecies,
body_type: DBodyType, body_type: DBodyType,
@ -1937,15 +1939,57 @@ impl DragonCenterSpec {
Some(spec) => spec, Some(spec) => spec,
None => { None => {
error!( error!(
"No head specification exists for the combination of {:?} and {:?}", "No upper head specification exists for the combination of {:?} and {:?}",
species, body_type species, body_type
); );
return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh);
}, },
}; };
let center = graceful_load_segment(&spec.head.center.0); let central = graceful_load_segment(&spec.upper.center.0);
generate_mesh(&center, Vec3::from(spec.head.offset)) generate_mesh(&central, Vec3::from(spec.upper.offset))
}
pub fn mesh_head_lower(
&self,
species: DSpecies,
body_type: DBodyType,
generate_mesh: impl FnOnce(&Segment, Vec3<f32>) -> Mesh<FigurePipeline>,
) -> Mesh<FigurePipeline> {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No lower head specification exists for the combination of {:?} and {:?}",
species, body_type
);
return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh);
},
};
let central = graceful_load_segment(&spec.lower.center.0);
generate_mesh(&central, Vec3::from(spec.lower.offset))
}
pub fn mesh_jaw(
&self,
species: DSpecies,
body_type: DBodyType,
generate_mesh: impl FnOnce(&Segment, Vec3<f32>) -> Mesh<FigurePipeline>,
) -> Mesh<FigurePipeline> {
let spec = match self.0.get(&(species, body_type)) {
Some(spec) => spec,
None => {
error!(
"No jaw specification exists for the combination of {:?} and {:?}",
species, body_type
);
return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh);
},
};
let central = graceful_load_segment(&spec.jaw.center.0);
generate_mesh(&central, Vec3::from(spec.jaw.offset))
} }
pub fn mesh_chest_front( pub fn mesh_chest_front(