diff --git a/CHANGELOG.md b/CHANGELOG.md index 15480736b6..44febe587d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 to the client. - Added fullscreen and window size to settings so that they can be persisted - Added coverage based scaling for pixel art +- 28 new mobs + ### Changed @@ -84,6 +86,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Parallelized and otherwise sped up significant parts of world generation. - Various performance improvements to world generation. - Nametags now a fixed size and shown in a limited range +- Non-humanoid skeletons now utilize configs for hotloading, and skeletal attributes. ### Removed diff --git a/assets/common/npc_names.json b/assets/common/npc_names.json index 3158058f5b..7f70e2d8b5 100644 --- a/assets/common/npc_names.json +++ b/assets/common/npc_names.json @@ -309,5 +309,14 @@ "Ziggy", "Zoe", "Zoinks" + ], + "duck": [ + "ducky" + ], + "giant": [ + "leroybrown" + ], + "rat": [ + "rat" ] } \ No newline at end of file diff --git a/assets/voxygen/voxel/biped_large_center_manifest.ron b/assets/voxygen/voxel/biped_large_center_manifest.ron new file mode 100644 index 0000000000..85febe6c84 --- /dev/null +++ b/assets/voxygen/voxel/biped_large_center_manifest.ron @@ -0,0 +1,30 @@ +({ + (Giant, Male): ( + head: ( + offset: (-9.0, -6.0, -6.5), + center: ("npc.giant.male.head"), + ), + torso_upper: ( + offset: (-8.0, -4.5, -5.0), + center: ("npc.giant.male.torso_upper"), + ), + torso_lower: ( + offset: (-5.0, 4.5, 4.5), + center: ("npc.giant.male.torso_lower"), + ) + ), + (Giant, Female): ( + head: ( + offset: (-9.0, -6.0, -6.5), + center: ("npc.giant.female.head"), + ), + torso_upper: ( + offset: (-8.0, -4.5, -5.0), + center: ("npc.giant.female.torso_upper"), + ), + torso_lower: ( + offset: (-5.0, 4.5, 4.5), + center: ("npc.giant.female.torso_lower"), + ) + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/biped_large_lateral_manifest.ron b/assets/voxygen/voxel/biped_large_lateral_manifest.ron new file mode 100644 index 0000000000..fccdca78ab --- /dev/null +++ b/assets/voxygen/voxel/biped_large_lateral_manifest.ron @@ -0,0 +1,70 @@ +({ + (Giant, Male): ( + shoulder_l: ( + offset: (-5.0, -5.5, -4.0), + lateral: ("npc.giant.male.shoulder_l"), + ), + shoulder_r: ( + offset: (-5.0, -5.5, -4.0), + lateral: ("npc.giant.male.shoulder_r"), + ), + hand_l: ( + offset: (-3.0, -2.5, -3.0), + lateral: ("npc.giant.male.hand_l"), + ), + hand_r: ( + offset: (-3.0, -2.5, -3.0), + lateral: ("npc.giant.male.hand_r"), + ), + leg_l: ( + offset: (-3.0, -3.5, -2.0), + lateral: ("npc.giant.male.leg_l"), + ), + leg_r: ( + offset: (-3.0, -3.5, -2.0), + lateral: ("npc.giant.male.leg_r"), + ), + foot_l: ( + offset: (-3.0, -5.5, -2.5), + lateral: ("npc.giant.male.foot_l"), + ), + foot_r: ( + offset: (-3.0, -5.5, -2.5), + lateral: ("npc.giant.male.foot_r"), + ) + ), + (Giant, Female): ( + shoulder_l: ( + offset: (-5.0, -5.5, -4.0), + lateral: ("npc.giant.female.shoulder_l"), + ), + shoulder_r: ( + offset: (-5.0, -5.5, -4.0), + lateral: ("npc.giant.female.shoulder_r"), + ), + hand_l: ( + offset: (-3.0, -2.5, -3.0), + lateral: ("npc.giant.female.hand_l"), + ), + hand_r: ( + offset: (-3.0, -2.5, -3.0), + lateral: ("npc.giant.female.hand_r"), + ), + leg_l: ( + offset: (-3.0, -3.5, -2.0), + lateral: ("npc.giant.female.leg_l"), + ), + leg_r: ( + offset: (-3.0, -3.5, -2.0), + lateral: ("npc.giant.female.leg_r"), + ), + foot_l: ( + offset: (-3.0, -5.5, -2.5), + lateral: ("npc.giant.female.foot_l"), + ), + foot_r: ( + offset: (-3.0, -5.5, -2.5), + lateral: ("npc.giant.female.foot_r"), + ) + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/bird_medium_center_manifest.ron b/assets/voxygen/voxel/bird_medium_center_manifest.ron new file mode 100644 index 0000000000..565f92f9b6 --- /dev/null +++ b/assets/voxygen/voxel/bird_medium_center_manifest.ron @@ -0,0 +1,114 @@ +({ + (Duck, Male): ( + head: ( + offset: (-1.5, -2.0, -1.5), + center: ("npc.duck.male.head"), + ), + torso: ( + offset: (-2.5, -3.0, -2.0), + center: ("npc.duck.male.torso"), + ), + tail: ( + offset: (-1.5, -0.5, -2.5), + center: ("npc.duck.male.tail"), + ) + ), + (Duck, Female): ( + head: ( + offset: (-1.5, -2.0, -1.5), + center: ("npc.duck.female.head"), + ), + torso: ( + offset: (-2.5, -3.0, -2.0), + center: ("npc.duck.female.torso"), + ), + tail: ( + offset: (-1.5, -0.5, -2.5), + center: ("npc.duck.female.tail"), + ) + ), + (Chicken, Male): ( + head: ( + offset: (-1.5, -2.0, -3.5), + center: ("npc.chicken.male.head"), + ), + torso: ( + offset: (-2.5, -3.0, -2.0), + center: ("npc.chicken.male.torso"), + ), + tail: ( + offset: (-1.5, -1.5, -3.5), + center: ("npc.chicken.male.tail"), + ) + ), + (Chicken, Female): ( + head: ( + offset: (-1.5, -2.0, -2.5), + center: ("npc.chicken.female.head"), + ), + torso: ( + offset: (-2.5, -3.0, -2.0), + center: ("npc.chicken.female.torso"), + ), + tail: ( + offset: (-1.5, -0.5, -2.5), + center: ("npc.chicken.female.tail"), + ) + ), + (Goose, Male): ( + head: ( + offset: (-2.0, -3.5, -2.5), + center: ("npc.goose.male.head"), + ), + torso: ( + offset: (-3.5, -4.5, -3.0), + center: ("npc.goose.male.torso"), + ), + tail: ( + offset: (-2.0, -1.0, -3.5), + center: ("npc.goose.male.tail"), + ) + ), + (Goose, Female): ( + head: ( + offset: (-2.0, -3.5, -2.5), + center: ("npc.goose.female.head"), + ), + torso: ( + offset: (-3.5, -4.5, -3.0), + center: ("npc.goose.female.torso"), + ), + tail: ( + offset: (-2.0, -1.0, -3.5), + center: ("npc.goose.female.tail"), + ) + ), + (Peacock, Male): ( + head: ( + offset: (-2.0, -3.5, -3.0), + center: ("npc.peacock.male.head"), + ), + torso: ( + offset: (-2.5, -5.5, -4.5), + center: ("npc.peacock.male.torso"), + ), + tail: ( + offset: (-3.0, -1.5, -5.0), + center: ("npc.peacock.male.tail"), + ) + ), + (Peacock, Female): ( + head: ( + offset: (-2.0, -3.5, -3.5), + center: ("npc.peacock.female.head"), + ), + torso: ( + offset: (-2.5, -5.5, -4.5), + center: ("npc.peacock.female.torso"), + ), + tail: ( + offset: (-3.0, -1.5, -5.0), + center: ("npc.peacock.female.tail"), + ) + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/bird_medium_lateral_manifest.ron b/assets/voxygen/voxel/bird_medium_lateral_manifest.ron new file mode 100644 index 0000000000..f6f7aab553 --- /dev/null +++ b/assets/voxygen/voxel/bird_medium_lateral_manifest.ron @@ -0,0 +1,146 @@ +({ + (Duck, Male): ( + wing_l: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.duck.male.wing"), + ), + wing_r: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.duck.male.wing"), + ), + foot_l: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.duck.male.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.duck.male.leg_r"), + ) + ), + (Duck, Female): ( + wing_l: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.duck.female.wing"), + ), + wing_r: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.duck.female.wing"), + ), + foot_l: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.duck.female.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.duck.female.leg_r"), + ) + ), + (Chicken, Male): ( + wing_l: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.chicken.male.wing"), + ), + wing_r: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.chicken.male.wing"), + ), + foot_l: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.chicken.male.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.chicken.male.leg_r"), + ) + ), + (Chicken, Female): ( + wing_l: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.chicken.female.wing"), + ), + wing_r: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.chicken.female.wing"), + ), + foot_l: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.chicken.female.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.chicken.female.leg_r"), + ) + ), + (Goose, Male): ( + wing_l: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.goose.male.wing"), + ), + wing_r: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.goose.male.wing"), + ), + foot_l: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.goose.male.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.goose.male.leg_r"), + ) + ), + (Goose, Female): ( + wing_l: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.goose.female.wing"), + ), + wing_r: ( + offset: (-0.5, -2.5, -1.5), + lateral: ("npc.goose.female.wing"), + ), + foot_l: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.goose.female.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -1.5), + lateral: ("npc.goose.female.leg_r"), + ) + ), + (Peacock, Male): ( + wing_l: ( + offset: (-1.0, -3.5, -2.5), + lateral: ("npc.peacock.male.wing_l"), + ), + wing_r: ( + offset: (-1.0, -3.5, -2.5), + lateral: ("npc.peacock.male.wing_r"), + ), + foot_l: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.peacock.male.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.peacock.male.leg_r"), + ) + ), + (Peacock, Female): ( + wing_l: ( + offset: (-1.0, -3.5, -2.5), + lateral: ("npc.peacock.female.wing_l"), + ), + wing_r: ( + offset: (-1.0, -3.5, -2.5), + lateral: ("npc.peacock.female.wing_r"), + ), + foot_l: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.peacock.female.leg_l"), + ), + foot_r: ( + offset: (-1.0, -1.5, -3.5), + lateral: ("npc.peacock.female.leg_r"), + ) + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/critter_center_manifest.ron b/assets/voxygen/voxel/critter_center_manifest.ron new file mode 100644 index 0000000000..5f78275ad3 --- /dev/null +++ b/assets/voxygen/voxel/critter_center_manifest.ron @@ -0,0 +1,266 @@ +({ + (Rat, Male): ( + head: ( + offset: (-4.5, -4.0, -4.0), + center: ("npc.rat.male.head"), + ), + chest: ( + offset: (-4.5, -6.0, -4.0), + center: ("npc.rat.male.chest"), + ), + feet_f: ( + offset: (-4.0, -1.5, -1.0), + center: ("npc.rat.male.feet_f"), + ), + feet_b: ( + offset: (-4.0, -1.5, -1.0), + center: ("npc.rat.male.feet_b"), + ), + tail: ( + offset: (-0.5, -4.0, -1.5), + center: ("npc.rat.male.tail"), + ), + ), + (Rat, Female): ( + head: ( + offset: (-4.5, -4.0, -4.0), + center: ("npc.rat.female.head"), + ), + chest: ( + offset: (-4.5, -6.0, -4.0), + center: ("npc.rat.female.chest"), + ), + feet_f: ( + offset: (-4.0, -1.5, -1.0), + center: ("npc.rat.female.feet_f"), + ), + feet_b: ( + offset: (-4.0, -1.5, -1.0), + center: ("npc.rat.female.feet_b"), + ), + tail: ( + offset: (-0.5, -4.0, -1.5), + center: ("npc.rat.female.tail"), + ), + ), + (Axolotl, Male): ( + head: ( + offset: (-3.5, -4.0, -2.0), + center: ("npc.axolotl.male.head"), + ), + chest: ( + offset: (-2.5, -4.0, -1.5), + center: ("npc.axolotl.male.chest"), + ), + feet_f: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.axolotl.male.feet_f"), + ), + feet_b: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.axolotl.male.feet_b"), + ), + tail: ( + offset: (-1.5, -2.5, -1.5), + center: ("npc.axolotl.male.tail"), + ), + ), + (Axolotl, Female): ( + head: ( + offset: (-3.5, -4.0, -2.0), + center: ("npc.axolotl.female.head"), + ), + chest: ( + offset: (-2.5, -4.0, -1.5), + center: ("npc.axolotl.female.chest"), + ), + feet_f: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.axolotl.female.feet_f"), + ), + feet_b: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.axolotl.female.feet_b"), + ), + tail: ( + offset: (-1.5, -2.5, -1.5), + center: ("npc.axolotl.female.tail"), + ), + ), + (Gecko, Male): ( + head: ( + offset: (-2.5, -3.0, -2.0), + center: ("npc.gecko.male.head"), + ), + chest: ( + offset: (-1.5, -4.0, -2.0), + center: ("npc.gecko.male.chest"), + ), + feet_f: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.gecko.male.feet_f"), + ), + feet_b: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.gecko.male.feet_b"), + ), + tail: ( + offset: (-0.5, -2.5, -1.0), + center: ("npc.gecko.male.tail"), + ), + ), + (Gecko, Female): ( + head: ( + offset: (-2.5, -3.0, -2.0), + center: ("npc.gecko.female.head"), + ), + chest: ( + offset: (-1.5, -4.0, -1.5), + center: ("npc.gecko.female.chest"), + ), + feet_f: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.gecko.female.feet_f"), + ), + feet_b: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.gecko.female.feet_b"), + ), + tail: ( + offset: (-0.5, -2.5, -1.0), + center: ("npc.gecko.female.tail"), + ), + ), + (Turtle, Male): ( + head: ( + offset: (-2.5, -2.5, -2.5), + center: ("npc.turtle.male.head"), + ), + chest: ( + offset: (-6.0, -6.0, -4.0), + center: ("npc.turtle.male.chest"), + ), + feet_f: ( + offset: (-5.0, -0.5, -1.0), + center: ("npc.turtle.male.feet_f"), + ), + feet_b: ( + offset: (-5.0, -0.5, -1.0), + center: ("npc.turtle.male.feet_b"), + ), + tail: ( + offset: (-0.5, -2.0, -1.0), + center: ("npc.turtle.male.tail"), + ), + ), + (Turtle, Female): ( + head: ( + offset: (-2.5, -2.5, -2.5), + center: ("npc.turtle.female.head"), + ), + chest: ( + offset: (-6.0, -6.0, -4.0), + center: ("npc.turtle.female.chest"), + ), + feet_f: ( + offset: (-5.0, -0.5, -1.0), + center: ("npc.turtle.female.feet_f"), + ), + feet_b: ( + offset: (-5.0, -0.5, -1.0), + center: ("npc.turtle.female.feet_b"), + ), + tail: ( + offset: (-0.5, -2.0, -1.0), + center: ("npc.turtle.female.tail"), + ), + ), + (Squirrel, Male): ( + head: ( + offset: (-1.5, -2.0, -2.0), + center: ("npc.squirrel.male.head"), + ), + chest: ( + offset: (-1.5, -3.0, -1.5), + center: ("npc.squirrel.male.chest"), + ), + feet_f: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.squirrel.male.feet_f"), + ), + feet_b: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.squirrel.male.feet_b"), + ), + tail: ( + offset: (-1.5, -1.5, -3.0), + center: ("npc.squirrel.male.tail"), + ), + ), + (Squirrel, Female): ( + head: ( + offset: (-1.5, -2.0, -2.0), + center: ("npc.squirrel.female.head"), + ), + chest: ( + offset: (-1.5, -3.0, -1.5), + center: ("npc.squirrel.female.chest"), + ), + feet_f: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.squirrel.female.feet_f"), + ), + feet_b: ( + offset: (-2.0, -0.5, -1.0), + center: ("npc.squirrel.female.feet_b"), + ), + tail: ( + offset: (-1.5, -1.5, -3.0), + center: ("npc.squirrel.female.tail"), + ), + ), + (Fungome, Male): ( + head: ( + offset: (-2.5, -1.5, -2.0), + center: ("npc.fungome.male.head"), + ), + chest: ( + offset: (-6.0, -6.0, -4.0), + center: ("npc.fungome.male.chest"), + ), + feet_f: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.fungome.male.feet_f"), + ), + feet_b: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.fungome.male.feet_b"), + ), + tail: ( + offset: (-1.0, -0.5, -1.0), + center: ("npc.fungome.male.tail"), + ), + ), + (Fungome, Female): ( + head: ( + offset: (-2.5, -1.5, -2.0), + center: ("npc.fungome.female.head"), + ), + chest: ( + offset: (-6.0, -6.0, -4.0), + center: ("npc.fungome.female.chest"), + ), + feet_f: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.fungome.female.feet_f"), + ), + feet_b: ( + offset: (-3.0, -0.5, -1.0), + center: ("npc.fungome.female.feet_b"), + ), + tail: ( + offset: (-1.0, -0.5, -1.0), + center: ("npc.fungome.female.tail"), + ), + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/npc/alligator/female/foot_lb.vox b/assets/voxygen/voxel/npc/alligator/female/foot_lb.vox new file mode 100644 index 0000000000..16521a938c Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/foot_lf.vox b/assets/voxygen/voxel/npc/alligator/female/foot_lf.vox new file mode 100644 index 0000000000..64881111b8 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/foot_rb.vox b/assets/voxygen/voxel/npc/alligator/female/foot_rb.vox new file mode 100644 index 0000000000..c6683bf74d Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/foot_rf.vox b/assets/voxygen/voxel/npc/alligator/female/foot_rf.vox new file mode 100644 index 0000000000..13f3c949e9 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/head_lower.vox b/assets/voxygen/voxel/npc/alligator/female/head_lower.vox new file mode 100644 index 0000000000..0a1b1fba01 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/head_upper.vox b/assets/voxygen/voxel/npc/alligator/female/head_upper.vox new file mode 100644 index 0000000000..3425103eb7 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/jaw.vox b/assets/voxygen/voxel/npc/alligator/female/jaw.vox new file mode 100644 index 0000000000..215c645e57 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/tail.vox b/assets/voxygen/voxel/npc/alligator/female/tail.vox new file mode 100644 index 0000000000..59600cadea Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/torso_back.vox b/assets/voxygen/voxel/npc/alligator/female/torso_back.vox new file mode 100644 index 0000000000..9f780d9d31 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/female/torso_front.vox b/assets/voxygen/voxel/npc/alligator/female/torso_front.vox new file mode 100644 index 0000000000..222f0bee03 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/female/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/foot_lb.vox b/assets/voxygen/voxel/npc/alligator/male/foot_lb.vox new file mode 100644 index 0000000000..16521a938c Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/foot_lf.vox b/assets/voxygen/voxel/npc/alligator/male/foot_lf.vox new file mode 100644 index 0000000000..64881111b8 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/foot_rb.vox b/assets/voxygen/voxel/npc/alligator/male/foot_rb.vox new file mode 100644 index 0000000000..c6683bf74d Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/foot_rf.vox b/assets/voxygen/voxel/npc/alligator/male/foot_rf.vox new file mode 100644 index 0000000000..13f3c949e9 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/head_lower.vox b/assets/voxygen/voxel/npc/alligator/male/head_lower.vox new file mode 100644 index 0000000000..0a1b1fba01 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/head_upper.vox b/assets/voxygen/voxel/npc/alligator/male/head_upper.vox new file mode 100644 index 0000000000..3425103eb7 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/jaw.vox b/assets/voxygen/voxel/npc/alligator/male/jaw.vox new file mode 100644 index 0000000000..215c645e57 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/tail.vox b/assets/voxygen/voxel/npc/alligator/male/tail.vox new file mode 100644 index 0000000000..59600cadea Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/torso_back.vox b/assets/voxygen/voxel/npc/alligator/male/torso_back.vox new file mode 100644 index 0000000000..9f780d9d31 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/alligator/male/torso_front.vox b/assets/voxygen/voxel/npc/alligator/male/torso_front.vox new file mode 100644 index 0000000000..222f0bee03 Binary files /dev/null and b/assets/voxygen/voxel/npc/alligator/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/female/chest.vox b/assets/voxygen/voxel/npc/axolotl/female/chest.vox new file mode 100644 index 0000000000..2e0b0fe9bc Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/female/feet_b.vox b/assets/voxygen/voxel/npc/axolotl/female/feet_b.vox new file mode 100644 index 0000000000..c84f6a9074 Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/female/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/female/feet_f.vox b/assets/voxygen/voxel/npc/axolotl/female/feet_f.vox new file mode 100644 index 0000000000..c84f6a9074 Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/female/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/female/head.vox b/assets/voxygen/voxel/npc/axolotl/female/head.vox new file mode 100644 index 0000000000..1ea36d6936 Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/female/tail.vox b/assets/voxygen/voxel/npc/axolotl/female/tail.vox new file mode 100644 index 0000000000..c5905e954a Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/male/chest.vox b/assets/voxygen/voxel/npc/axolotl/male/chest.vox new file mode 100644 index 0000000000..2e0b0fe9bc Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/male/feet_b.vox b/assets/voxygen/voxel/npc/axolotl/male/feet_b.vox new file mode 100644 index 0000000000..c84f6a9074 Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/male/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/male/feet_f.vox b/assets/voxygen/voxel/npc/axolotl/male/feet_f.vox new file mode 100644 index 0000000000..c84f6a9074 Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/male/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/male/head.vox b/assets/voxygen/voxel/npc/axolotl/male/head.vox new file mode 100644 index 0000000000..1ea36d6936 Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/axolotl/male/tail.vox b/assets/voxygen/voxel/npc/axolotl/male/tail.vox new file mode 100644 index 0000000000..c5905e954a Binary files /dev/null and b/assets/voxygen/voxel/npc/axolotl/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/female/chest.vox b/assets/voxygen/voxel/npc/batfox/female/chest.vox new file mode 100644 index 0000000000..145317c485 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/female/foot_bl.vox b/assets/voxygen/voxel/npc/batfox/female/foot_bl.vox new file mode 100644 index 0000000000..5be01ac394 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/female/foot_br.vox b/assets/voxygen/voxel/npc/batfox/female/foot_br.vox new file mode 100644 index 0000000000..6b5eb31b6b Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/female/foot_fl.vox b/assets/voxygen/voxel/npc/batfox/female/foot_fl.vox new file mode 100644 index 0000000000..91c9bc7a31 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/female/foot_fr.vox b/assets/voxygen/voxel/npc/batfox/female/foot_fr.vox new file mode 100644 index 0000000000..d88a433c45 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/female/head.vox b/assets/voxygen/voxel/npc/batfox/female/head.vox new file mode 100644 index 0000000000..bac4ba0bd1 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/male/chest.vox b/assets/voxygen/voxel/npc/batfox/male/chest.vox new file mode 100644 index 0000000000..145317c485 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/male/foot_bl.vox b/assets/voxygen/voxel/npc/batfox/male/foot_bl.vox new file mode 100644 index 0000000000..5be01ac394 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/male/foot_br.vox b/assets/voxygen/voxel/npc/batfox/male/foot_br.vox new file mode 100644 index 0000000000..6b5eb31b6b Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/male/foot_fl.vox b/assets/voxygen/voxel/npc/batfox/male/foot_fl.vox new file mode 100644 index 0000000000..91c9bc7a31 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/male/foot_fr.vox b/assets/voxygen/voxel/npc/batfox/male/foot_fr.vox new file mode 100644 index 0000000000..d88a433c45 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/batfox/male/head.vox b/assets/voxygen/voxel/npc/batfox/male/head.vox new file mode 100644 index 0000000000..bac4ba0bd1 Binary files /dev/null and b/assets/voxygen/voxel/npc/batfox/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/boar/female/chest.vox b/assets/voxygen/voxel/npc/boar/female/chest.vox new file mode 100644 index 0000000000..c27623ee4a Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/boar/female/foot_bl.vox b/assets/voxygen/voxel/npc/boar/female/foot_bl.vox new file mode 100644 index 0000000000..6dcc0cca61 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/boar/female/foot_br.vox b/assets/voxygen/voxel/npc/boar/female/foot_br.vox new file mode 100644 index 0000000000..2d042c6401 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/boar/female/foot_fl.vox b/assets/voxygen/voxel/npc/boar/female/foot_fl.vox new file mode 100644 index 0000000000..a5eced2e87 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/boar/female/foot_fr.vox b/assets/voxygen/voxel/npc/boar/female/foot_fr.vox new file mode 100644 index 0000000000..64acd12622 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/boar/female/head.vox b/assets/voxygen/voxel/npc/boar/female/head.vox new file mode 100644 index 0000000000..8fd82bc086 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/boar/male/chest.vox b/assets/voxygen/voxel/npc/boar/male/chest.vox new file mode 100644 index 0000000000..cd1f1a9499 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/boar/male/foot_bl.vox b/assets/voxygen/voxel/npc/boar/male/foot_bl.vox new file mode 100644 index 0000000000..6dcc0cca61 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/boar/male/foot_br.vox b/assets/voxygen/voxel/npc/boar/male/foot_br.vox new file mode 100644 index 0000000000..2d042c6401 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/boar/male/foot_fl.vox b/assets/voxygen/voxel/npc/boar/male/foot_fl.vox new file mode 100644 index 0000000000..a5eced2e87 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/boar/male/foot_fr.vox b/assets/voxygen/voxel/npc/boar/male/foot_fr.vox new file mode 100644 index 0000000000..64acd12622 Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/boar/male/head.vox b/assets/voxygen/voxel/npc/boar/male/head.vox new file mode 100644 index 0000000000..929db67efd Binary files /dev/null and b/assets/voxygen/voxel/npc/boar/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/cat/female/chest.vox b/assets/voxygen/voxel/npc/cat/female/chest.vox new file mode 100644 index 0000000000..894c57e0a4 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/cat/female/foot_bl.vox b/assets/voxygen/voxel/npc/cat/female/foot_bl.vox new file mode 100644 index 0000000000..4724fc7695 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/cat/female/foot_br.vox b/assets/voxygen/voxel/npc/cat/female/foot_br.vox new file mode 100644 index 0000000000..77f98d4745 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/cat/female/foot_fl.vox b/assets/voxygen/voxel/npc/cat/female/foot_fl.vox new file mode 100644 index 0000000000..a09886df40 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/cat/female/foot_fr.vox b/assets/voxygen/voxel/npc/cat/female/foot_fr.vox new file mode 100644 index 0000000000..806210ebdf Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/cat/female/head.vox b/assets/voxygen/voxel/npc/cat/female/head.vox new file mode 100644 index 0000000000..aa10af2503 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/cat/male/chest.vox b/assets/voxygen/voxel/npc/cat/male/chest.vox new file mode 100644 index 0000000000..45bb15f016 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/cat/male/foot_bl.vox b/assets/voxygen/voxel/npc/cat/male/foot_bl.vox new file mode 100644 index 0000000000..4345564f61 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/cat/male/foot_br.vox b/assets/voxygen/voxel/npc/cat/male/foot_br.vox new file mode 100644 index 0000000000..9ed12e5b65 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/cat/male/foot_fl.vox b/assets/voxygen/voxel/npc/cat/male/foot_fl.vox new file mode 100644 index 0000000000..a05397d934 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/cat/male/foot_fr.vox b/assets/voxygen/voxel/npc/cat/male/foot_fr.vox new file mode 100644 index 0000000000..b81df4f286 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/cat/male/head.vox b/assets/voxygen/voxel/npc/cat/male/head.vox new file mode 100644 index 0000000000..a9c36daf69 Binary files /dev/null and b/assets/voxygen/voxel/npc/cat/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/female/head.vox b/assets/voxygen/voxel/npc/chicken/female/head.vox new file mode 100644 index 0000000000..bd4f5d0f5a Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/female/leg_l.vox b/assets/voxygen/voxel/npc/chicken/female/leg_l.vox new file mode 100644 index 0000000000..7c59efdd90 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/female/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/female/leg_r.vox b/assets/voxygen/voxel/npc/chicken/female/leg_r.vox new file mode 100644 index 0000000000..f6eb2ca427 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/female/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/female/tail.vox b/assets/voxygen/voxel/npc/chicken/female/tail.vox new file mode 100644 index 0000000000..2ff524f702 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/female/torso.vox b/assets/voxygen/voxel/npc/chicken/female/torso.vox new file mode 100644 index 0000000000..817f167fee Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/female/torso.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/female/wing.vox b/assets/voxygen/voxel/npc/chicken/female/wing.vox new file mode 100644 index 0000000000..3581a51950 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/female/wing.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/male/head.vox b/assets/voxygen/voxel/npc/chicken/male/head.vox new file mode 100644 index 0000000000..d9c97f93c5 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/male/leg_l.vox b/assets/voxygen/voxel/npc/chicken/male/leg_l.vox new file mode 100644 index 0000000000..ef4ddddc52 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/male/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/male/leg_r.vox b/assets/voxygen/voxel/npc/chicken/male/leg_r.vox new file mode 100644 index 0000000000..cb8ec8f49d Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/male/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/male/tail.vox b/assets/voxygen/voxel/npc/chicken/male/tail.vox new file mode 100644 index 0000000000..e0bbe81591 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/male/torso.vox b/assets/voxygen/voxel/npc/chicken/male/torso.vox new file mode 100644 index 0000000000..019c9d4886 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/male/torso.vox differ diff --git a/assets/voxygen/voxel/npc/chicken/male/wing.vox b/assets/voxygen/voxel/npc/chicken/male/wing.vox new file mode 100644 index 0000000000..5da39e0340 Binary files /dev/null and b/assets/voxygen/voxel/npc/chicken/male/wing.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/female/chest.vox b/assets/voxygen/voxel/npc/dodarock/female/chest.vox new file mode 100644 index 0000000000..1bf8d8c1d5 Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/female/foot_bl.vox b/assets/voxygen/voxel/npc/dodarock/female/foot_bl.vox new file mode 100644 index 0000000000..f361911e2f Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/female/foot_br.vox b/assets/voxygen/voxel/npc/dodarock/female/foot_br.vox new file mode 100644 index 0000000000..1abbfcc40f Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/female/foot_fl.vox b/assets/voxygen/voxel/npc/dodarock/female/foot_fl.vox new file mode 100644 index 0000000000..5e5b2a8e71 Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/female/foot_fr.vox b/assets/voxygen/voxel/npc/dodarock/female/foot_fr.vox new file mode 100644 index 0000000000..21b2252428 Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/female/head.vox b/assets/voxygen/voxel/npc/dodarock/female/head.vox new file mode 100644 index 0000000000..3efb0cc31a Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/male/chest.vox b/assets/voxygen/voxel/npc/dodarock/male/chest.vox new file mode 100644 index 0000000000..1bf8d8c1d5 Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/male/foot_bl.vox b/assets/voxygen/voxel/npc/dodarock/male/foot_bl.vox new file mode 100644 index 0000000000..f361911e2f Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/male/foot_br.vox b/assets/voxygen/voxel/npc/dodarock/male/foot_br.vox new file mode 100644 index 0000000000..1abbfcc40f Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/male/foot_fl.vox b/assets/voxygen/voxel/npc/dodarock/male/foot_fl.vox new file mode 100644 index 0000000000..5e5b2a8e71 Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/male/foot_fr.vox b/assets/voxygen/voxel/npc/dodarock/male/foot_fr.vox new file mode 100644 index 0000000000..21b2252428 Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/dodarock/male/head.vox b/assets/voxygen/voxel/npc/dodarock/male/head.vox new file mode 100644 index 0000000000..3efb0cc31a Binary files /dev/null and b/assets/voxygen/voxel/npc/dodarock/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/duck/female/head.vox b/assets/voxygen/voxel/npc/duck/female/head.vox new file mode 100644 index 0000000000..e099ff44fc Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/duck/female/leg_l.vox b/assets/voxygen/voxel/npc/duck/female/leg_l.vox new file mode 100644 index 0000000000..d02f9a362a Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/female/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/duck/female/leg_r.vox b/assets/voxygen/voxel/npc/duck/female/leg_r.vox new file mode 100644 index 0000000000..c227ff840c Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/female/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/duck/female/tail.vox b/assets/voxygen/voxel/npc/duck/female/tail.vox new file mode 100644 index 0000000000..f73fb40d7f Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/duck/female/torso.vox b/assets/voxygen/voxel/npc/duck/female/torso.vox new file mode 100644 index 0000000000..9984a01c87 Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/female/torso.vox differ diff --git a/assets/voxygen/voxel/npc/duck/female/wing.vox b/assets/voxygen/voxel/npc/duck/female/wing.vox new file mode 100644 index 0000000000..ea1de42e55 Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/female/wing.vox differ diff --git a/assets/voxygen/voxel/npc/duck/male/head.vox b/assets/voxygen/voxel/npc/duck/male/head.vox new file mode 100644 index 0000000000..8bc76d618f Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/duck/male/leg_l.vox b/assets/voxygen/voxel/npc/duck/male/leg_l.vox new file mode 100644 index 0000000000..d02f9a362a Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/male/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/duck/male/leg_r.vox b/assets/voxygen/voxel/npc/duck/male/leg_r.vox new file mode 100644 index 0000000000..c227ff840c Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/male/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/duck_m/tail.vox b/assets/voxygen/voxel/npc/duck/male/tail.vox similarity index 100% rename from assets/voxygen/voxel/npc/duck_m/tail.vox rename to assets/voxygen/voxel/npc/duck/male/tail.vox diff --git a/assets/voxygen/voxel/npc/duck/male/torso.vox b/assets/voxygen/voxel/npc/duck/male/torso.vox new file mode 100644 index 0000000000..80ce831912 Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/male/torso.vox differ diff --git a/assets/voxygen/voxel/npc/duck/male/wing.vox b/assets/voxygen/voxel/npc/duck/male/wing.vox new file mode 100644 index 0000000000..36e8fb6f0d Binary files /dev/null and b/assets/voxygen/voxel/npc/duck/male/wing.vox differ diff --git a/assets/voxygen/voxel/npc/duck_m/body.vox b/assets/voxygen/voxel/npc/duck_m/body.vox deleted file mode 100644 index 027b928462..0000000000 Binary files a/assets/voxygen/voxel/npc/duck_m/body.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/duck_m/head.vox b/assets/voxygen/voxel/npc/duck_m/head.vox deleted file mode 100644 index d7b05f86f5..0000000000 Binary files a/assets/voxygen/voxel/npc/duck_m/head.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/duck_m/leg_l.vox b/assets/voxygen/voxel/npc/duck_m/leg_l.vox deleted file mode 100644 index c30122b5d7..0000000000 Binary files a/assets/voxygen/voxel/npc/duck_m/leg_l.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/duck_m/leg_r.vox b/assets/voxygen/voxel/npc/duck_m/leg_r.vox deleted file mode 100644 index c1719336d7..0000000000 Binary files a/assets/voxygen/voxel/npc/duck_m/leg_r.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/duck_m/wing.vox b/assets/voxygen/voxel/npc/duck_m/wing.vox deleted file mode 100644 index 08c1dc009b..0000000000 Binary files a/assets/voxygen/voxel/npc/duck_m/wing.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/fox/female/chest.vox b/assets/voxygen/voxel/npc/fox/female/chest.vox new file mode 100644 index 0000000000..d7dd0ad702 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/fox/female/foot_bl.vox b/assets/voxygen/voxel/npc/fox/female/foot_bl.vox new file mode 100644 index 0000000000..3e1fda06d1 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/fox/female/foot_br.vox b/assets/voxygen/voxel/npc/fox/female/foot_br.vox new file mode 100644 index 0000000000..d410491638 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/fox/female/foot_fl.vox b/assets/voxygen/voxel/npc/fox/female/foot_fl.vox new file mode 100644 index 0000000000..502ad70061 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/fox/female/foot_fr.vox b/assets/voxygen/voxel/npc/fox/female/foot_fr.vox new file mode 100644 index 0000000000..db933ccdfc Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/fox/female/head.vox b/assets/voxygen/voxel/npc/fox/female/head.vox new file mode 100644 index 0000000000..69dd697626 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/fox/male/chest.vox b/assets/voxygen/voxel/npc/fox/male/chest.vox new file mode 100644 index 0000000000..3c832717b0 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/fox/male/foot_bl.vox b/assets/voxygen/voxel/npc/fox/male/foot_bl.vox new file mode 100644 index 0000000000..9cdd4e37d1 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/fox/male/foot_br.vox b/assets/voxygen/voxel/npc/fox/male/foot_br.vox new file mode 100644 index 0000000000..a966afff47 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/fox/male/foot_fl.vox b/assets/voxygen/voxel/npc/fox/male/foot_fl.vox new file mode 100644 index 0000000000..dbcbce2469 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/fox/male/foot_fr.vox b/assets/voxygen/voxel/npc/fox/male/foot_fr.vox new file mode 100644 index 0000000000..04f0ef580e Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/fox/male/head.vox b/assets/voxygen/voxel/npc/fox/male/head.vox new file mode 100644 index 0000000000..07448148a7 Binary files /dev/null and b/assets/voxygen/voxel/npc/fox/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/female/chest.vox b/assets/voxygen/voxel/npc/fungome/female/chest.vox new file mode 100644 index 0000000000..7aabed0842 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/female/feet_b.vox b/assets/voxygen/voxel/npc/fungome/female/feet_b.vox new file mode 100644 index 0000000000..5ce88d2a13 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/female/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/female/feet_f.vox b/assets/voxygen/voxel/npc/fungome/female/feet_f.vox new file mode 100644 index 0000000000..5ce88d2a13 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/female/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/female/head.vox b/assets/voxygen/voxel/npc/fungome/female/head.vox new file mode 100644 index 0000000000..a594f85e5a Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/female/tail.vox b/assets/voxygen/voxel/npc/fungome/female/tail.vox new file mode 100644 index 0000000000..6941b0f880 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/male/chest.vox b/assets/voxygen/voxel/npc/fungome/male/chest.vox new file mode 100644 index 0000000000..7aabed0842 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/male/feet_b.vox b/assets/voxygen/voxel/npc/fungome/male/feet_b.vox new file mode 100644 index 0000000000..5ce88d2a13 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/male/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/male/feet_f.vox b/assets/voxygen/voxel/npc/fungome/male/feet_f.vox new file mode 100644 index 0000000000..5ce88d2a13 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/male/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/male/head.vox b/assets/voxygen/voxel/npc/fungome/male/head.vox new file mode 100644 index 0000000000..a594f85e5a Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/fungome/male/tail.vox b/assets/voxygen/voxel/npc/fungome/male/tail.vox new file mode 100644 index 0000000000..6941b0f880 Binary files /dev/null and b/assets/voxygen/voxel/npc/fungome/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/female/chest.vox b/assets/voxygen/voxel/npc/gecko/female/chest.vox new file mode 100644 index 0000000000..dab811c342 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/female/feet_b.vox b/assets/voxygen/voxel/npc/gecko/female/feet_b.vox new file mode 100644 index 0000000000..64048592f9 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/female/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/female/feet_f.vox b/assets/voxygen/voxel/npc/gecko/female/feet_f.vox new file mode 100644 index 0000000000..e401798b56 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/female/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/female/head.vox b/assets/voxygen/voxel/npc/gecko/female/head.vox new file mode 100644 index 0000000000..916d9989e6 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/female/tail.vox b/assets/voxygen/voxel/npc/gecko/female/tail.vox new file mode 100644 index 0000000000..e6be1ce75d Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/male/chest.vox b/assets/voxygen/voxel/npc/gecko/male/chest.vox new file mode 100644 index 0000000000..dab811c342 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/male/feet_b.vox b/assets/voxygen/voxel/npc/gecko/male/feet_b.vox new file mode 100644 index 0000000000..64048592f9 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/male/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/male/feet_f.vox b/assets/voxygen/voxel/npc/gecko/male/feet_f.vox new file mode 100644 index 0000000000..e401798b56 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/male/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/male/head.vox b/assets/voxygen/voxel/npc/gecko/male/head.vox new file mode 100644 index 0000000000..916d9989e6 Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/gecko/male/tail.vox b/assets/voxygen/voxel/npc/gecko/male/tail.vox new file mode 100644 index 0000000000..e6be1ce75d Binary files /dev/null and b/assets/voxygen/voxel/npc/gecko/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/foot_l.vox b/assets/voxygen/voxel/npc/giant/female/foot_l.vox new file mode 100644 index 0000000000..29a41b32a3 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/foot_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/foot_r.vox b/assets/voxygen/voxel/npc/giant/female/foot_r.vox new file mode 100644 index 0000000000..29a41b32a3 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/foot_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/hand_l.vox b/assets/voxygen/voxel/npc/giant/female/hand_l.vox new file mode 100644 index 0000000000..2f7fd742b7 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/hand_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/hand_r.vox b/assets/voxygen/voxel/npc/giant/female/hand_r.vox new file mode 100644 index 0000000000..19761e662b Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/hand_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/head.vox b/assets/voxygen/voxel/npc/giant/female/head.vox new file mode 100644 index 0000000000..52af14c31c Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/leg_l.vox b/assets/voxygen/voxel/npc/giant/female/leg_l.vox new file mode 100644 index 0000000000..6247151c08 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/leg_r.vox b/assets/voxygen/voxel/npc/giant/female/leg_r.vox new file mode 100644 index 0000000000..5ba2558fb1 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/shoulder_l.vox b/assets/voxygen/voxel/npc/giant/female/shoulder_l.vox new file mode 100644 index 0000000000..e0a96c9a8a Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/shoulder_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/shoulder_r.vox b/assets/voxygen/voxel/npc/giant/female/shoulder_r.vox new file mode 100644 index 0000000000..908e7f7f08 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/shoulder_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/torso_lower.vox b/assets/voxygen/voxel/npc/giant/female/torso_lower.vox new file mode 100644 index 0000000000..068c05c3a9 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/torso_lower.vox differ diff --git a/assets/voxygen/voxel/npc/giant/female/torso_upper.vox b/assets/voxygen/voxel/npc/giant/female/torso_upper.vox new file mode 100644 index 0000000000..f24ade386d Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/female/torso_upper.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/foot_l.vox b/assets/voxygen/voxel/npc/giant/male/foot_l.vox new file mode 100644 index 0000000000..29a41b32a3 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/foot_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/foot_r.vox b/assets/voxygen/voxel/npc/giant/male/foot_r.vox new file mode 100644 index 0000000000..29a41b32a3 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/foot_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/hand_l.vox b/assets/voxygen/voxel/npc/giant/male/hand_l.vox new file mode 100644 index 0000000000..2f7fd742b7 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/hand_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/hand_r.vox b/assets/voxygen/voxel/npc/giant/male/hand_r.vox new file mode 100644 index 0000000000..19761e662b Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/hand_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/head.vox b/assets/voxygen/voxel/npc/giant/male/head.vox new file mode 100644 index 0000000000..52af14c31c Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/leg_l.vox b/assets/voxygen/voxel/npc/giant/male/leg_l.vox new file mode 100644 index 0000000000..6247151c08 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/leg_r.vox b/assets/voxygen/voxel/npc/giant/male/leg_r.vox new file mode 100644 index 0000000000..5ba2558fb1 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/shoulder_l.vox b/assets/voxygen/voxel/npc/giant/male/shoulder_l.vox new file mode 100644 index 0000000000..e0a96c9a8a Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/shoulder_l.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/shoulder_r.vox b/assets/voxygen/voxel/npc/giant/male/shoulder_r.vox new file mode 100644 index 0000000000..908e7f7f08 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/shoulder_r.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/torso_lower.vox b/assets/voxygen/voxel/npc/giant/male/torso_lower.vox new file mode 100644 index 0000000000..068c05c3a9 Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/torso_lower.vox differ diff --git a/assets/voxygen/voxel/npc/giant/male/torso_upper.vox b/assets/voxygen/voxel/npc/giant/male/torso_upper.vox new file mode 100644 index 0000000000..f24ade386d Binary files /dev/null and b/assets/voxygen/voxel/npc/giant/male/torso_upper.vox differ diff --git a/assets/voxygen/voxel/npc/goose/female/head.vox b/assets/voxygen/voxel/npc/goose/female/head.vox new file mode 100644 index 0000000000..0783df653f Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/goose/female/leg_l.vox b/assets/voxygen/voxel/npc/goose/female/leg_l.vox new file mode 100644 index 0000000000..f7aa3eb686 Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/female/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/goose/female/leg_r.vox b/assets/voxygen/voxel/npc/goose/female/leg_r.vox new file mode 100644 index 0000000000..464f4543ca Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/female/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/goose/female/tail.vox b/assets/voxygen/voxel/npc/goose/female/tail.vox new file mode 100644 index 0000000000..6b724d7d2e Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/goose/female/torso.vox b/assets/voxygen/voxel/npc/goose/female/torso.vox new file mode 100644 index 0000000000..262c2d1aac Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/female/torso.vox differ diff --git a/assets/voxygen/voxel/npc/goose/female/wing.vox b/assets/voxygen/voxel/npc/goose/female/wing.vox new file mode 100644 index 0000000000..6b22e84eb1 Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/female/wing.vox differ diff --git a/assets/voxygen/voxel/npc/goose/male/head.vox b/assets/voxygen/voxel/npc/goose/male/head.vox new file mode 100644 index 0000000000..0783df653f Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/goose/male/leg_l.vox b/assets/voxygen/voxel/npc/goose/male/leg_l.vox new file mode 100644 index 0000000000..f7aa3eb686 Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/male/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/goose/male/leg_r.vox b/assets/voxygen/voxel/npc/goose/male/leg_r.vox new file mode 100644 index 0000000000..464f4543ca Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/male/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/goose/male/tail.vox b/assets/voxygen/voxel/npc/goose/male/tail.vox new file mode 100644 index 0000000000..6b724d7d2e Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/goose/male/torso.vox b/assets/voxygen/voxel/npc/goose/male/torso.vox new file mode 100644 index 0000000000..262c2d1aac Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/male/torso.vox differ diff --git a/assets/voxygen/voxel/npc/goose/male/wing.vox b/assets/voxygen/voxel/npc/goose/male/wing.vox new file mode 100644 index 0000000000..6b22e84eb1 Binary files /dev/null and b/assets/voxygen/voxel/npc/goose/male/wing.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/female/chest.vox b/assets/voxygen/voxel/npc/holladon/female/chest.vox new file mode 100644 index 0000000000..d769351717 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/female/foot_bl.vox b/assets/voxygen/voxel/npc/holladon/female/foot_bl.vox new file mode 100644 index 0000000000..8931c7f7e4 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/female/foot_br.vox b/assets/voxygen/voxel/npc/holladon/female/foot_br.vox new file mode 100644 index 0000000000..fa4d76e048 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/female/foot_fl.vox b/assets/voxygen/voxel/npc/holladon/female/foot_fl.vox new file mode 100644 index 0000000000..03a98d9725 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/female/foot_fr.vox b/assets/voxygen/voxel/npc/holladon/female/foot_fr.vox new file mode 100644 index 0000000000..eb73f553ec Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/female/head.vox b/assets/voxygen/voxel/npc/holladon/female/head.vox new file mode 100644 index 0000000000..cd03898bcc Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/male/chest.vox b/assets/voxygen/voxel/npc/holladon/male/chest.vox new file mode 100644 index 0000000000..d769351717 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/male/foot_bl.vox b/assets/voxygen/voxel/npc/holladon/male/foot_bl.vox new file mode 100644 index 0000000000..8931c7f7e4 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/male/foot_br.vox b/assets/voxygen/voxel/npc/holladon/male/foot_br.vox new file mode 100644 index 0000000000..fa4d76e048 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/male/foot_fl.vox b/assets/voxygen/voxel/npc/holladon/male/foot_fl.vox new file mode 100644 index 0000000000..03a98d9725 Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/male/foot_fr.vox b/assets/voxygen/voxel/npc/holladon/male/foot_fr.vox new file mode 100644 index 0000000000..eb73f553ec Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/holladon/male/head.vox b/assets/voxygen/voxel/npc/holladon/male/head.vox new file mode 100644 index 0000000000..cd03898bcc Binary files /dev/null and b/assets/voxygen/voxel/npc/holladon/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/female/chest.vox b/assets/voxygen/voxel/npc/jackalope/female/chest.vox new file mode 100644 index 0000000000..457c92394b Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/female/foot_bl.vox b/assets/voxygen/voxel/npc/jackalope/female/foot_bl.vox new file mode 100644 index 0000000000..c6ed33b70f Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/female/foot_br.vox b/assets/voxygen/voxel/npc/jackalope/female/foot_br.vox new file mode 100644 index 0000000000..d4cb724b7a Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/female/foot_fl.vox b/assets/voxygen/voxel/npc/jackalope/female/foot_fl.vox new file mode 100644 index 0000000000..c1209ceb39 Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/female/foot_fr.vox b/assets/voxygen/voxel/npc/jackalope/female/foot_fr.vox new file mode 100644 index 0000000000..ae67fea977 Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/female/head.vox b/assets/voxygen/voxel/npc/jackalope/female/head.vox new file mode 100644 index 0000000000..d37dabe9a2 Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/male/chest.vox b/assets/voxygen/voxel/npc/jackalope/male/chest.vox new file mode 100644 index 0000000000..457c92394b Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/male/foot_bl.vox b/assets/voxygen/voxel/npc/jackalope/male/foot_bl.vox new file mode 100644 index 0000000000..c6ed33b70f Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/male/foot_br.vox b/assets/voxygen/voxel/npc/jackalope/male/foot_br.vox new file mode 100644 index 0000000000..d4cb724b7a Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/male/foot_fl.vox b/assets/voxygen/voxel/npc/jackalope/male/foot_fl.vox new file mode 100644 index 0000000000..c1209ceb39 Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/male/foot_fr.vox b/assets/voxygen/voxel/npc/jackalope/male/foot_fr.vox new file mode 100644 index 0000000000..ae67fea977 Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/jackalope/male/head.vox b/assets/voxygen/voxel/npc/jackalope/male/head.vox new file mode 100644 index 0000000000..d37dabe9a2 Binary files /dev/null and b/assets/voxygen/voxel/npc/jackalope/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/knight/foot_l.vox b/assets/voxygen/voxel/npc/knight/foot_l.vox deleted file mode 100644 index a5f73a1fa9..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/foot_l.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/foot_r.vox b/assets/voxygen/voxel/npc/knight/foot_r.vox deleted file mode 100644 index 18a9aa9957..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/foot_r.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/hand_l.vox b/assets/voxygen/voxel/npc/knight/hand_l.vox deleted file mode 100644 index 605f8d4e54..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/hand_l.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/hand_r.vox b/assets/voxygen/voxel/npc/knight/hand_r.vox deleted file mode 100644 index e85d0afd34..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/hand_r.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/head.vox b/assets/voxygen/voxel/npc/knight/head.vox deleted file mode 100644 index 97eb00ad22..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/head.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/leg_l.vox b/assets/voxygen/voxel/npc/knight/leg_l.vox deleted file mode 100644 index 1ef03a2a2c..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/leg_l.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/leg_r.vox b/assets/voxygen/voxel/npc/knight/leg_r.vox deleted file mode 100644 index 1215084536..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/leg_r.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/lower_torso.vox b/assets/voxygen/voxel/npc/knight/lower_torso.vox deleted file mode 100644 index 79fa37525f..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/lower_torso.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/shoulder_l.vox b/assets/voxygen/voxel/npc/knight/shoulder_l.vox deleted file mode 100644 index 3498c6b737..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/shoulder_l.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/shoulder_r.vox b/assets/voxygen/voxel/npc/knight/shoulder_r.vox deleted file mode 100644 index 0f42ca7dbb..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/shoulder_r.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/knight/torso_upper.vox b/assets/voxygen/voxel/npc/knight/torso_upper.vox deleted file mode 100644 index 635cf40cd4..0000000000 Binary files a/assets/voxygen/voxel/npc/knight/torso_upper.vox and /dev/null differ diff --git a/assets/voxygen/voxel/npc/lion/female/ears.vox b/assets/voxygen/voxel/npc/lion/female/ears.vox new file mode 100644 index 0000000000..30b11a2432 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/ears.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/foot_lb.vox b/assets/voxygen/voxel/npc/lion/female/foot_lb.vox new file mode 100644 index 0000000000..b17ceb3f95 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/foot_lf.vox b/assets/voxygen/voxel/npc/lion/female/foot_lf.vox new file mode 100644 index 0000000000..1ab9b08c62 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/foot_rb.vox b/assets/voxygen/voxel/npc/lion/female/foot_rb.vox new file mode 100644 index 0000000000..4936bf95e0 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/foot_rf.vox b/assets/voxygen/voxel/npc/lion/female/foot_rf.vox new file mode 100644 index 0000000000..14e6f91d88 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/head_lower.vox b/assets/voxygen/voxel/npc/lion/female/head_lower.vox new file mode 100644 index 0000000000..335efbcbb5 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/head_upper.vox b/assets/voxygen/voxel/npc/lion/female/head_upper.vox new file mode 100644 index 0000000000..698b4510aa Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/jaw.vox b/assets/voxygen/voxel/npc/lion/female/jaw.vox new file mode 100644 index 0000000000..3a7218a08d Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/tail.vox b/assets/voxygen/voxel/npc/lion/female/tail.vox new file mode 100644 index 0000000000..7a7632d3c6 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/torso_back.vox b/assets/voxygen/voxel/npc/lion/female/torso_back.vox new file mode 100644 index 0000000000..778c8df212 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/lion/female/torso_front.vox b/assets/voxygen/voxel/npc/lion/female/torso_front.vox new file mode 100644 index 0000000000..75a3adc3cd Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/female/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/ears.vox b/assets/voxygen/voxel/npc/lion/male/ears.vox new file mode 100644 index 0000000000..30b11a2432 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/ears.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/foot_lb.vox b/assets/voxygen/voxel/npc/lion/male/foot_lb.vox new file mode 100644 index 0000000000..b17ceb3f95 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/foot_lf.vox b/assets/voxygen/voxel/npc/lion/male/foot_lf.vox new file mode 100644 index 0000000000..1ab9b08c62 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/foot_rb.vox b/assets/voxygen/voxel/npc/lion/male/foot_rb.vox new file mode 100644 index 0000000000..4936bf95e0 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/foot_rf.vox b/assets/voxygen/voxel/npc/lion/male/foot_rf.vox new file mode 100644 index 0000000000..14e6f91d88 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/head_lower.vox b/assets/voxygen/voxel/npc/lion/male/head_lower.vox new file mode 100644 index 0000000000..335efbcbb5 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/head_upper.vox b/assets/voxygen/voxel/npc/lion/male/head_upper.vox new file mode 100644 index 0000000000..698b4510aa Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/jaw.vox b/assets/voxygen/voxel/npc/lion/male/jaw.vox new file mode 100644 index 0000000000..3a7218a08d Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/tail.vox b/assets/voxygen/voxel/npc/lion/male/tail.vox new file mode 100644 index 0000000000..7a7632d3c6 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/torso_back.vox b/assets/voxygen/voxel/npc/lion/male/torso_back.vox new file mode 100644 index 0000000000..778c8df212 Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/lion/male/torso_front.vox b/assets/voxygen/voxel/npc/lion/male/torso_front.vox new file mode 100644 index 0000000000..75a3adc3cd Binary files /dev/null and b/assets/voxygen/voxel/npc/lion/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/foot_lb.vox b/assets/voxygen/voxel/npc/monitor/female/foot_lb.vox new file mode 100644 index 0000000000..c7daeb8a54 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/foot_lf.vox b/assets/voxygen/voxel/npc/monitor/female/foot_lf.vox new file mode 100644 index 0000000000..e2cfe966e4 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/foot_rb.vox b/assets/voxygen/voxel/npc/monitor/female/foot_rb.vox new file mode 100644 index 0000000000..e943a0bd50 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/foot_rf.vox b/assets/voxygen/voxel/npc/monitor/female/foot_rf.vox new file mode 100644 index 0000000000..c7daeb8a54 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/head_lower.vox b/assets/voxygen/voxel/npc/monitor/female/head_lower.vox new file mode 100644 index 0000000000..1daeebdb97 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/head_upper.vox b/assets/voxygen/voxel/npc/monitor/female/head_upper.vox new file mode 100644 index 0000000000..5ec2589952 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/jaw.vox b/assets/voxygen/voxel/npc/monitor/female/jaw.vox new file mode 100644 index 0000000000..ccabd7ebfa Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/tail.vox b/assets/voxygen/voxel/npc/monitor/female/tail.vox new file mode 100644 index 0000000000..1856f9ceb3 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/torso_back.vox b/assets/voxygen/voxel/npc/monitor/female/torso_back.vox new file mode 100644 index 0000000000..aa612c8817 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/female/torso_front.vox b/assets/voxygen/voxel/npc/monitor/female/torso_front.vox new file mode 100644 index 0000000000..d3d0156353 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/female/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/foot_lb.vox b/assets/voxygen/voxel/npc/monitor/male/foot_lb.vox new file mode 100644 index 0000000000..c7daeb8a54 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/foot_lf.vox b/assets/voxygen/voxel/npc/monitor/male/foot_lf.vox new file mode 100644 index 0000000000..e2cfe966e4 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/foot_rb.vox b/assets/voxygen/voxel/npc/monitor/male/foot_rb.vox new file mode 100644 index 0000000000..e943a0bd50 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/foot_rf.vox b/assets/voxygen/voxel/npc/monitor/male/foot_rf.vox new file mode 100644 index 0000000000..c7daeb8a54 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/head_lower.vox b/assets/voxygen/voxel/npc/monitor/male/head_lower.vox new file mode 100644 index 0000000000..1daeebdb97 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/head_upper.vox b/assets/voxygen/voxel/npc/monitor/male/head_upper.vox new file mode 100644 index 0000000000..5ec2589952 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/jaw.vox b/assets/voxygen/voxel/npc/monitor/male/jaw.vox new file mode 100644 index 0000000000..ccabd7ebfa Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/tail.vox b/assets/voxygen/voxel/npc/monitor/male/tail.vox new file mode 100644 index 0000000000..1856f9ceb3 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/torso_back.vox b/assets/voxygen/voxel/npc/monitor/male/torso_back.vox new file mode 100644 index 0000000000..aa612c8817 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/monitor/male/torso_front.vox b/assets/voxygen/voxel/npc/monitor/male/torso_front.vox new file mode 100644 index 0000000000..d3d0156353 Binary files /dev/null and b/assets/voxygen/voxel/npc/monitor/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/chest.vox b/assets/voxygen/voxel/npc/peacock/female/chest.vox new file mode 100644 index 0000000000..e8b0c5a0e6 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/head.vox b/assets/voxygen/voxel/npc/peacock/female/head.vox new file mode 100644 index 0000000000..f673183258 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/leg_l.vox b/assets/voxygen/voxel/npc/peacock/female/leg_l.vox new file mode 100644 index 0000000000..5620562333 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/leg_r.vox b/assets/voxygen/voxel/npc/peacock/female/leg_r.vox new file mode 100644 index 0000000000..c4b89f5e2a Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/tail.vox b/assets/voxygen/voxel/npc/peacock/female/tail.vox new file mode 100644 index 0000000000..112c4313ae Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/torso.vox b/assets/voxygen/voxel/npc/peacock/female/torso.vox new file mode 100644 index 0000000000..cdeac7ff6c Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/torso.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/wing_l.vox b/assets/voxygen/voxel/npc/peacock/female/wing_l.vox new file mode 100644 index 0000000000..ae4b42a018 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/wing_l.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/female/wing_r.vox b/assets/voxygen/voxel/npc/peacock/female/wing_r.vox new file mode 100644 index 0000000000..dec352e46e Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/female/wing_r.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/chest.vox b/assets/voxygen/voxel/npc/peacock/male/chest.vox new file mode 100644 index 0000000000..e8b0c5a0e6 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/head.vox b/assets/voxygen/voxel/npc/peacock/male/head.vox new file mode 100644 index 0000000000..f673183258 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/leg_l.vox b/assets/voxygen/voxel/npc/peacock/male/leg_l.vox new file mode 100644 index 0000000000..5620562333 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/leg_l.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/leg_r.vox b/assets/voxygen/voxel/npc/peacock/male/leg_r.vox new file mode 100644 index 0000000000..c4b89f5e2a Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/leg_r.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/tail.vox b/assets/voxygen/voxel/npc/peacock/male/tail.vox new file mode 100644 index 0000000000..112c4313ae Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/torso.vox b/assets/voxygen/voxel/npc/peacock/male/torso.vox new file mode 100644 index 0000000000..cdeac7ff6c Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/torso.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/wing_l.vox b/assets/voxygen/voxel/npc/peacock/male/wing_l.vox new file mode 100644 index 0000000000..ae4b42a018 Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/wing_l.vox differ diff --git a/assets/voxygen/voxel/npc/peacock/male/wing_r.vox b/assets/voxygen/voxel/npc/peacock/male/wing_r.vox new file mode 100644 index 0000000000..dec352e46e Binary files /dev/null and b/assets/voxygen/voxel/npc/peacock/male/wing_r.vox differ diff --git a/assets/voxygen/voxel/npc/pig/female/chest.vox b/assets/voxygen/voxel/npc/pig/female/chest.vox new file mode 100644 index 0000000000..590cc443fc Binary files /dev/null and b/assets/voxygen/voxel/npc/pig/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/pig/female/foot_l.vox b/assets/voxygen/voxel/npc/pig/female/foot_l.vox new file mode 100644 index 0000000000..b03920ef1a Binary files /dev/null and b/assets/voxygen/voxel/npc/pig/female/foot_l.vox differ diff --git a/assets/voxygen/voxel/npc/pig/female/foot_r.vox b/assets/voxygen/voxel/npc/pig/female/foot_r.vox new file mode 100644 index 0000000000..a2277c6636 Binary files /dev/null and b/assets/voxygen/voxel/npc/pig/female/foot_r.vox differ diff --git a/assets/voxygen/voxel/npc/pig/female/head.vox b/assets/voxygen/voxel/npc/pig/female/head.vox new file mode 100644 index 0000000000..0fe7677995 Binary files /dev/null and b/assets/voxygen/voxel/npc/pig/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/pig_purple/chest.vox b/assets/voxygen/voxel/npc/pig/male/chest.vox similarity index 100% rename from assets/voxygen/voxel/npc/pig_purple/chest.vox rename to assets/voxygen/voxel/npc/pig/male/chest.vox diff --git a/assets/voxygen/voxel/npc/pig_purple/leg_l.vox b/assets/voxygen/voxel/npc/pig/male/foot_l.vox similarity index 100% rename from assets/voxygen/voxel/npc/pig_purple/leg_l.vox rename to assets/voxygen/voxel/npc/pig/male/foot_l.vox diff --git a/assets/voxygen/voxel/npc/pig_purple/leg_r.vox b/assets/voxygen/voxel/npc/pig/male/foot_r.vox similarity index 100% rename from assets/voxygen/voxel/npc/pig_purple/leg_r.vox rename to assets/voxygen/voxel/npc/pig/male/foot_r.vox diff --git a/assets/voxygen/voxel/npc/pig_purple/head.vox b/assets/voxygen/voxel/npc/pig/male/head.vox similarity index 100% rename from assets/voxygen/voxel/npc/pig_purple/head.vox rename to assets/voxygen/voxel/npc/pig/male/head.vox diff --git a/assets/voxygen/voxel/npc/quokka/female/chest.vox b/assets/voxygen/voxel/npc/quokka/female/chest.vox new file mode 100644 index 0000000000..d2a3155fc1 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/female/foot_bl.vox b/assets/voxygen/voxel/npc/quokka/female/foot_bl.vox new file mode 100644 index 0000000000..8c27bcf693 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/female/foot_br.vox b/assets/voxygen/voxel/npc/quokka/female/foot_br.vox new file mode 100644 index 0000000000..0602b4db24 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/female/foot_fl.vox b/assets/voxygen/voxel/npc/quokka/female/foot_fl.vox new file mode 100644 index 0000000000..1886c280ea Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/female/foot_fr.vox b/assets/voxygen/voxel/npc/quokka/female/foot_fr.vox new file mode 100644 index 0000000000..182c368bc0 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/female/head.vox b/assets/voxygen/voxel/npc/quokka/female/head.vox new file mode 100644 index 0000000000..c3e7fa5f69 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/male/chest.vox b/assets/voxygen/voxel/npc/quokka/male/chest.vox new file mode 100644 index 0000000000..d2a3155fc1 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/male/foot_bl.vox b/assets/voxygen/voxel/npc/quokka/male/foot_bl.vox new file mode 100644 index 0000000000..8c27bcf693 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/male/foot_br.vox b/assets/voxygen/voxel/npc/quokka/male/foot_br.vox new file mode 100644 index 0000000000..0602b4db24 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/male/foot_fl.vox b/assets/voxygen/voxel/npc/quokka/male/foot_fl.vox new file mode 100644 index 0000000000..1886c280ea Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/male/foot_fr.vox b/assets/voxygen/voxel/npc/quokka/male/foot_fr.vox new file mode 100644 index 0000000000..182c368bc0 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/quokka/male/head.vox b/assets/voxygen/voxel/npc/quokka/male/head.vox new file mode 100644 index 0000000000..c3e7fa5f69 Binary files /dev/null and b/assets/voxygen/voxel/npc/quokka/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/female/chest.vox b/assets/voxygen/voxel/npc/raccoon/female/chest.vox new file mode 100644 index 0000000000..bac0755262 Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/female/foot_bl.vox b/assets/voxygen/voxel/npc/raccoon/female/foot_bl.vox new file mode 100644 index 0000000000..edf4bfe554 Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/female/foot_br.vox b/assets/voxygen/voxel/npc/raccoon/female/foot_br.vox new file mode 100644 index 0000000000..614e96f7fe Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/female/foot_fl.vox b/assets/voxygen/voxel/npc/raccoon/female/foot_fl.vox new file mode 100644 index 0000000000..0d1ed561cc Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/female/foot_fr.vox b/assets/voxygen/voxel/npc/raccoon/female/foot_fr.vox new file mode 100644 index 0000000000..0d1ed561cc Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/female/head.vox b/assets/voxygen/voxel/npc/raccoon/female/head.vox new file mode 100644 index 0000000000..6ae54ecd17 Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/male/chest.vox b/assets/voxygen/voxel/npc/raccoon/male/chest.vox new file mode 100644 index 0000000000..bac0755262 Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/male/foot_bl.vox b/assets/voxygen/voxel/npc/raccoon/male/foot_bl.vox new file mode 100644 index 0000000000..edf4bfe554 Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/male/foot_br.vox b/assets/voxygen/voxel/npc/raccoon/male/foot_br.vox new file mode 100644 index 0000000000..614e96f7fe Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/male/foot_fl.vox b/assets/voxygen/voxel/npc/raccoon/male/foot_fl.vox new file mode 100644 index 0000000000..0d1ed561cc Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/male/foot_fr.vox b/assets/voxygen/voxel/npc/raccoon/male/foot_fr.vox new file mode 100644 index 0000000000..0d1ed561cc Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/raccoon/male/head.vox b/assets/voxygen/voxel/npc/raccoon/male/head.vox new file mode 100644 index 0000000000..6ae54ecd17 Binary files /dev/null and b/assets/voxygen/voxel/npc/raccoon/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/rat/female/chest.vox b/assets/voxygen/voxel/npc/rat/female/chest.vox new file mode 100644 index 0000000000..7b7dfbe310 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/rat/female/feet_b.vox b/assets/voxygen/voxel/npc/rat/female/feet_b.vox new file mode 100644 index 0000000000..3b1c60b692 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/female/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/rat/female/feet_f.vox b/assets/voxygen/voxel/npc/rat/female/feet_f.vox new file mode 100644 index 0000000000..3b1c60b692 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/female/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/rat/female/head.vox b/assets/voxygen/voxel/npc/rat/female/head.vox new file mode 100644 index 0000000000..44abdf5d46 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/rat/female/tail.vox b/assets/voxygen/voxel/npc/rat/female/tail.vox new file mode 100644 index 0000000000..310c3afd6f Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/rat/male/chest.vox b/assets/voxygen/voxel/npc/rat/male/chest.vox new file mode 100644 index 0000000000..7b7dfbe310 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/rat/male/feet_b.vox b/assets/voxygen/voxel/npc/rat/male/feet_b.vox new file mode 100644 index 0000000000..3b1c60b692 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/male/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/rat/male/feet_f.vox b/assets/voxygen/voxel/npc/rat/male/feet_f.vox new file mode 100644 index 0000000000..3b1c60b692 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/male/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/rat/male/feet_r.vox b/assets/voxygen/voxel/npc/rat/male/feet_r.vox new file mode 100644 index 0000000000..3b1c60b692 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/male/feet_r.vox differ diff --git a/assets/voxygen/voxel/npc/rat/male/head.vox b/assets/voxygen/voxel/npc/rat/male/head.vox new file mode 100644 index 0000000000..44abdf5d46 Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/rat/male/tail.vox b/assets/voxygen/voxel/npc/rat/male/tail.vox new file mode 100644 index 0000000000..310c3afd6f Binary files /dev/null and b/assets/voxygen/voxel/npc/rat/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/ears.vox b/assets/voxygen/voxel/npc/saber/female/ears.vox new file mode 100644 index 0000000000..946181f60f Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/ears.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/foot_lb.vox b/assets/voxygen/voxel/npc/saber/female/foot_lb.vox new file mode 100644 index 0000000000..bdfb676b3e Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/foot_lf.vox b/assets/voxygen/voxel/npc/saber/female/foot_lf.vox new file mode 100644 index 0000000000..c4a10c8f7f Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/foot_rb.vox b/assets/voxygen/voxel/npc/saber/female/foot_rb.vox new file mode 100644 index 0000000000..48b2c1c4f1 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/foot_rf.vox b/assets/voxygen/voxel/npc/saber/female/foot_rf.vox new file mode 100644 index 0000000000..bf2addfc7b Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/head_lower.vox b/assets/voxygen/voxel/npc/saber/female/head_lower.vox new file mode 100644 index 0000000000..4f61dfe8cd Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/head_upper.vox b/assets/voxygen/voxel/npc/saber/female/head_upper.vox new file mode 100644 index 0000000000..2cef43baa0 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/jaw.vox b/assets/voxygen/voxel/npc/saber/female/jaw.vox new file mode 100644 index 0000000000..3a5170e127 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/tail.vox b/assets/voxygen/voxel/npc/saber/female/tail.vox new file mode 100644 index 0000000000..3e31bd4231 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/torso_back.vox b/assets/voxygen/voxel/npc/saber/female/torso_back.vox new file mode 100644 index 0000000000..8cab21bc5d Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/saber/female/torso_front.vox b/assets/voxygen/voxel/npc/saber/female/torso_front.vox new file mode 100644 index 0000000000..4277cc861e Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/female/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/ears.vox b/assets/voxygen/voxel/npc/saber/male/ears.vox new file mode 100644 index 0000000000..946181f60f Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/ears.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/foot_lb.vox b/assets/voxygen/voxel/npc/saber/male/foot_lb.vox new file mode 100644 index 0000000000..bdfb676b3e Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/foot_lf.vox b/assets/voxygen/voxel/npc/saber/male/foot_lf.vox new file mode 100644 index 0000000000..c4a10c8f7f Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/foot_rb.vox b/assets/voxygen/voxel/npc/saber/male/foot_rb.vox new file mode 100644 index 0000000000..48b2c1c4f1 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/foot_rf.vox b/assets/voxygen/voxel/npc/saber/male/foot_rf.vox new file mode 100644 index 0000000000..bf2addfc7b Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/head_lower.vox b/assets/voxygen/voxel/npc/saber/male/head_lower.vox new file mode 100644 index 0000000000..4f61dfe8cd Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/head_upper.vox b/assets/voxygen/voxel/npc/saber/male/head_upper.vox new file mode 100644 index 0000000000..2cef43baa0 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/jaw.vox b/assets/voxygen/voxel/npc/saber/male/jaw.vox new file mode 100644 index 0000000000..3a5170e127 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/tail.vox b/assets/voxygen/voxel/npc/saber/male/tail.vox new file mode 100644 index 0000000000..3e31bd4231 Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/torso_back.vox b/assets/voxygen/voxel/npc/saber/male/torso_back.vox new file mode 100644 index 0000000000..8cab21bc5d Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/saber/male/torso_front.vox b/assets/voxygen/voxel/npc/saber/male/torso_front.vox new file mode 100644 index 0000000000..4277cc861e Binary files /dev/null and b/assets/voxygen/voxel/npc/saber/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/female/chest.vox b/assets/voxygen/voxel/npc/sheep/female/chest.vox new file mode 100644 index 0000000000..e79ffd1316 Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/female/foot_l.vox b/assets/voxygen/voxel/npc/sheep/female/foot_l.vox new file mode 100644 index 0000000000..163875d701 Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/female/foot_l.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/female/foot_r.vox b/assets/voxygen/voxel/npc/sheep/female/foot_r.vox new file mode 100644 index 0000000000..9514cdb14c Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/female/foot_r.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/female/head.vox b/assets/voxygen/voxel/npc/sheep/female/head.vox new file mode 100644 index 0000000000..6cf3b349d1 Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/male/chest.vox b/assets/voxygen/voxel/npc/sheep/male/chest.vox new file mode 100644 index 0000000000..e79ffd1316 Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/male/foot_l.vox b/assets/voxygen/voxel/npc/sheep/male/foot_l.vox new file mode 100644 index 0000000000..163875d701 Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/male/foot_l.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/male/foot_r.vox b/assets/voxygen/voxel/npc/sheep/male/foot_r.vox new file mode 100644 index 0000000000..9514cdb14c Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/male/foot_r.vox differ diff --git a/assets/voxygen/voxel/npc/sheep/male/head.vox b/assets/voxygen/voxel/npc/sheep/male/head.vox new file mode 100644 index 0000000000..6cf3b349d1 Binary files /dev/null and b/assets/voxygen/voxel/npc/sheep/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/female/chest.vox b/assets/voxygen/voxel/npc/skunk/female/chest.vox new file mode 100644 index 0000000000..ba7c1c6095 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/female/foot_bl.vox b/assets/voxygen/voxel/npc/skunk/female/foot_bl.vox new file mode 100644 index 0000000000..392c8e7527 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/female/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/female/foot_br.vox b/assets/voxygen/voxel/npc/skunk/female/foot_br.vox new file mode 100644 index 0000000000..392c8e7527 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/female/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/female/foot_fl.vox b/assets/voxygen/voxel/npc/skunk/female/foot_fl.vox new file mode 100644 index 0000000000..d50d9d4d0d Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/female/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/female/foot_fr.vox b/assets/voxygen/voxel/npc/skunk/female/foot_fr.vox new file mode 100644 index 0000000000..0125ea7473 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/female/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/female/head.vox b/assets/voxygen/voxel/npc/skunk/female/head.vox new file mode 100644 index 0000000000..c1a7b537f6 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/male/chest.vox b/assets/voxygen/voxel/npc/skunk/male/chest.vox new file mode 100644 index 0000000000..ba7c1c6095 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/male/foot_bl.vox b/assets/voxygen/voxel/npc/skunk/male/foot_bl.vox new file mode 100644 index 0000000000..392c8e7527 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/male/foot_bl.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/male/foot_br.vox b/assets/voxygen/voxel/npc/skunk/male/foot_br.vox new file mode 100644 index 0000000000..392c8e7527 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/male/foot_br.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/male/foot_fl.vox b/assets/voxygen/voxel/npc/skunk/male/foot_fl.vox new file mode 100644 index 0000000000..d50d9d4d0d Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/male/foot_fl.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/male/foot_fr.vox b/assets/voxygen/voxel/npc/skunk/male/foot_fr.vox new file mode 100644 index 0000000000..0125ea7473 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/male/foot_fr.vox differ diff --git a/assets/voxygen/voxel/npc/skunk/male/head.vox b/assets/voxygen/voxel/npc/skunk/male/head.vox new file mode 100644 index 0000000000..c1a7b537f6 Binary files /dev/null and b/assets/voxygen/voxel/npc/skunk/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/female/chest.vox b/assets/voxygen/voxel/npc/squirrel/female/chest.vox new file mode 100644 index 0000000000..76bdafaa5c Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/female/feet_b.vox b/assets/voxygen/voxel/npc/squirrel/female/feet_b.vox new file mode 100644 index 0000000000..c0dbbe7dea Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/female/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/female/feet_f.vox b/assets/voxygen/voxel/npc/squirrel/female/feet_f.vox new file mode 100644 index 0000000000..c0dbbe7dea Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/female/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/female/head.vox b/assets/voxygen/voxel/npc/squirrel/female/head.vox new file mode 100644 index 0000000000..d7eed6248f Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/female/tail.vox b/assets/voxygen/voxel/npc/squirrel/female/tail.vox new file mode 100644 index 0000000000..dd2a53444b Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/male/chest.vox b/assets/voxygen/voxel/npc/squirrel/male/chest.vox new file mode 100644 index 0000000000..76bdafaa5c Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/male/feet_b.vox b/assets/voxygen/voxel/npc/squirrel/male/feet_b.vox new file mode 100644 index 0000000000..c0dbbe7dea Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/male/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/male/feet_f.vox b/assets/voxygen/voxel/npc/squirrel/male/feet_f.vox new file mode 100644 index 0000000000..c0dbbe7dea Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/male/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/male/head.vox b/assets/voxygen/voxel/npc/squirrel/male/head.vox new file mode 100644 index 0000000000..d7eed6248f Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/squirrel/male/tail.vox b/assets/voxygen/voxel/npc/squirrel/male/tail.vox new file mode 100644 index 0000000000..dd2a53444b Binary files /dev/null and b/assets/voxygen/voxel/npc/squirrel/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/ears.vox b/assets/voxygen/voxel/npc/tarasque/female/ears.vox new file mode 100644 index 0000000000..cc6122bba7 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/ears.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/foot_lb.vox b/assets/voxygen/voxel/npc/tarasque/female/foot_lb.vox new file mode 100644 index 0000000000..baefa75417 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/foot_lf.vox b/assets/voxygen/voxel/npc/tarasque/female/foot_lf.vox new file mode 100644 index 0000000000..26c17293fb Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/foot_rb.vox b/assets/voxygen/voxel/npc/tarasque/female/foot_rb.vox new file mode 100644 index 0000000000..933e9317c4 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/foot_rf.vox b/assets/voxygen/voxel/npc/tarasque/female/foot_rf.vox new file mode 100644 index 0000000000..e814ae83ba Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/head_lower.vox b/assets/voxygen/voxel/npc/tarasque/female/head_lower.vox new file mode 100644 index 0000000000..7d4f1d91f3 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/head_upper.vox b/assets/voxygen/voxel/npc/tarasque/female/head_upper.vox new file mode 100644 index 0000000000..cce7661273 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/jaw.vox b/assets/voxygen/voxel/npc/tarasque/female/jaw.vox new file mode 100644 index 0000000000..52c152e080 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/tail.vox b/assets/voxygen/voxel/npc/tarasque/female/tail.vox new file mode 100644 index 0000000000..cc546e6096 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/torso_back.vox b/assets/voxygen/voxel/npc/tarasque/female/torso_back.vox new file mode 100644 index 0000000000..a81b82f384 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/female/torso_front.vox b/assets/voxygen/voxel/npc/tarasque/female/torso_front.vox new file mode 100644 index 0000000000..ccf949c9e8 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/female/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/ears.vox b/assets/voxygen/voxel/npc/tarasque/male/ears.vox new file mode 100644 index 0000000000..cc6122bba7 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/ears.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/foot_lb.vox b/assets/voxygen/voxel/npc/tarasque/male/foot_lb.vox new file mode 100644 index 0000000000..baefa75417 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/foot_lf.vox b/assets/voxygen/voxel/npc/tarasque/male/foot_lf.vox new file mode 100644 index 0000000000..26c17293fb Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/foot_rb.vox b/assets/voxygen/voxel/npc/tarasque/male/foot_rb.vox new file mode 100644 index 0000000000..933e9317c4 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/foot_rf.vox b/assets/voxygen/voxel/npc/tarasque/male/foot_rf.vox new file mode 100644 index 0000000000..e814ae83ba Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/head_lower.vox b/assets/voxygen/voxel/npc/tarasque/male/head_lower.vox new file mode 100644 index 0000000000..7d4f1d91f3 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/head_upper.vox b/assets/voxygen/voxel/npc/tarasque/male/head_upper.vox new file mode 100644 index 0000000000..cce7661273 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/jaw.vox b/assets/voxygen/voxel/npc/tarasque/male/jaw.vox new file mode 100644 index 0000000000..52c152e080 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/tail.vox b/assets/voxygen/voxel/npc/tarasque/male/tail.vox new file mode 100644 index 0000000000..cc546e6096 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/torso_back.vox b/assets/voxygen/voxel/npc/tarasque/male/torso_back.vox new file mode 100644 index 0000000000..a81b82f384 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/tarasque/male/torso_front.vox b/assets/voxygen/voxel/npc/tarasque/male/torso_front.vox new file mode 100644 index 0000000000..ccf949c9e8 Binary files /dev/null and b/assets/voxygen/voxel/npc/tarasque/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/female/chest.vox b/assets/voxygen/voxel/npc/turtle/female/chest.vox new file mode 100644 index 0000000000..6782d48f39 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/female/chest.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/female/feet_b.vox b/assets/voxygen/voxel/npc/turtle/female/feet_b.vox new file mode 100644 index 0000000000..87a904a820 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/female/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/female/feet_f.vox b/assets/voxygen/voxel/npc/turtle/female/feet_f.vox new file mode 100644 index 0000000000..87a904a820 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/female/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/female/head.vox b/assets/voxygen/voxel/npc/turtle/female/head.vox new file mode 100644 index 0000000000..2b9a82f3e8 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/female/head.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/female/tail.vox b/assets/voxygen/voxel/npc/turtle/female/tail.vox new file mode 100644 index 0000000000..593e3d138e Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/male/chest.vox b/assets/voxygen/voxel/npc/turtle/male/chest.vox new file mode 100644 index 0000000000..6782d48f39 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/male/chest.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/male/feet_b.vox b/assets/voxygen/voxel/npc/turtle/male/feet_b.vox new file mode 100644 index 0000000000..87a904a820 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/male/feet_b.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/male/feet_f.vox b/assets/voxygen/voxel/npc/turtle/male/feet_f.vox new file mode 100644 index 0000000000..87a904a820 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/male/feet_f.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/male/head.vox b/assets/voxygen/voxel/npc/turtle/male/head.vox new file mode 100644 index 0000000000..2b9a82f3e8 Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/male/head.vox differ diff --git a/assets/voxygen/voxel/npc/turtle/male/tail.vox b/assets/voxygen/voxel/npc/turtle/male/tail.vox new file mode 100644 index 0000000000..593e3d138e Binary files /dev/null and b/assets/voxygen/voxel/npc/turtle/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/foot_lb.vox b/assets/voxygen/voxel/npc/tuskram/female/foot_lb.vox new file mode 100644 index 0000000000..ade449b887 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/foot_lf.vox b/assets/voxygen/voxel/npc/tuskram/female/foot_lf.vox new file mode 100644 index 0000000000..0039834b09 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/foot_rb.vox b/assets/voxygen/voxel/npc/tuskram/female/foot_rb.vox new file mode 100644 index 0000000000..b9c14e68f0 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/foot_rf.vox b/assets/voxygen/voxel/npc/tuskram/female/foot_rf.vox new file mode 100644 index 0000000000..696dde4269 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/head_lower.vox b/assets/voxygen/voxel/npc/tuskram/female/head_lower.vox new file mode 100644 index 0000000000..33b0bfefdd Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/head_upper.vox b/assets/voxygen/voxel/npc/tuskram/female/head_upper.vox new file mode 100644 index 0000000000..f8d4e533ba Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/jaw.vox b/assets/voxygen/voxel/npc/tuskram/female/jaw.vox new file mode 100644 index 0000000000..393c10b0be Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/tail.vox b/assets/voxygen/voxel/npc/tuskram/female/tail.vox new file mode 100644 index 0000000000..9326f5c847 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/torso_back.vox b/assets/voxygen/voxel/npc/tuskram/female/torso_back.vox new file mode 100644 index 0000000000..6f6d6b8a47 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/female/torso_front.vox b/assets/voxygen/voxel/npc/tuskram/female/torso_front.vox new file mode 100644 index 0000000000..53c6148de2 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/female/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/foot_lb.vox b/assets/voxygen/voxel/npc/tuskram/male/foot_lb.vox new file mode 100644 index 0000000000..ade449b887 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/foot_lf.vox b/assets/voxygen/voxel/npc/tuskram/male/foot_lf.vox new file mode 100644 index 0000000000..0039834b09 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/foot_rb.vox b/assets/voxygen/voxel/npc/tuskram/male/foot_rb.vox new file mode 100644 index 0000000000..b9c14e68f0 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/foot_rf.vox b/assets/voxygen/voxel/npc/tuskram/male/foot_rf.vox new file mode 100644 index 0000000000..696dde4269 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/head_lower.vox b/assets/voxygen/voxel/npc/tuskram/male/head_lower.vox new file mode 100644 index 0000000000..33b0bfefdd Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/head_upper.vox b/assets/voxygen/voxel/npc/tuskram/male/head_upper.vox new file mode 100644 index 0000000000..f8d4e533ba Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/jaw.vox b/assets/voxygen/voxel/npc/tuskram/male/jaw.vox new file mode 100644 index 0000000000..393c10b0be Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/tail.vox b/assets/voxygen/voxel/npc/tuskram/male/tail.vox new file mode 100644 index 0000000000..9326f5c847 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/torso_back.vox b/assets/voxygen/voxel/npc/tuskram/male/torso_back.vox new file mode 100644 index 0000000000..6f6d6b8a47 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/tuskram/male/torso_front.vox b/assets/voxygen/voxel/npc/tuskram/male/torso_front.vox new file mode 100644 index 0000000000..53c6148de2 Binary files /dev/null and b/assets/voxygen/voxel/npc/tuskram/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/foot_lb.vox b/assets/voxygen/voxel/npc/viper/female/foot_lb.vox new file mode 100644 index 0000000000..e3106afe8e Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/foot_lf.vox b/assets/voxygen/voxel/npc/viper/female/foot_lf.vox new file mode 100644 index 0000000000..00f9ab1916 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/foot_rb.vox b/assets/voxygen/voxel/npc/viper/female/foot_rb.vox new file mode 100644 index 0000000000..6d5d0ed9ff Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/foot_rf.vox b/assets/voxygen/voxel/npc/viper/female/foot_rf.vox new file mode 100644 index 0000000000..7ec4d3bf0c Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/head_lower.vox b/assets/voxygen/voxel/npc/viper/female/head_lower.vox new file mode 100644 index 0000000000..d8d2ff900f Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/head_upper.vox b/assets/voxygen/voxel/npc/viper/female/head_upper.vox new file mode 100644 index 0000000000..f7f487f7b0 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/jaw.vox b/assets/voxygen/voxel/npc/viper/female/jaw.vox new file mode 100644 index 0000000000..daef62cba1 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/tail.vox b/assets/voxygen/voxel/npc/viper/female/tail.vox new file mode 100644 index 0000000000..525b787d69 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/tail.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/torso_back.vox b/assets/voxygen/voxel/npc/viper/female/torso_back.vox new file mode 100644 index 0000000000..4eef98b53f Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/viper/female/torso_front.vox b/assets/voxygen/voxel/npc/viper/female/torso_front.vox new file mode 100644 index 0000000000..1e04a6db16 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/female/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/foot_lb.vox b/assets/voxygen/voxel/npc/viper/male/foot_lb.vox new file mode 100644 index 0000000000..e3106afe8e Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/foot_lf.vox b/assets/voxygen/voxel/npc/viper/male/foot_lf.vox new file mode 100644 index 0000000000..00f9ab1916 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/foot_rb.vox b/assets/voxygen/voxel/npc/viper/male/foot_rb.vox new file mode 100644 index 0000000000..6d5d0ed9ff Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/foot_rf.vox b/assets/voxygen/voxel/npc/viper/male/foot_rf.vox new file mode 100644 index 0000000000..7ec4d3bf0c Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/head_lower.vox b/assets/voxygen/voxel/npc/viper/male/head_lower.vox new file mode 100644 index 0000000000..d8d2ff900f Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/head_upper.vox b/assets/voxygen/voxel/npc/viper/male/head_upper.vox new file mode 100644 index 0000000000..f7f487f7b0 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/jaw.vox b/assets/voxygen/voxel/npc/viper/male/jaw.vox new file mode 100644 index 0000000000..daef62cba1 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/tail.vox b/assets/voxygen/voxel/npc/viper/male/tail.vox new file mode 100644 index 0000000000..525b787d69 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/torso_back.vox b/assets/voxygen/voxel/npc/viper/male/torso_back.vox new file mode 100644 index 0000000000..4eef98b53f Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/viper/male/torso_front.vox b/assets/voxygen/voxel/npc/viper/male/torso_front.vox new file mode 100644 index 0000000000..1e04a6db16 Binary files /dev/null and b/assets/voxygen/voxel/npc/viper/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/ears.vox b/assets/voxygen/voxel/npc/wolf/female/ears.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/ears.vox rename to assets/voxygen/voxel/npc/wolf/female/ears.vox diff --git a/assets/voxygen/voxel/npc/wolf/female/foot_lb.vox b/assets/voxygen/voxel/npc/wolf/female/foot_lb.vox new file mode 100644 index 0000000000..33be2f34cd Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/female/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/foot_lf.vox b/assets/voxygen/voxel/npc/wolf/female/foot_lf.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/foot_lf.vox rename to assets/voxygen/voxel/npc/wolf/female/foot_lf.vox diff --git a/assets/voxygen/voxel/npc/wolf/female/foot_rb.vox b/assets/voxygen/voxel/npc/wolf/female/foot_rb.vox new file mode 100644 index 0000000000..5cdf4c21fe Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/female/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/foot_rf.vox b/assets/voxygen/voxel/npc/wolf/female/foot_rf.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/foot_rf.vox rename to assets/voxygen/voxel/npc/wolf/female/foot_rf.vox diff --git a/assets/voxygen/voxel/npc/wolf/head_lower.vox b/assets/voxygen/voxel/npc/wolf/female/head_lower.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/head_lower.vox rename to assets/voxygen/voxel/npc/wolf/female/head_lower.vox diff --git a/assets/voxygen/voxel/npc/wolf/head_upper.vox b/assets/voxygen/voxel/npc/wolf/female/head_upper.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/head_upper.vox rename to assets/voxygen/voxel/npc/wolf/female/head_upper.vox diff --git a/assets/voxygen/voxel/npc/wolf/jaw.vox b/assets/voxygen/voxel/npc/wolf/female/jaw.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/jaw.vox rename to assets/voxygen/voxel/npc/wolf/female/jaw.vox diff --git a/assets/voxygen/voxel/npc/wolf/tail.vox b/assets/voxygen/voxel/npc/wolf/female/tail.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/tail.vox rename to assets/voxygen/voxel/npc/wolf/female/tail.vox diff --git a/assets/voxygen/voxel/npc/wolf/torso_back.vox b/assets/voxygen/voxel/npc/wolf/female/torso_back.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/torso_back.vox rename to assets/voxygen/voxel/npc/wolf/female/torso_back.vox diff --git a/assets/voxygen/voxel/npc/wolf/torso_mid.vox b/assets/voxygen/voxel/npc/wolf/female/torso_front.vox similarity index 100% rename from assets/voxygen/voxel/npc/wolf/torso_mid.vox rename to assets/voxygen/voxel/npc/wolf/female/torso_front.vox diff --git a/assets/voxygen/voxel/npc/wolf/male/ears.vox b/assets/voxygen/voxel/npc/wolf/male/ears.vox new file mode 100644 index 0000000000..4b5222c76a Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/ears.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/foot_lb.vox b/assets/voxygen/voxel/npc/wolf/male/foot_lb.vox new file mode 100644 index 0000000000..33be2f34cd Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/foot_lb.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/foot_rb.vox b/assets/voxygen/voxel/npc/wolf/male/foot_lf.vox similarity index 99% rename from assets/voxygen/voxel/npc/wolf/foot_rb.vox rename to assets/voxygen/voxel/npc/wolf/male/foot_lf.vox index a069b7d524..1b431ff51d 100644 Binary files a/assets/voxygen/voxel/npc/wolf/foot_rb.vox and b/assets/voxygen/voxel/npc/wolf/male/foot_lf.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/foot_rb.vox b/assets/voxygen/voxel/npc/wolf/male/foot_rb.vox new file mode 100644 index 0000000000..48b2c1c4f1 Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/foot_rb.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/foot_lb.vox b/assets/voxygen/voxel/npc/wolf/male/foot_rf.vox similarity index 99% rename from assets/voxygen/voxel/npc/wolf/foot_lb.vox rename to assets/voxygen/voxel/npc/wolf/male/foot_rf.vox index 9094f0aa2b..ca0f36edcc 100644 Binary files a/assets/voxygen/voxel/npc/wolf/foot_lb.vox and b/assets/voxygen/voxel/npc/wolf/male/foot_rf.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/head_lower.vox b/assets/voxygen/voxel/npc/wolf/male/head_lower.vox new file mode 100644 index 0000000000..88b4e2be32 Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/head_lower.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/head_upper.vox b/assets/voxygen/voxel/npc/wolf/male/head_upper.vox new file mode 100644 index 0000000000..4978a3c287 Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/head_upper.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/jaw.vox b/assets/voxygen/voxel/npc/wolf/male/jaw.vox new file mode 100644 index 0000000000..f2634a1a6d Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/jaw.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/tail.vox b/assets/voxygen/voxel/npc/wolf/male/tail.vox new file mode 100644 index 0000000000..37d46a7f00 Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/tail.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/torso_back.vox b/assets/voxygen/voxel/npc/wolf/male/torso_back.vox new file mode 100644 index 0000000000..0d1d86ea1b Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/torso_back.vox differ diff --git a/assets/voxygen/voxel/npc/wolf/male/torso_front.vox b/assets/voxygen/voxel/npc/wolf/male/torso_front.vox new file mode 100644 index 0000000000..f0ad2b0fbe Binary files /dev/null and b/assets/voxygen/voxel/npc/wolf/male/torso_front.vox differ diff --git a/assets/voxygen/voxel/quadruped_medium_central_manifest.ron b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron new file mode 100644 index 0000000000..1544a344d6 --- /dev/null +++ b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron @@ -0,0 +1,483 @@ +({ + (Wolf, Male): ( + upper: ( + offset: (-7.0, -9.0, -5.5), + central: ("npc.wolf.male.head_upper"), + ), + lower: ( + offset: (-7.0, -4.5, -5.0), + central: ("npc.wolf.male.head_lower"), + ), + jaw: ( + offset: (-3.0, -3.0, -2.5), + central: ("npc.wolf.male.jaw"), + ), + torso_f: ( + offset: (-8.0, -5.5, -6.0), + central: ("npc.wolf.male.torso_front"), + ), + torso_b: ( + offset: (-7.0, -6.0, -6.0), + central: ("npc.wolf.male.torso_back"), + ), + ears: ( + offset: (-4.0, -1.0, -1.5), + central: ("npc.wolf.male.ears"), + ), + tail: ( + offset: (-2.0, -7.5, -5.0), + central: ("npc.wolf.male.tail"), + ), + ), + (Wolf, Female): ( + upper: ( + offset: (-7.0, -9.0, -5.5), + central: ("npc.wolf.female.head_upper"), + ), + lower: ( + offset: (-7.0, -4.5, -5.0), + central: ("npc.wolf.female.head_lower"), + ), + jaw: ( + offset: (-3.0, -3.0, -2.5), + central: ("npc.wolf.male.jaw"), + ), + torso_f: ( + offset: (-8.0, -5.5, -6.0), + central: ("npc.wolf.female.torso_front"), + ), + torso_b: ( + offset: (-7.0, -6.0, -6.0), + central: ("npc.wolf.female.torso_back"), + ), + ears: ( + offset: (-4.0, -1.0, -1.5), + central: ("npc.wolf.female.ears"), + ), + tail: ( + offset: (-2.0, -7.5, -5.0), + central: ("npc.wolf.female.tail"), + ), + ), + + (Saber, Male): ( + upper: ( + offset: (-4.0, -5.5, -6.5), + central: ("npc.saber.male.head_upper"), + ), + lower: ( + offset: (-4.0, -5.5, -4.0), + central: ("npc.saber.male.head_lower"), + ), + jaw: ( + offset: (-2.0, -2.5, -1.0), + central: ("npc.saber.male.jaw"), + ), + torso_f: ( + offset: (-6.0, -6.0, -5.5), + central: ("npc.saber.male.torso_front"), + ), + torso_b: ( + offset: (-6.0, -6.0, -5.0), + central: ("npc.saber.male.torso_back"), + ), + ears: ( + offset: (-5.0, -0.5, -1.5), + central: ("npc.saber.male.ears"), + ), + tail: ( + offset: (-1.0, -3.0, -4.0), + central: ("npc.saber.male.tail"), + ), + ), + (Saber, Female): ( + upper: ( + offset: (-4.0, -5.5, -6.5), + central: ("npc.saber.female.head_upper"), + ), + lower: ( + offset: (-4.0, -5.5, -4.0), + central: ("npc.saber.female.head_lower"), + ), + jaw: ( + offset: (-2.0, -2.5, -1.0), + central: ("npc.saber.female.jaw"), + ), + torso_f: ( + offset: (-6.0, -6.0, -5.5), + central: ("npc.saber.female.torso_front"), + ), + torso_b: ( + offset: (-6.0, -6.0, -5.0), + central: ("npc.saber.female.torso_back"), + ), + ears: ( + offset: (-5.0, -0.5, -1.5), + central: ("npc.saber.female.ears"), + ), + tail: ( + offset: (-1.0, -3.0, -4.0), + central: ("npc.saber.female.tail"), + ), + ), + (Viper, Male): ( + upper: ( + offset: (-4.0, -5.5, -5.5), + central: ("npc.viper.male.head_upper"), + ), + lower: ( + offset: (-3.0, -4.5, -2.5), + central: ("npc.viper.male.head_lower"), + ), + jaw: ( + offset: (-3.0, -2.5, -1.0), + central: ("npc.viper.male.jaw"), + ), + torso_f: ( + offset: (-5.0, -6.5, -3.5), + central: ("npc.viper.male.torso_front"), + ), + torso_b: ( + offset: (-4.0, -7.0, -3.0), + central: ("npc.viper.male.torso_back"), + ), + ears: ( + offset: (-3.0, -1.5, 1.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.0, -5.0, -1.5), + central: ("armor.empty"), + ), + ), + (Viper, Female): ( + upper: ( + offset: (-4.0, -5.5, -5.5), + central: ("npc.viper.female.head_upper"), + ), + lower: ( + offset: (-3.0, -4.5, -2.5), + central: ("npc.viper.female.head_lower"), + ), + jaw: ( + offset: (-3.0, -2.5, -1.0), + central: ("npc.viper.male.jaw"), + ), + torso_f: ( + offset: (-5.0, -6.5, -3.5), + central: ("npc.viper.female.torso_front"), + ), + torso_b: ( + offset: (-4.0, -7.0, -3.0), + central: ("npc.viper.female.torso_back"), + ), + ears: ( + offset: (-3.0, -1.5, 1.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.0, -5.0, -1.5), + central: ("npc.viper.male.tail"), + ), + ), + (Tuskram, Male): ( + upper: ( + offset: (-4.0, -6.5, -7.0), + central: ("npc.tuskram.female.head_upper"), + ), + lower: ( + offset: (-3.0, -4.5, -2.0), + central: ("npc.tuskram.female.head_lower"), + ), + jaw: ( + offset: (-2.0, -1.0, -1.0), + central: ("npc.tuskram.male.jaw"), + ), + torso_f: ( + offset: (-5.0, -6.0, -4.0), + central: ("npc.tuskram.male.torso_front"), + ), + torso_b: ( + offset: (-5.0, -6.0, -4.0), + central: ("npc.tuskram.male.torso_back"), + ), + ears: ( + offset: (-2.0, -1.0, -1.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.0, -2.5, -4.0), + central: ("npc.tuskram.male.tail"), + ), + ), + (Tuskram, Female): ( + upper: ( + offset: (-4.0, -6.5, -7.0), + central: ("npc.tuskram.female.head_upper"), + ), + lower: ( + offset: (-3.0, -4.5, -2.0), + central: ("npc.tuskram.female.head_lower"), + ), + jaw: ( + offset: (-2.0, -1.0, -1.0), + central: ("npc.tuskram.male.jaw"), + ), + torso_f: ( + offset: (-5.0, -6.0, -4.0), + central: ("npc.tuskram.female.torso_front"), + ), + torso_b: ( + offset: (-5.0, -6.0, -4.0), + central: ("npc.tuskram.female.torso_back"), + ), + ears: ( + offset: (-2.0, -1.0, -1.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.0, -2.5, -4.0), + central: ("npc.tuskram.male.tail"), + ), + ), + (Alligator, Male): ( + upper: ( + offset: (-4.0, -5.0, -6.0), + central: ("npc.alligator.male.head_upper"), + ), + lower: ( + offset: (-4.0, -4.5, -1.5), + central: ("npc.alligator.male.head_lower"), + ), + jaw: ( + offset: (-2.0, -7.0, -1.0), + central: ("npc.alligator.male.jaw"), + ), + torso_f: ( + offset: (-5.0, -6.5, -2.5), + central: ("npc.alligator.male.torso_front"), + ), + torso_b: ( + offset: (-4.0, -7.0, -2.0), + central: ("npc.alligator.male.torso_back"), + ), + ears: ( + offset: (-3.0, -1.0, -0.5), + central: ("armor.empty"), + ), + tail: ( + offset: (-2.0, -4.5, -1.5), + central: ("npc.alligator.male.tail"), + ), + ), + (Alligator, Female): ( + upper: ( + offset: (-4.0, -5.0, -6.0), + central: ("npc.alligator.female.head_upper"), + ), + lower: ( + offset: (-4.0, -4.5, -1.5), + central: ("npc.alligator.female.head_lower"), + ), + jaw: ( + offset: (-2.0, -7.0, -1.0), + central: ("npc.alligator.female.jaw"), + ), + torso_f: ( + offset: (-5.0, -6.5, -2.5), + central: ("npc.alligator.female.torso_front"), + ), + torso_b: ( + offset: (-4.0, -7.0, -2.0), + central: ("npc.alligator.female.torso_back"), + ), + ears: ( + offset: (-3.0, -1.0, -0.5), + central: ("armor.empty"), + ), + tail: ( + offset: (-2.0, -4.5, -1.5), + central: ("npc.alligator.male.tail"), + ), + ), + (Monitor, Male): ( + upper: ( + offset: (-3.0, -6.5, -2.5), + central: ("npc.monitor.female.head_upper"), + ), + lower: ( + offset: (-3.0, -4.5, -1.5), + central: ("npc.monitor.female.head_lower"), + ), + jaw: ( + offset: (-2.0, -3.0, -1.0), + central: ("npc.monitor.male.jaw"), + ), + torso_f: ( + offset: (-4.0, -6.5, -2.0), + central: ("npc.monitor.male.torso_front"), + ), + torso_b: ( + offset: (-3.0, -6.5, -1.5), + central: ("npc.monitor.male.torso_back"), + ), + ears: ( + offset: (-3.0, -1.0, -0.5), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.0, -6.5, -1.0), + central: ("npc.monitor.male.tail"), + ), + ), + (Monitor, Female): ( + upper: ( + offset: (-3.0, -6.5, -2.5), + central: ("npc.monitor.female.head_upper"), + ), + lower: ( + offset: (-3.0, -4.5, -1.5), + central: ("npc.monitor.female.head_lower"), + ), + jaw: ( + offset: (-2.0, -3.0, -1.0), + central: ("npc.monitor.male.jaw"), + ), + torso_f: ( + offset: (-4.0, -6.5, -2.0), + central: ("npc.monitor.female.torso_front"), + ), + torso_b: ( + offset: (-3.0, -6.5, -1.5), + central: ("npc.monitor.female.torso_back"), + ), + ears: ( + offset: (-3.0, -1.0, -0.5), + central: ("armor.empty"), + ), + tail: ( + offset: (-1.0, -6.5, -1.0), + central: ("npc.monitor.male.tail"), + ), + ), + (Lion, Male): ( + upper: ( + offset: (-4.5, -5.0, -4.0), + central: ("npc.lion.male.head_upper"), + ), + lower: ( + offset: (-6.5, -5.0, -7.0), + central: ("npc.lion.male.head_lower"), + ), + jaw: ( + offset: (-2.5, -2.5, -0.5), + central: ("npc.lion.male.jaw"), + ), + torso_f: ( + offset: (-5.5, -7.5, -5.5), + central: ("npc.lion.male.torso_front"), + ), + torso_b: ( + offset: (-6.5, -6.0, -5.0), + central: ("npc.lion.male.torso_back"), + ), + ears: ( + offset: (-3.5, -1.0, -1.0), + central: ("npc.lion.male.ears"), + ), + tail: ( + offset: (-0.5, -1.0, -8.0), + central: ("npc.lion.male.tail"), + ), + ), + (Lion, Female): ( + upper: ( + offset: (-4.5, -5.0, -4.0), + central: ("npc.lion.female.head_upper"), + ), + lower: ( + offset: (-6.5, -5.0, -7.0), + central: ("npc.lion.female.head_lower"), + ), + jaw: ( + offset: (-2.5, -2.5, -0.5), + central: ("npc.lion.male.jaw"), + ), + torso_f: ( + offset: (-5.5, -7.5, -5.5), + central: ("npc.lion.female.torso_front"), + ), + torso_b: ( + offset: (-6.5, -6.0, -5.0), + central: ("npc.lion.female.torso_back"), + ), + ears: ( + offset: (-3.5, -1.0, -1.0), + central: ("npc.lion.female.ears"), + ), + tail: ( + offset: (-0.5, -1.0, -1.0), + central: ("npc.lion.male.tail"), + ), + ), + (Tarasque, Male): ( + upper: ( + offset: (-6.0, -6.0, -9.5), + central: ("npc.tarasque.male.head_upper"), + ), + lower: ( + offset: (-3.5, -4.0, -2.5), + central: ("npc.tarasque.male.head_lower"), + ), + jaw: ( + offset: (-2.0, -2.5, -1.0), + central: ("npc.tarasque.male.jaw"), + ), + torso_f: ( + offset: (-5.0, -7.0, -6.5), + central: ("npc.tarasque.male.torso_front"), + ), + torso_b: ( + offset: (-5.0, -6.0, -5.5), + central: ("npc.tarasque.male.torso_back"), + ), + ears: ( + offset: (-4.5, -1.0, -1.5), + central: ("npc.tarasque.male.ears"), + ), + tail: ( + offset: (-1.0, -1.5, -1.0), + central: ("npc.tarasque.male.tail"), + ), + ), + (Tarasque, Female): ( + upper: ( + offset: (-6.0, -6.0, -9.5), + central: ("npc.tarasque.female.head_upper"), + ), + lower: ( + offset: (-3.5, -4.0, -2.5), + central: ("npc.tarasque.female.head_lower"), + ), + jaw: ( + offset: (-2.0, -2.5, -1.0), + central: ("npc.tarasque.male.jaw"), + ), + torso_f: ( + offset: (-5.0, -7.0, -6.5), + central: ("npc.tarasque.female.torso_front"), + ), + torso_b: ( + offset: (-5.0, -6.0, -5.5), + central: ("npc.tarasque.female.torso_back"), + ), + ears: ( + offset: (-4.5, -1.0, -1.5), + central: ("npc.tarasque.female.ears"), + ), + tail: ( + offset: (-1.0, -1.5, -8.0), + central: ("npc.tarasque.male.tail"), + ), + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron new file mode 100644 index 0000000000..60ada93e68 --- /dev/null +++ b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron @@ -0,0 +1,290 @@ +({ + (Wolf, Male): ( + left_front: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.wolf.male.foot_lf"), + ), + right_front: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.wolf.male.foot_rf"), + ), + left_back: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.wolf.male.foot_lb"), + ), + right_back: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.wolf.male.foot_rb"), + ), + ), + (Wolf, Female): ( + left_front: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.wolf.female.foot_lf"), + ), + right_front: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.wolf.female.foot_rf"), + ), + left_back: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.wolf.female.foot_lb"), + ), + right_back: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.wolf.female.foot_rb"), + ), + ), + (Saber, Male): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.saber.male.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.saber.male.foot_rf"), + ), + left_back: ( + offset: (-1.5, -4.0, -3.5), + lateral: ("npc.saber.male.foot_lb"), + ), + right_back: ( + offset: (-1.5, -4.0, -3.5), + lateral: ("npc.saber.male.foot_rb"), + ), + ), + (Saber, Female): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.saber.female.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.saber.female.foot_rf"), + ), + left_back: ( + offset: (-1.5, -4.0, -3.5), + lateral: ("npc.saber.female.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.saber.female.foot_rb"), + ), + ), + (Viper, Male): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.viper.male.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.viper.male.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.viper.male.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.viper.male.foot_rb"), + ), + ), + (Viper, Female): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.viper.female.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.viper.female.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.viper.female.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.viper.female.foot_rb"), + ), + ), + (Tuskram, Male): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tuskram.male.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tuskram.male.foot_rf"), + ), + left_back: ( + offset: (-1.5, -3.0, -3.5), + lateral: ("npc.tuskram.male.foot_lb"), + ), + right_back: ( + offset: (-1.5, -3.0, -3.5), + lateral: ("npc.tuskram.male.foot_rb"), + ), + ), + (Tuskram, Female): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tuskram.female.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tuskram.female.foot_rf"), + ), + left_back: ( + offset: (-1.5, -3.0, -3.5), + lateral: ("npc.tuskram.female.foot_lb"), + ), + right_back: ( + offset: (-1.5, -3.0, -3.5), + lateral: ("npc.tuskram.female.foot_rb"), + ), + ), + (Alligator, Male): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.alligator.male.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.alligator.male.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.alligator.male.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.alligator.male.foot_rb"), + ), + ), + (Alligator, Female): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.alligator.female.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.alligator.female.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.alligator.female.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.alligator.female.foot_rb"), + ), + ), + (Monitor, Male): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.monitor.male.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.monitor.male.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.monitor.male.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.monitor.male.foot_rb"), + ), + ), + (Monitor, Female): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.monitor.female.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.monitor.female.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.monitor.female.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.monitor.female.foot_rb"), + ), + ), + (Lion, Male): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.lion.male.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.lion.male.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.lion.male.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.lion.male.foot_rb"), + ), + ), + (Lion, Female): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.lion.female.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.lion.female.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.lion.female.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.lion.female.foot_rb"), + ), + ), + (Tarasque, Male): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tarasque.male.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tarasque.male.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.tarasque.male.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.tarasque.male.foot_rb"), + ), + ), + (Tarasque, Female): ( + left_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tarasque.female.foot_lf"), + ), + right_front: ( + offset: (-1.5, -1.5, -2.5), + lateral: ("npc.tarasque.female.foot_rf"), + ), + left_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.tarasque.female.foot_lb"), + ), + right_back: ( + offset: (-1.5, -2.0, -3.5), + lateral: ("npc.tarasque.female.foot_rb"), + ), + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/quadruped_small_central_manifest.ron b/assets/voxygen/voxel/quadruped_small_central_manifest.ron new file mode 100644 index 0000000000..b2805684ba --- /dev/null +++ b/assets/voxygen/voxel/quadruped_small_central_manifest.ron @@ -0,0 +1,254 @@ +({ + (Pig, Male): ( + head: ( + offset: (-6.0, -2.5, -4.5), + central: ("npc.pig.male.head"), + ), + chest: ( + offset: (-5.0, -4.5, -5.5), + central: ("npc.pig.male.chest"), + ), + ), + (Pig, Female):( + head: ( + offset: (-6.0, -2.5, -4.5), + central: ("npc.pig.female.head"), + ), + chest: ( + offset: (-5.0, -4.5, -5.5), + central: ("npc.pig.female.chest"), + ), + ), + + (Fox, Male):( + head: ( + offset: (-3.5, -3.0, -3.5), + central: ("npc.fox.male.head"), + ), + chest: ( + offset: (-1.5, -8.0, -2.5), + central: ("npc.fox.male.chest"), + ), + ), + + (Fox, Female):( + head: ( + offset: (-3.5, -3.0, -3.5), + central: ("npc.fox.female.head"), + ), + chest: ( + offset: (-1.5, -8.0, -2.5), + central: ("npc.fox.female.chest"), + ), + ), + + (Sheep, Male):( + head: ( + offset: (-5.0, -4.5, -3.5), + central: ("npc.sheep.male.head"), + ), + chest: ( + offset: (-5.0, -6.5, -3.5), + central: ("npc.sheep.male.chest"), + ), + ), + + (Sheep, Female):( + head: ( + offset: (-5.0, -4.5, -3.5), + central: ("npc.sheep.female.head"), + ), + chest: ( + offset: (-5.0, -6.5, -3.5), + central: ("npc.sheep.female.chest"), + ), + ), + (Boar, Male):( + head: ( + offset: (-5.5, -6.5, -4.0), + central: ("npc.boar.male.head"), + ), + chest: ( + offset: (-3.5, -9.5, -4.5), + central: ("npc.boar.male.chest"), + ), + ), + (Boar, Female):( + head: ( + offset: (-5.5, -6.5, -4.0), + central: ("npc.boar.female.head"), + ), + chest: ( + offset: (-3.5, -9.5, -4.5), + central: ("npc.boar.female.chest"), + ), + ), + (Jackalope, Male):( + head: ( + offset: (-3.5, -4.5, -4.5), + central: ("npc.jackalope.male.head"), + ), + chest: ( + offset: (-1.5, -7.5, -2.5), + central: ("npc.jackalope.male.chest"), + ), + ), + (Jackalope, Female):( + head: ( + offset: (-3.5, -4.5, -4.5), + central: ("npc.jackalope.female.head"), + ), + chest: ( + offset: (-1.5, -7.5, -2.5), + central: ("npc.jackalope.female.chest"), + ), + ), + (Skunk, Male):( + head: ( + offset: (-2.0, -1.0, -2.0), + central: ("npc.skunk.male.head"), + ), + chest: ( + offset: (-4.0, -10.5, -4.5), + central: ("npc.skunk.male.chest"), + ), + ), + (Skunk, Female):( + head: ( + offset: (-2.0, -1.0, -2.0), + central: ("npc.skunk.female.head"), + ), + chest: ( + offset: (-4.0, -10.5, -4.5), + central: ("npc.skunk.female.chest"), + ), + ), + (Cat, Male):( + head: ( + offset: (-3.5, -3.0, -3.5), + central: ("npc.cat.male.head"), + ), + chest: ( + offset: (-1.5, -5.5, -2.5), + central: ("npc.cat.male.chest"), + ), + ), + (Cat, Female):( + head: ( + offset: (-3.5, -3.0, -3.5), + central: ("npc.cat.female.head"), + ), + chest: ( + offset: (-1.5, -5.5, -2.5), + central: ("npc.cat.female.chest"), + ), + ), + (Batfox, Male):( + head: ( + offset: (-9.5, -6.0, -4.0), + central: ("npc.batfox.male.head"), + ), + chest: ( + offset: (-1.5, -7.5, -2.5), + central: ("npc.batfox.male.chest"), + ), + ), + + (Batfox, Female):( + head: ( + offset: (-9.5, -6.0, -4.0), + central: ("npc.batfox.female.head"), + ), + chest: ( + offset: (-1.5, -7.5, -2.5), + central: ("npc.batfox.female.chest"), + ), + ), + + (Raccoon, Male):( + head: ( + offset: (-4.0, -4.0, -3.5), + central: ("npc.raccoon.male.head"), + ), + chest: ( + offset: (-3.0, -7.5, -3.0), + central: ("npc.raccoon.male.chest"), + ), + ), + + (Raccoon, Female):( + head: ( + offset: (-4.0, -4.0, -3.5), + central: ("npc.raccoon.female.head"), + ), + chest: ( + offset: (-3.0, -7.5, -3.0), + central: ("npc.raccoon.female.chest"), + ), + ), + + (Quokka, Male):( + head: ( + offset: (-4.5, -3.0, -4.0), + central: ("npc.quokka.male.head"), + ), + chest: ( + offset: (-5.0, -7.5, -4.0), + central: ("npc.quokka.male.chest"), + ), + ), + + (Quokka, Female):( + head: ( + offset: (-4.5, -3.0, -4.0), + central: ("npc.quokka.female.head"), + ), + chest: ( + offset: (-5.0, -7.5, -4.0), + central: ("npc.quokka.female.chest"), + ), + ), + + (Dodarock, Male):( + head: ( + offset: (-5.0, -3.5, -4.5), + central: ("npc.dodarock.male.head"), + ), + chest: ( + offset: (-5.0, -7.5, -4.5), + central: ("npc.dodarock.male.chest"), + ), + ), + + (Dodarock, Female):( + head: ( + offset: (-5.0, -3.5, -4.5), + central: ("npc.dodarock.female.head"), + ), + chest: ( + offset: (-5.0, -7.5, -4.5), + central: ("npc.dodarock.female.chest"), + ), + ), + (Holladon, Male):( + head: ( + offset: (-3.5, -3.5, -4.0), + central: ("npc.holladon.male.head"), + ), + chest: ( + offset: (-3.0, -7.5, -3.0), + central: ("npc.holladon.male.chest"), + ), + ), + + (Holladon, Female):( + head: ( + offset: (-3.5, -3.5, -4.0), + central: ("npc.holladon.female.head"), + ), + chest: ( + offset: (-3.0, -7.5, -3.0), + central: ("npc.holladon.female.chest"), + ), + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron new file mode 100644 index 0000000000..5b102d6b11 --- /dev/null +++ b/assets/voxygen/voxel/quadruped_small_lateral_manifest.ron @@ -0,0 +1,450 @@ +({ + (Pig, Male): ( + left_front: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.male.foot_l"), + ), + right_front: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.male.foot_r"), + ), + left_back: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.male.foot_l"), + ), + right_back: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.male.foot_r"), + ), + ), + (Pig, Female): ( + left_front: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.female.foot_l"), + ), + right_front: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.female.foot_r"), + ), + left_back: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.female.foot_l"), + ), + right_back: ( + offset: (-1.0, -1.0, -1.5), + lateral: ("npc.pig.female.foot_r"), + ), + ), + + (Fox, Male): ( + left_front: ( + offset: (-1.0, -2.5, -2.5), + lateral: ("npc.fox.male.foot_fl"), + ), + right_front: ( + offset: (-1.0, -2.5, -2.5), + lateral: ("npc.fox.male.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.fox.male.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.fox.male.foot_br"), + ), + ), + (Fox, Female): ( + left_front: ( + offset: (-1.0, -2.5, -2.5), + lateral: ("npc.fox.female.foot_fl"), + ), + right_front: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.fox.female.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.fox.female.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.fox.female.foot_br"), + ), + ), + + (Sheep, Male): ( + left_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.male.foot_l"), + ), + right_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.male.foot_r"), + ), + left_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.male.foot_l"), + ), + right_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.male.foot_r"), + ), + ), + + (Sheep, Female): ( + left_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.female.foot_l"), + ), + right_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.female.foot_r"), + ), + left_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.female.foot_l"), + ), + right_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.sheep.female.foot_r"), + ), + ), + + (Boar, Male): ( + left_front: ( + offset: (-1.5, -3.5, -4.0), + lateral: ("npc.boar.male.foot_fl"), + ), + right_front: ( + offset: (-1.5, -2.5, -4.0), + lateral: ("npc.boar.male.foot_fr"), + ), + left_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.boar.male.foot_bl"), + ), + right_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.boar.male.foot_br"), + ), + ), + + (Boar, Female): ( + left_front: ( + offset: (-1.5, -2.5, -4.0), + lateral: ("npc.boar.female.foot_fl"), + ), + right_front: ( + offset: (-1.5, -2.5, -4.0), + lateral: ("npc.boar.female.foot_fr"), + ), + left_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.boar.female.foot_bl"), + ), + right_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.boar.female.foot_br"), + ), + ), + (Jackalope, Male): ( + left_front: ( + offset: (-1.5, -3.5, -4.0), + lateral: ("npc.jackalope.male.foot_fl"), + ), + right_front: ( + offset: (-1.5, -3.5, -4.0), + lateral: ("npc.jackalope.male.foot_fr"), + ), + left_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.jackalope.male.foot_bl"), + ), + right_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.jackalope.male.foot_br"), + ), + ), + + (Jackalope, Female): ( + left_front: ( + offset: (-1.5, -2.5, -4.0), + lateral: ("npc.jackalope.female.foot_fl"), + ), + right_front: ( + offset: (-1.5, -2.5, -4.0), + lateral: ("npc.jackalope.female.foot_fr"), + ), + left_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.jackalope.female.foot_bl"), + ), + right_back: ( + offset: (-1.5, -2.5, -6.0), + lateral: ("npc.jackalope.female.foot_br"), + ), + ), + (Skunk, Male): ( + left_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.male.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.male.foot_fr"), + ), + left_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.male.foot_bl"), + ), + right_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.male.foot_br"), + ), + ), + + (Skunk, Female): ( + left_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.female.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.female.foot_fr"), + ), + left_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.female.foot_bl"), + ), + right_back: ( + offset: (-1.0, -1.0, -3.5), + lateral: ("npc.skunk.female.foot_br"), + ), + + ), + (Cat, Male): ( + left_front: ( + offset: (-1.0, -1.5, -3.0), + lateral: ("npc.cat.male.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.5, -3.0), + lateral: ("npc.cat.male.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.0, -3.0), + lateral: ("npc.cat.male.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.0, -3.0), + lateral: ("npc.cat.male.foot_br"), + ), + ), + + (Cat, Female): ( + left_front: ( + offset: (-1.0, -1.5, -3.0), + lateral: ("npc.cat.female.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.5, -3.0), + lateral: ("npc.cat.female.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.0, -3.0), + lateral: ("npc.cat.female.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.0, -3.0), + lateral: ("npc.cat.female.foot_br"), + ), + + ), + (Batfox, Male): ( + left_front: ( + offset: (-1.0, -1.5, -3.0), + lateral: ("npc.batfox.male.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.5, -3.0), + lateral: ("npc.batfox.male.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.5, -3.5), + lateral: ("npc.batfox.male.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.5, -3.5), + lateral: ("npc.batfox.male.foot_br"), + ), + ), + + (Batfox, Female): ( + left_front: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.batfox.female.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.batfox.female.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.5, -3.5), + lateral: ("npc.batfox.female.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.5, -3.5), + lateral: ("npc.batfox.female.foot_br"), + ), + + ), + (Raccoon, Male): ( + left_front: ( + offset: (-0.5, -0.5, -2.5), + lateral: ("npc.raccoon.male.foot_fl"), + ), + right_front: ( + offset: (-0.5, -0.5, -2.5), + lateral: ("npc.raccoon.male.foot_fr"), + ), + left_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.raccoon.male.foot_bl"), + ), + right_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.raccoon.male.foot_br"), + ), + ), + + (Raccoon, Female): ( + left_front: ( + offset: (-0.5, -0.5, -2.5), + lateral: ("npc.raccoon.female.foot_fl"), + ), + right_front: ( + offset: (-0.5, -0.5, -2.5), + lateral: ("npc.raccoon.female.foot_fr"), + ), + left_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.raccoon.female.foot_bl"), + ), + right_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.raccoon.female.foot_br"), + ), + ), + (Quokka, Male): ( + left_front: ( + offset: (-1.0, -1.0, -2.5), + lateral: ("npc.quokka.male.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.0, -2.5), + lateral: ("npc.quokka.male.foot_fr"), + ), + left_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.quokka.male.foot_bl"), + ), + right_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.quokka.male.foot_br"), + ), + ), + + (Quokka, Female): ( + left_front: ( + offset: (-1.0, -1.0, -2.5), + lateral: ("npc.quokka.female.foot_fl"), + ), + right_front: ( + offset: (-1.0, -1.0, -2.5), + lateral: ("npc.quokka.female.foot_fr"), + ), + left_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.quokka.female.foot_bl"), + ), + right_back: ( + offset: (-1.0, -1.5, -2.5), + lateral: ("npc.quokka.female.foot_br"), + ), + ), + (Dodarock, Male): ( + left_front: ( + offset: (-2.0, -3.0, -4.0), + lateral: ("npc.dodarock.male.foot_fl"), + ), + right_front: ( + offset: (-2.0, -3.0, -4.0), + lateral: ("npc.dodarock.male.foot_fr"), + ), + left_back: ( + offset: (-1.5, -2.0, -2.5), + lateral: ("npc.dodarock.male.foot_bl"), + ), + right_back: ( + offset: (-1.5, -2.0, -2.5), + lateral: ("npc.dodarock.male.foot_br"), + ), + ), + + (Dodarock, Female): ( + left_front: ( + offset: (-2.0, -3.0, -4.0), + lateral: ("npc.dodarock.female.foot_fl"), + ), + right_front: ( + offset: (-2.0, -3.0, -4.0), + lateral: ("npc.dodarock.female.foot_fr"), + ), + left_back: ( + offset: (-1.5, -2.0, -2.5), + lateral: ("npc.dodarock.female.foot_bl"), + ), + right_back: ( + offset: (-1.5, -2.0, -2.5), + lateral: ("npc.dodarock.female.foot_br"), + ), + ), + (Holladon, Male): ( + left_front: ( + offset: (-1.0, -3.0, -4.0), + lateral: ("npc.holladon.male.foot_fl"), + ), + right_front: ( + offset: (-1.0, -3.0, -4.0), + lateral: ("npc.holladon.male.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.holladon.male.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.holladon.male.foot_br"), + ), + ), + + (Holladon, Female): ( + left_front: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.holladon.female.foot_fl"), + ), + right_front: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.holladon.female.foot_fr"), + ), + left_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.holladon.female.foot_bl"), + ), + right_back: ( + offset: (-1.0, -2.0, -2.5), + lateral: ("npc.holladon.female.foot_br"), + ), + ), +}) \ No newline at end of file diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 73736b434d..ec25d4ae2e 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -1,6 +1,7 @@ pub mod biped_large; pub mod bird_medium; pub mod bird_small; +pub mod critter; pub mod dragon; pub mod fish_medium; pub mod fish_small; @@ -25,6 +26,7 @@ pub enum Body { FishSmall(fish_small::Body) = 7, BipedLarge(biped_large::Body) = 8, Object(object::Body) = 9, + Critter(critter::Body) = 10, } impl Body { @@ -42,6 +44,7 @@ impl Body { Body::Humanoid(_) => 0.5, Body::QuadrupedSmall(_) => 0.6, Body::QuadrupedMedium(_) => 0.9, + Body::Critter(_) => 0.5, Body::BirdMedium(_) => 0.5, Body::FishMedium(_) => 0.5, Body::Dragon(_) => 2.5, diff --git a/common/src/comp/body/biped_large.rs b/common/src/comp/body/biped_large.rs index cb30f1ba4e..f1c78f26ed 100644 --- a/common/src/comp/body/biped_large.rs +++ b/common/src/comp/body/biped_large.rs @@ -3,110 +3,30 @@ use rand::{seq::SliceRandom, thread_rng}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(C)] pub struct Body { - pub head: Head, - pub upper_torso: UpperTorso, - pub lower_torso: LowerTorso, - pub shoulder_l: ShoulderL, - pub shoulder_r: ShoulderR, - pub hand_l: HandL, - pub hand_r: HandR, - pub leg_l: LegL, - pub leg_r: LegR, - pub foot_l: FootL, - pub foot_r: FootR, + pub species: Species, + pub body_type: BodyType, } + impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - Self { - head: *(&ALL_HEADS).choose(&mut rng).unwrap(), - upper_torso: *(&ALL_UPPER_TORSOS).choose(&mut rng).unwrap(), - lower_torso: *(&ALL_LOWER_TORSOS).choose(&mut rng).unwrap(), - shoulder_l: *(&ALL_SHOULDER_LS).choose(&mut rng).unwrap(), - shoulder_r: *(&ALL_SHOULDER_RS).choose(&mut rng).unwrap(), - hand_l: *(&ALL_HAND_LS).choose(&mut rng).unwrap(), - hand_r: *(&ALL_HAND_RS).choose(&mut rng).unwrap(), - leg_l: *(&ALL_LEG_LS).choose(&mut rng).unwrap(), - leg_r: *(&ALL_LEG_RS).choose(&mut rng).unwrap(), - foot_l: *(&ALL_FOOT_LS).choose(&mut rng).unwrap(), - foot_r: *(&ALL_FOOT_RS).choose(&mut rng).unwrap(), - } + let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let body_type = *(&ALL_BODY_TYPES).choose(&mut rng).unwrap(); + Self { species, body_type } } } #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(u32)] -pub enum Head { - Default, +pub enum Species { + Giant = 0, } -const ALL_HEADS: [Head; 1] = [Head::Default]; +pub const ALL_SPECIES: [Species; 1] = [Species::Giant]; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(u32)] -pub enum UpperTorso { - Default, +pub enum BodyType { + Female = 0, + Male = 1, } -const ALL_UPPER_TORSOS: [UpperTorso; 1] = [UpperTorso::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum LowerTorso { - Default, -} -const ALL_LOWER_TORSOS: [LowerTorso; 1] = [LowerTorso::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum ShoulderL { - Default, -} -const ALL_SHOULDER_LS: [ShoulderL; 1] = [ShoulderL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum ShoulderR { - Default, -} -const ALL_SHOULDER_RS: [ShoulderR; 1] = [ShoulderR::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum HandL { - Default, -} -const ALL_HAND_LS: [HandL; 1] = [HandL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum HandR { - Default, -} -const ALL_HAND_RS: [HandR; 1] = [HandR::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum LegL { - Default, -} -const ALL_LEG_LS: [LegL; 1] = [LegL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum LegR { - Default, -} -const ALL_LEG_RS: [LegR; 1] = [LegR::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootL { - Default, -} -const ALL_FOOT_LS: [FootL; 1] = [FootL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootR { - Default, -} -const ALL_FOOT_RS: [FootR; 1] = [FootR::Default]; +pub const ALL_BODY_TYPES: [BodyType; 2] = [BodyType::Female, BodyType::Male]; diff --git a/common/src/comp/body/bird_medium.rs b/common/src/comp/body/bird_medium.rs index d4aafb1fcd..dbf27b56f3 100644 --- a/common/src/comp/body/bird_medium.rs +++ b/common/src/comp/body/bird_medium.rs @@ -3,74 +3,38 @@ use rand::{seq::SliceRandom, thread_rng}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(C)] pub struct Body { - pub head: Head, - pub torso: Torso, - pub tail: Tail, - pub wing_l: WingL, - pub wing_r: WingR, - pub leg_l: LegL, - pub leg_r: LegR, + pub species: Species, + pub body_type: BodyType, } + impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - Self { - head: *(&ALL_HEADS).choose(&mut rng).unwrap(), - torso: *(&ALL_TORSOS).choose(&mut rng).unwrap(), - tail: *(&ALL_TAILS).choose(&mut rng).unwrap(), - wing_l: *(&ALL_WING_LS).choose(&mut rng).unwrap(), - wing_r: *(&ALL_WING_RS).choose(&mut rng).unwrap(), - leg_l: *(&ALL_LEG_LS).choose(&mut rng).unwrap(), - leg_r: *(&ALL_LEG_RS).choose(&mut rng).unwrap(), - } + let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let body_type = *(&ALL_BODY_TYPES).choose(&mut rng).unwrap(); + Self { species, body_type } } } #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(u32)] -pub enum Head { - Default, +pub enum Species { + Duck = 0, + Chicken = 1, + Goose = 2, + Peacock = 3, } -const ALL_HEADS: [Head; 1] = [Head::Default]; +pub const ALL_SPECIES: [Species; 4] = [ + Species::Duck, + Species::Chicken, + Species::Goose, + Species::Peacock, +]; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(u32)] -pub enum Torso { - Default, +pub enum BodyType { + Female = 0, + Male = 1, } -const ALL_TORSOS: [Torso; 1] = [Torso::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum Tail { - Default, -} -const ALL_TAILS: [Tail; 1] = [Tail::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum WingL { - Default, -} -const ALL_WING_LS: [WingL; 1] = [WingL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum WingR { - Default, -} -const ALL_WING_RS: [WingR; 1] = [WingR::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum LegL { - Default, -} -const ALL_LEG_LS: [LegL; 1] = [LegL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum LegR { - Default, -} -const ALL_LEG_RS: [LegR; 1] = [LegR::Default]; +pub const ALL_BODY_TYPES: [BodyType; 2] = [BodyType::Female, BodyType::Male]; diff --git a/common/src/comp/body/critter.rs b/common/src/comp/body/critter.rs new file mode 100644 index 0000000000..622ac03167 --- /dev/null +++ b/common/src/comp/body/critter.rs @@ -0,0 +1,44 @@ +use rand::{seq::SliceRandom, thread_rng}; + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(C)] +pub struct Body { + pub species: Species, + pub body_type: BodyType, +} + +impl Body { + pub fn random() -> Self { + let mut rng = thread_rng(); + let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let body_type = *(&ALL_BODY_TYPES).choose(&mut rng).unwrap(); + Self { species, body_type } + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(u32)] +pub enum Species { + Rat = 0, + Axolotl = 1, + Gecko = 2, + Turtle = 3, + Squirrel = 4, + Fungome = 5, +} +pub const ALL_SPECIES: [Species; 6] = [ + Species::Rat, + Species::Axolotl, + Species::Gecko, + Species::Turtle, + Species::Squirrel, + Species::Fungome, +]; + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(u32)] +pub enum BodyType { + Female = 0, + Male = 1, +} +pub const ALL_BODY_TYPES: [BodyType; 2] = [BodyType::Female, BodyType::Male]; diff --git a/common/src/comp/body/giant.rs b/common/src/comp/body/giant.rs index 64b6d520d0..2980f6651c 100644 --- a/common/src/comp/body/giant.rs +++ b/common/src/comp/body/giant.rs @@ -6,7 +6,7 @@ pub struct Body { pub head: Head, pub shoulder: Shoulder, pub chest: Chest, - pub hand: Hand + pub hand: Hand, pub belt: Belt, pub pants: Pants, pub foot: Foot, diff --git a/common/src/comp/body/quadruped_medium.rs b/common/src/comp/body/quadruped_medium.rs index 8bef83af4b..71362d7e42 100644 --- a/common/src/comp/body/quadruped_medium.rs +++ b/common/src/comp/body/quadruped_medium.rs @@ -3,111 +3,46 @@ use rand::{seq::SliceRandom, thread_rng}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(C)] pub struct Body { - pub head_upper: HeadUpper, - pub jaw: Jaw, - pub head_lower: HeadLower, - pub tail: Tail, - pub torso_back: TorsoBack, - pub torso_mid: TorsoMid, - pub ears: Ears, - pub foot_lf: FootLF, - pub foot_rf: FootRF, - pub foot_lb: FootLB, - pub foot_rb: FootRB, + pub species: Species, + pub body_type: BodyType, } impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - Self { - head_upper: *(&ALL_HEADS_UPPER).choose(&mut rng).unwrap(), - jaw: *(&ALL_JAWS).choose(&mut rng).unwrap(), - head_lower: *(&ALL_HEADS_LOWER).choose(&mut rng).unwrap(), - tail: *(&ALL_TAILS).choose(&mut rng).unwrap(), - torso_back: *(&ALL_TORSOS_BACK).choose(&mut rng).unwrap(), - torso_mid: *(&ALL_TORSOS_MID).choose(&mut rng).unwrap(), - ears: *(&ALL_EARS).choose(&mut rng).unwrap(), - foot_lf: *(&ALL_FEETS_LF).choose(&mut rng).unwrap(), - foot_rf: *(&ALL_FEETS_RF).choose(&mut rng).unwrap(), - foot_lb: *(&ALL_FEETS_LB).choose(&mut rng).unwrap(), - foot_rb: *(&ALL_FEETS_RB).choose(&mut rng).unwrap(), - } + let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let body_type = *(&ALL_BODY_TYPES).choose(&mut rng).unwrap(); + Self { species, body_type } } } #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(u32)] -pub enum HeadUpper { - Default, +pub enum Species { + Wolf = 0, + Saber = 1, + Viper = 2, + Tuskram = 3, + Alligator = 4, + Monitor = 5, + Lion = 6, + Tarasque = 7, } -const ALL_HEADS_UPPER: [HeadUpper; 1] = [HeadUpper::Default]; +pub const ALL_SPECIES: [Species; 8] = [ + Species::Wolf, + Species::Saber, + Species::Viper, + Species::Tuskram, + Species::Alligator, + Species::Monitor, + Species::Lion, + Species::Tarasque, +]; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(u32)] -pub enum Jaw { - Default, +pub enum BodyType { + Female = 0, + Male = 1, } -const ALL_JAWS: [Jaw; 1] = [Jaw::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum HeadLower { - Default, -} -const ALL_HEADS_LOWER: [HeadLower; 1] = [HeadLower::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum Tail { - Default, -} -const ALL_TAILS: [Tail; 1] = [Tail::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum TorsoBack { - Default, -} -const ALL_TORSOS_BACK: [TorsoBack; 1] = [TorsoBack::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum TorsoMid { - Default, -} -const ALL_TORSOS_MID: [TorsoMid; 1] = [TorsoMid::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum Ears { - Default, -} -const ALL_EARS: [Ears; 1] = [Ears::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootLF { - Default, -} -const ALL_FEETS_LF: [FootLF; 1] = [FootLF::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootRF { - Default, -} -const ALL_FEETS_RF: [FootRF; 1] = [FootRF::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootLB { - Default, -} -const ALL_FEETS_LB: [FootLB; 1] = [FootLB::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootRB { - Default, -} -const ALL_FEETS_RB: [FootRB; 1] = [FootRB::Default]; +pub const ALL_BODY_TYPES: [BodyType; 2] = [BodyType::Female, BodyType::Male]; diff --git a/common/src/comp/body/quadruped_small.rs b/common/src/comp/body/quadruped_small.rs index 0ce02d68d3..7a24087a26 100644 --- a/common/src/comp/body/quadruped_small.rs +++ b/common/src/comp/body/quadruped_small.rs @@ -1,45 +1,56 @@ use rand::{seq::SliceRandom, thread_rng}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(C)] pub struct Body { - pub head: Head, - pub chest: Chest, - pub leg_l: LegL, - pub leg_r: LegR, + pub species: Species, + pub body_type: BodyType, } impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - Self { - head: *(&ALL_HEADS).choose(&mut rng).unwrap(), - chest: *(&ALL_CHESTS).choose(&mut rng).unwrap(), - leg_l: *(&ALL_LEGS_L).choose(&mut rng).unwrap(), - leg_r: *(&ALL_LEGS_R).choose(&mut rng).unwrap(), - } + let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + let body_type = *(&ALL_BODY_TYPES).choose(&mut rng).unwrap(); + Self { species, body_type } } } #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum Head { - Default, +#[repr(u32)] +pub enum Species { + Pig = 0, + Fox = 1, + Sheep = 2, + Boar = 3, + Jackalope = 4, + Skunk = 5, + Cat = 6, + Batfox = 7, + Raccoon = 8, + Quokka = 9, + Dodarock = 10, + Holladon = 11, } -const ALL_HEADS: [Head; 1] = [Head::Default]; +pub const ALL_SPECIES: [Species; 12] = [ + Species::Pig, + Species::Fox, + Species::Sheep, + Species::Boar, + Species::Jackalope, + Species::Skunk, + Species::Cat, + Species::Batfox, + Species::Raccoon, + Species::Quokka, + Species::Dodarock, + Species::Holladon, +]; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum Chest { - Default, +#[repr(u32)] +pub enum BodyType { + Female = 0, + Male = 1, } -const ALL_CHESTS: [Chest; 1] = [Chest::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum LegL { - Default, -} -const ALL_LEGS_L: [LegL; 1] = [LegL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum LegR { - Default, -} -const ALL_LEGS_R: [LegR; 1] = [LegR::Default]; +pub const ALL_BODY_TYPES: [BodyType; 2] = [BodyType::Female, BodyType::Male]; diff --git a/common/src/comp/mod.rs b/common/src/comp/mod.rs index 21f6114608..f084736af2 100644 --- a/common/src/comp/mod.rs +++ b/common/src/comp/mod.rs @@ -18,8 +18,8 @@ mod visual; pub use admin::Admin; pub use agent::Agent; pub use body::{ - biped_large, bird_medium, bird_small, dragon, fish_medium, fish_small, humanoid, object, - quadruped_medium, quadruped_small, Body, + biped_large, bird_medium, bird_small, critter, dragon, fish_medium, fish_small, humanoid, + object, quadruped_medium, quadruped_small, Body, }; pub use character_state::{ActionState, CharacterState, MovementState}; pub use controller::{ diff --git a/common/src/npc.rs b/common/src/npc.rs index 161217e5e7..c2412f341e 100644 --- a/common/src/npc.rs +++ b/common/src/npc.rs @@ -10,6 +10,9 @@ pub enum NpcKind { Humanoid, Wolf, Pig, + Duck, + Giant, + Rat, } impl NpcKind { @@ -18,6 +21,9 @@ impl NpcKind { NpcKind::Humanoid => "humanoid", NpcKind::Wolf => "wolf", NpcKind::Pig => "pig", + NpcKind::Duck => "duck", + NpcKind::Giant => "giant", + NpcKind::Rat => "rat", } } } @@ -30,6 +36,9 @@ impl FromStr for NpcKind { "humanoid" => Ok(NpcKind::Humanoid), "wolf" => Ok(NpcKind::Wolf), "pig" => Ok(NpcKind::Pig), + "duck" => Ok(NpcKind::Duck), + "giant" => Ok(NpcKind::Giant), + "rat" => Ok(NpcKind::Rat), _ => Err(()), } diff --git a/common/src/terrain/structure.rs b/common/src/terrain/structure.rs index 65a5ba7000..2c6947a062 100644 --- a/common/src/terrain/structure.rs +++ b/common/src/terrain/structure.rs @@ -16,7 +16,8 @@ pub enum StructureBlock { PineLeaves, Acacia, Mangrove, - PalmLeaves, + PalmLeavesInner, + PalmLeavesOuter, Water, GreenSludge, Fruit, @@ -110,7 +111,6 @@ impl Asset for Structure { let block = match voxel.i { 0 => StructureBlock::TemperateLeaves, 1 => StructureBlock::PineLeaves, - 2 => StructureBlock::PalmLeaves, 3 => StructureBlock::Water, 4 => StructureBlock::Acacia, 5 => StructureBlock::Mangrove, @@ -118,6 +118,8 @@ impl Asset for Structure { 7 => StructureBlock::Fruit, 9 => StructureBlock::Liana, 10 => StructureBlock::Chest, + 13 => StructureBlock::PalmLeavesOuter, + 14 => StructureBlock::PalmLeavesInner, 15 => StructureBlock::Hollow, index => { let color = palette diff --git a/server/src/cmd.rs b/server/src/cmd.rs index 6171238892..38b0c11796 100644 --- a/server/src/cmd.rs +++ b/server/src/cmd.rs @@ -644,6 +644,9 @@ fn kind_to_body(kind: NpcKind) -> comp::Body { NpcKind::Humanoid => comp::Body::Humanoid(comp::humanoid::Body::random()), NpcKind::Pig => comp::Body::QuadrupedSmall(comp::quadruped_small::Body::random()), NpcKind::Wolf => comp::Body::QuadrupedMedium(comp::quadruped_medium::Body::random()), + NpcKind::Duck => comp::Body::BirdMedium(comp::bird_medium::Body::random()), + NpcKind::Giant => comp::Body::BipedLarge(comp::biped_large::Body::random()), + NpcKind::Rat => comp::Body::Critter(comp::critter::Body::random()), } } diff --git a/server/src/sys/terrain.rs b/server/src/sys/terrain.rs index 283a429329..ab96fa7d25 100644 --- a/server/src/sys/terrain.rs +++ b/server/src/sys/terrain.rs @@ -8,7 +8,7 @@ use common::{ state::TerrainChanges, terrain::TerrainGrid, }; -use rand::Rng; +use rand::{seq::SliceRandom, Rng}; use specs::{Join, Read, ReadStorage, System, Write, WriteExpect, WriteStorage}; use std::sync::Arc; use vek::*; @@ -96,19 +96,49 @@ impl<'a> System<'a> for Sys { // Handle chunk supplement for npc in supplement.npcs { - let (mut stats, mut body) = if rand::random() { - let body = comp::Body::Humanoid(comp::humanoid::Body::random()); - let stats = comp::Stats::new( - "Traveler".to_string(), - body, - Some(assets::load_expect_cloned("common.items.weapons.staff_1")), - ); - (stats, body) - } else { - let body = comp::Body::QuadrupedMedium(comp::quadruped_medium::Body::random()); - let stats = comp::Stats::new("Wolf".to_string(), body, None); - (stats, body) - }; + const SPAWN_NPCS: &'static [fn() -> (String, comp::Body, Option)] = &[ + (|| { + ( + "Traveler".into(), + comp::Body::Humanoid(comp::humanoid::Body::random()), + Some(assets::load_expect_cloned("common.items.weapons.staff_1")), + ) + }) as _, + (|| { + ( + "Wolf".into(), + comp::Body::QuadrupedMedium(comp::quadruped_medium::Body::random()), + None, + ) + }) as _, + (|| { + ( + "Duck".into(), + comp::Body::BirdMedium(comp::bird_medium::Body::random()), + None, + ) + }) as _, + (|| { + ( + "Rat".into(), + comp::Body::Critter(comp::critter::Body::random()), + None, + ) + }) as _, + (|| { + ( + "Pig".into(), + comp::Body::QuadrupedSmall(comp::quadruped_small::Body::random()), + None, + ) + }), + ]; + let (name, mut body, main) = SPAWN_NPCS + .choose(&mut rand::thread_rng()) + .expect("SPAWN_NPCS is nonempty")( + ); + let mut stats = comp::Stats::new(name, body, main); + let mut scale = 1.0; // TODO: Remove this and implement scaling or level depending on stuff like species instead diff --git a/voxygen/src/anim/biped_large/idle.rs b/voxygen/src/anim/biped_large/idle.rs index 4f74e1eee4..be4b954151 100644 --- a/voxygen/src/anim/biped_large/idle.rs +++ b/voxygen/src/anim/biped_large/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BipedLargeSkeleton, -}; +use super::{super::Animation, BipedLargeSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; @@ -22,35 +19,35 @@ impl Animation for IdleAnimation { next.head.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.head.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.head.scale = Vec3::one() / 10.88; + next.head.scale = Vec3::one() / 11.0; next.upper_torso.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.upper_torso.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.upper_torso.scale = Vec3::one() / 10.88; + next.upper_torso.scale = Vec3::one() / 11.0; next.lower_torso.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.lower_torso.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.lower_torso.scale = Vec3::one() / 10.88; + next.lower_torso.scale = Vec3::one(); next.shoulder_l.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.shoulder_l.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.shoulder_l.scale = Vec3::one() / 10.88; + next.shoulder_l.scale = Vec3::one(); next.shoulder_r.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.shoulder_r.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.shoulder_r.scale = Vec3::one() / 10.88; + next.shoulder_r.scale = Vec3::one(); next.hand_l.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.hand_l.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.hand_l.scale = Vec3::one() / 10.88; + next.hand_l.scale = Vec3::one(); next.hand_r.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.hand_r.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.hand_r.scale = Vec3::one() / 10.88; + next.hand_r.scale = Vec3::one(); next.leg_l.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.leg_l.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.leg_l.scale = Vec3::one() / 10.88; + next.leg_l.scale = Vec3::one() / 11.0; next.leg_r.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.leg_r.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); @@ -58,11 +55,11 @@ impl Animation for IdleAnimation { next.foot_l.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.foot_l.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.foot_l.scale = Vec3::one() / 10.88; + next.foot_l.scale = Vec3::one(); next.foot_r.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; next.foot_r.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.foot_r.scale = Vec3::one() / 10.88; + next.foot_r.scale = Vec3::one(); next } } diff --git a/voxygen/src/anim/biped_large/jump.rs b/voxygen/src/anim/biped_large/jump.rs index 0494cf0bb8..2eeaeac103 100644 --- a/voxygen/src/anim/biped_large/jump.rs +++ b/voxygen/src/anim/biped_large/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BipedLargeSkeleton, -}; +use super::{super::Animation, BipedLargeSkeleton, SkeletonAttr}; //use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/biped_large/mod.rs b/voxygen/src/anim/biped_large/mod.rs index b1bc01d4ce..0ce749b79b 100644 --- a/voxygen/src/anim/biped_large/mod.rs +++ b/voxygen/src/anim/biped_large/mod.rs @@ -9,6 +9,7 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; #[derive(Clone)] pub struct BipedLargeSkeleton { @@ -44,6 +45,7 @@ impl BipedLargeSkeleton { } impl Skeleton for BipedLargeSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { let upper_torso_mat = self.upper_torso.compute_base_matrix(); let shoulder_l_mat = self.shoulder_l.compute_base_matrix(); @@ -89,3 +91,28 @@ impl Skeleton for BipedLargeSkeleton { self.foot_r.interpolate(&target.foot_r, dt); } } + +pub struct SkeletonAttr; + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::BipedLarge(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self + } +} + +impl<'a> From<&'a comp::biped_large::Body> for SkeletonAttr { + fn from(_body: &'a comp::biped_large::Body) -> Self { + Self + } +} diff --git a/voxygen/src/anim/biped_large/run.rs b/voxygen/src/anim/biped_large/run.rs index 4f77065716..5ca044d279 100644 --- a/voxygen/src/anim/biped_large/run.rs +++ b/voxygen/src/anim/biped_large/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BipedLargeSkeleton, -}; +use super::{super::Animation, BipedLargeSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/bird_medium/idle.rs b/voxygen/src/anim/bird_medium/idle.rs index e14e48887c..c7428b89c6 100644 --- a/voxygen/src/anim/bird_medium/idle.rs +++ b/voxygen/src/anim/bird_medium/idle.rs @@ -1,8 +1,5 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BirdMediumSkeleton, -}; -//use std::{f32::consts::PI, ops::Mul}; +use super::{super::Animation, BirdMediumSkeleton, SkeletonAttr}; +use std::ops::Mul; use vek::*; pub struct IdleAnimation; @@ -13,40 +10,77 @@ impl Animation for IdleAnimation { fn update_skeleton( skeleton: &Self::Skeleton, - _global_time: Self::Dependency, - _anim_time: f64, + global_time: Self::Dependency, + anim_time: f64, _rate: &mut f32, - _skeleton_attr: &SkeletonAttr, + skeleton_attr: &SkeletonAttr, ) -> Self::Skeleton { let mut next = (*skeleton).clone(); - next.head.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; - next.head.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.head.scale = Vec3::one() / 10.88; + let wave_slow = (anim_time as f32 * 3.5).sin(); + let wave_slow_cos = (anim_time as f32 * 3.5).cos(); - next.torso.offset = Vec3::new(0.0, 4.5, 2.0); - next.torso.ori = Quaternion::rotation_x(0.0); - next.torso.scale = Vec3::one() * 1.01; + let duck_head_look = Vec2::new( + ((global_time + anim_time) as f32 / 8.0) + .floor() + .mul(7331.0) + .sin() + * 0.5, + ((global_time + anim_time) as f32 / 8.0) + .floor() + .mul(1337.0) + .sin() + * 0.25, + ); - next.tail.offset = Vec3::new(0.0, 3.1, -4.5); - next.tail.ori = Quaternion::rotation_z(0.0); - next.tail.scale = Vec3::one() * 0.98; + next.head.offset = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1) / 11.0; + next.head.ori = Quaternion::rotation_z(duck_head_look.x) + * Quaternion::rotation_x(duck_head_look.y + wave_slow_cos * 0.03); + next.head.scale = Vec3::one(); - next.wing_l.offset = Vec3::new(0.0, -13.0, 8.0) / 11.0; - next.wing_l.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.wing_l.scale = Vec3::one() / 11.0; + next.torso.offset = Vec3::new( + 0.0, + skeleton_attr.chest.0, + wave_slow * 0.3 + skeleton_attr.chest.1, + ) / 11.0; + next.torso.ori = Quaternion::rotation_y(wave_slow * 0.03); + next.torso.scale = Vec3::one() / 11.0; - next.wing_r.offset = Vec3::new(0.0, -11.7, 11.0) / 11.0; + next.tail.offset = Vec3::new(0.0, skeleton_attr.tail.0, skeleton_attr.tail.1) / 11.0; + next.tail.ori = Quaternion::rotation_x(wave_slow_cos * 0.03); + next.tail.scale = Vec3::one(); + + next.wing_l.offset = Vec3::new( + -skeleton_attr.wing.0, + skeleton_attr.wing.1, + skeleton_attr.wing.2, + ) / 11.0; + next.wing_l.ori = Quaternion::rotation_z(0.0); + next.wing_l.scale = Vec3::one() * 1.05; + + next.wing_r.offset = Vec3::new( + skeleton_attr.wing.0, + skeleton_attr.wing.1, + skeleton_attr.wing.2, + ) / 11.0; next.wing_r.ori = Quaternion::rotation_y(0.0); - next.wing_r.scale = Vec3::one() / 11.0; + next.wing_r.scale = Vec3::one() * 1.05; - next.leg_l.offset = Vec3::new(0.0, 0.0, 12.0) / 11.0; + next.leg_l.offset = Vec3::new( + -skeleton_attr.foot.0, + skeleton_attr.foot.1, + skeleton_attr.foot.2, + ) / 11.0; next.leg_l.ori = Quaternion::rotation_y(0.0); - next.leg_l.scale = Vec3::one() / 10.5; + next.leg_l.scale = Vec3::one() / 11.0; - next.leg_r.offset = Vec3::new(0.0, 0.75, 5.25); + next.leg_r.offset = Vec3::new( + skeleton_attr.foot.0, + skeleton_attr.foot.1, + skeleton_attr.foot.2, + ) / 11.0; next.leg_r.ori = Quaternion::rotation_x(0.0); - next.leg_r.scale = Vec3::one() * 1.00; + next.leg_r.scale = Vec3::one() / 11.0; next } } diff --git a/voxygen/src/anim/bird_medium/jump.rs b/voxygen/src/anim/bird_medium/jump.rs index 14d57abe9b..f1c5fdec59 100644 --- a/voxygen/src/anim/bird_medium/jump.rs +++ b/voxygen/src/anim/bird_medium/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BirdMediumSkeleton, -}; +use super::{super::Animation, BirdMediumSkeleton, SkeletonAttr}; //use std::f32::consts::PI; use vek::*; @@ -20,33 +17,33 @@ impl Animation for JumpAnimation { ) -> Self::Skeleton { let mut next = (*skeleton).clone(); - next.head.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; - next.head.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.head.scale = Vec3::one() / 10.88; + next.head.offset = Vec3::new(0.0, 0.0, 0.0) / 11.0; + next.head.ori = Quaternion::rotation_z(0.0); + next.head.scale = Vec3::one(); - next.torso.offset = Vec3::new(0.0, 4.5, 2.0); + next.torso.offset = Vec3::new(0.0, 0.0, 0.0); next.torso.ori = Quaternion::rotation_x(0.0); - next.torso.scale = Vec3::one() * 1.01; + next.torso.scale = Vec3::one() / 11.0; - next.tail.offset = Vec3::new(0.0, 3.1, -4.5); + next.tail.offset = Vec3::new(0.0, 0.0, 0.0); next.tail.ori = Quaternion::rotation_z(0.0); - next.tail.scale = Vec3::one() * 0.98; + next.tail.scale = Vec3::one(); - next.wing_l.offset = Vec3::new(0.0, -13.0, 8.0) / 11.0; - next.wing_l.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.wing_l.scale = Vec3::one() / 11.0; + next.wing_l.offset = Vec3::new(0.0, 0.0, 0.0) / 11.0; + next.wing_l.ori = Quaternion::rotation_z(0.0); + next.wing_l.scale = Vec3::one(); - next.wing_r.offset = Vec3::new(0.0, -11.7, 11.0) / 11.0; + next.wing_r.offset = Vec3::new(0.0, 0.0, 0.0) / 11.0; next.wing_r.ori = Quaternion::rotation_y(0.0); - next.wing_r.scale = Vec3::one() / 11.0; + next.wing_r.scale = Vec3::one(); - next.leg_l.offset = Vec3::new(0.0, 0.0, 12.0) / 11.0; + next.leg_l.offset = Vec3::new(0.0, 0.0, 0.0) / 11.0; next.leg_l.ori = Quaternion::rotation_y(0.0); - next.leg_l.scale = Vec3::one() / 10.5; + next.leg_l.scale = Vec3::one() / 11.0; - next.leg_r.offset = Vec3::new(0.0, 0.75, 5.25); + next.leg_r.offset = Vec3::new(0.0, 0.0, 0.0) / 11.0; next.leg_r.ori = Quaternion::rotation_x(0.0); - next.leg_r.scale = Vec3::one() * 1.00; + next.leg_r.scale = Vec3::one() / 11.0; next } } diff --git a/voxygen/src/anim/bird_medium/mod.rs b/voxygen/src/anim/bird_medium/mod.rs index 0ed048b719..919fc6eeb3 100644 --- a/voxygen/src/anim/bird_medium/mod.rs +++ b/voxygen/src/anim/bird_medium/mod.rs @@ -9,8 +9,9 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; -#[derive(Clone)] +#[derive(Clone, Default)] pub struct BirdMediumSkeleton { head: Bone, torso: Bone, @@ -23,19 +24,12 @@ pub struct BirdMediumSkeleton { impl BirdMediumSkeleton { pub fn new() -> Self { - Self { - head: Bone::default(), - torso: Bone::default(), - tail: Bone::default(), - wing_l: Bone::default(), - wing_r: Bone::default(), - leg_l: Bone::default(), - leg_r: Bone::default(), - } + Self::default() } } impl Skeleton for BirdMediumSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { let torso_mat = self.torso.compute_base_matrix(); @@ -69,3 +63,72 @@ impl Skeleton for BirdMediumSkeleton { self.leg_r.interpolate(&target.leg_r, dt); } } + +pub struct SkeletonAttr { + head: (f32, f32), + chest: (f32, f32), + tail: (f32, f32), + wing: (f32, f32, f32), + foot: (f32, f32, f32), +} + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::BirdMedium(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self { + head: (0.0, 0.0), + chest: (0.0, 0.0), + tail: (0.0, 0.0), + wing: (0.0, 0.0, 0.0), + foot: (0.0, 0.0, 0.0), + } + } +} + +impl<'a> From<&'a comp::bird_medium::Body> for SkeletonAttr { + fn from(body: &'a comp::bird_medium::Body) -> Self { + use comp::bird_medium::Species::*; + Self { + head: match (body.species, body.body_type) { + (Duck, _) => (4.0, 4.0), + (Chicken, _) => (4.0, 4.0), + (Goose, _) => (5.0, 5.0), + (Peacock, _) => (5.0, 6.0), + }, + chest: match (body.species, body.body_type) { + (Duck, _) => (0.0, 6.0), + (Chicken, _) => (0.0, 6.0), + (Goose, _) => (0.0, 8.0), + (Peacock, _) => (0.0, 9.0), + }, + tail: match (body.species, body.body_type) { + (Duck, _) => (-3.5, 3.0), + (Chicken, _) => (-3.5, 3.0), + (Goose, _) => (-5.0, 3.0), + (Peacock, _) => (-5.0, 2.0), + }, + wing: match (body.species, body.body_type) { + (Duck, _) => (2.75, 0.0, 0.0), + (Chicken, _) => (2.75, 0.0, 0.0), + (Goose, _) => (3.75, 0.0, 0.0), + (Peacock, _) => (3.0, 0.0, 0.0), + }, + foot: match (body.species, body.body_type) { + (Duck, _) => (2.0, 0.0, 4.0), + (Chicken, _) => (2.0, 0.0, 4.0), + (Goose, _) => (2.0, 0.0, 3.0), + (Peacock, _) => (2.0, 0.5, 3.0), + }, + } + } +} diff --git a/voxygen/src/anim/bird_medium/run.rs b/voxygen/src/anim/bird_medium/run.rs index 11f825cb96..70c8d9f5e3 100644 --- a/voxygen/src/anim/bird_medium/run.rs +++ b/voxygen/src/anim/bird_medium/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BirdMediumSkeleton, -}; +use super::{super::Animation, BirdMediumSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; @@ -14,39 +11,63 @@ impl Animation for RunAnimation { fn update_skeleton( skeleton: &Self::Skeleton, (_velocity, _global_time): Self::Dependency, - _anim_time: f64, + anim_time: f64, _rate: &mut f32, - _skeleton_attr: &SkeletonAttr, + skeleton_attr: &SkeletonAttr, ) -> Self::Skeleton { let mut next = (*skeleton).clone(); - next.head.offset = Vec3::new(0.0, 7.5, 15.0) / 11.0; - next.head.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.head.scale = Vec3::one() / 10.88; + let wave = (anim_time as f32 * 18.0).sin(); + let wave_cos = (anim_time as f32 * 18.0).cos(); - next.torso.offset = Vec3::new(0.0, 4.5, 2.0); - next.torso.ori = Quaternion::rotation_x(0.0); - next.torso.scale = Vec3::one() * 1.01; + next.head.offset = + Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1 + wave * 0.5) / 11.0; + next.head.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0 + wave_cos * 0.03); + next.head.scale = Vec3::one(); - next.tail.offset = Vec3::new(0.0, 3.1, -4.5); - next.tail.ori = Quaternion::rotation_z(0.0); - next.tail.scale = Vec3::one() * 0.98; + next.torso.offset = Vec3::new( + 0.0, + skeleton_attr.chest.0, + wave * 0.3 + skeleton_attr.chest.1, + ) / 11.0; + next.torso.ori = Quaternion::rotation_y(wave * 0.03); + next.torso.scale = Vec3::one() / 11.0; - next.wing_l.offset = Vec3::new(0.0, -13.0, 8.0) / 11.0; - next.wing_l.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0); - next.wing_l.scale = Vec3::one() / 11.0; + next.tail.offset = Vec3::new(0.0, skeleton_attr.tail.0, skeleton_attr.tail.1) / 11.0; + next.tail.ori = Quaternion::rotation_x(wave_cos * 0.03); + next.tail.scale = Vec3::one(); - next.wing_r.offset = Vec3::new(0.0, -11.7, 11.0) / 11.0; + next.wing_l.offset = Vec3::new( + -skeleton_attr.wing.0, + skeleton_attr.wing.1, + skeleton_attr.wing.2, + ) / 11.0; + next.wing_l.ori = Quaternion::rotation_z(0.0); + next.wing_l.scale = Vec3::one() * 1.05; + + next.wing_r.offset = Vec3::new( + skeleton_attr.wing.0, + skeleton_attr.wing.1, + skeleton_attr.wing.2, + ) / 11.0; next.wing_r.ori = Quaternion::rotation_y(0.0); - next.wing_r.scale = Vec3::one() / 11.0; + next.wing_r.scale = Vec3::one() * 1.05; - next.leg_l.offset = Vec3::new(0.0, 0.0, 12.0) / 11.0; - next.leg_l.ori = Quaternion::rotation_y(0.0); - next.leg_l.scale = Vec3::one() / 10.5; + next.leg_l.offset = Vec3::new( + -skeleton_attr.foot.0, + skeleton_attr.foot.1, + skeleton_attr.foot.2, + ) / 11.0; + next.leg_l.ori = Quaternion::rotation_x(wave_cos * 1.0); + next.leg_l.scale = Vec3::one() / 11.0; - next.leg_r.offset = Vec3::new(0.0, 0.75, 5.25); - next.leg_r.ori = Quaternion::rotation_x(0.0); - next.leg_r.scale = Vec3::one() * 1.00; + next.leg_r.offset = Vec3::new( + skeleton_attr.foot.0, + skeleton_attr.foot.1, + skeleton_attr.foot.2, + ) / 11.0; + next.leg_r.ori = Quaternion::rotation_x(wave * 1.0); + next.leg_r.scale = Vec3::one() / 11.0; next } } diff --git a/voxygen/src/anim/bird_small/idle.rs b/voxygen/src/anim/bird_small/idle.rs index 9f9c207c29..4654f3553c 100644 --- a/voxygen/src/anim/bird_small/idle.rs +++ b/voxygen/src/anim/bird_small/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BirdSmallSkeleton, -}; +use super::{super::Animation, BirdSmallSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/bird_small/jump.rs b/voxygen/src/anim/bird_small/jump.rs index 21dd935088..c0416368e2 100644 --- a/voxygen/src/anim/bird_small/jump.rs +++ b/voxygen/src/anim/bird_small/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BirdSmallSkeleton, -}; +use super::{super::Animation, BirdSmallSkeleton, SkeletonAttr}; //use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/bird_small/mod.rs b/voxygen/src/anim/bird_small/mod.rs index dff5671b62..806327d4e6 100644 --- a/voxygen/src/anim/bird_small/mod.rs +++ b/voxygen/src/anim/bird_small/mod.rs @@ -9,6 +9,7 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; #[derive(Clone)] pub struct BirdSmallSkeleton { @@ -30,6 +31,7 @@ impl BirdSmallSkeleton { } impl Skeleton for BirdSmallSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { let torso_mat = self.torso.compute_base_matrix(); @@ -60,3 +62,28 @@ impl Skeleton for BirdSmallSkeleton { self.wing_r.interpolate(&target.wing_r, dt); } } + +pub struct SkeletonAttr; + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::BirdSmall(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self + } +} + +impl<'a> From<&'a comp::bird_small::Body> for SkeletonAttr { + fn from(_body: &'a comp::bird_small::Body) -> Self { + Self + } +} diff --git a/voxygen/src/anim/bird_small/run.rs b/voxygen/src/anim/bird_small/run.rs index 62762cc33f..ecd1e02a1e 100644 --- a/voxygen/src/anim/bird_small/run.rs +++ b/voxygen/src/anim/bird_small/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - BirdSmallSkeleton, -}; +use super::{super::Animation, BirdSmallSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/character/attack.rs b/voxygen/src/anim/character/attack.rs index fa4594822f..8ffb9b5772 100644 --- a/voxygen/src/anim/character/attack.rs +++ b/voxygen/src/anim/character/attack.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/character/block.rs b/voxygen/src/anim/character/block.rs index d5770e49d7..0a42e9dbde 100644 --- a/voxygen/src/anim/character/block.rs +++ b/voxygen/src/anim/character/block.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/character/blockidle.rs b/voxygen/src/anim/character/blockidle.rs index e2bfda6833..d0cdeae593 100644 --- a/voxygen/src/anim/character/blockidle.rs +++ b/voxygen/src/anim/character/blockidle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/character/charge.rs b/voxygen/src/anim/character/charge.rs index 3e39ee86fc..f6a231ffaf 100644 --- a/voxygen/src/anim/character/charge.rs +++ b/voxygen/src/anim/character/charge.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/character/cidle.rs b/voxygen/src/anim/character/cidle.rs index 165331fc7d..9225204497 100644 --- a/voxygen/src/anim/character/cidle.rs +++ b/voxygen/src/anim/character/cidle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::{f32::consts::PI, ops::Mul}; diff --git a/voxygen/src/anim/character/climb.rs b/voxygen/src/anim/character/climb.rs index 84de64db14..1064cd1c94 100644 --- a/voxygen/src/anim/character/climb.rs +++ b/voxygen/src/anim/character/climb.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use vek::*; diff --git a/voxygen/src/anim/character/crun.rs b/voxygen/src/anim/character/crun.rs index b5b0da0140..59d1807a69 100644 --- a/voxygen/src/anim/character/crun.rs +++ b/voxygen/src/anim/character/crun.rs @@ -1,6 +1,6 @@ use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, + super::{Animation, }, + CharacterSkeleton,SkeletonAttr }; use common::comp::item::Tool; use std::f32::consts::PI; diff --git a/voxygen/src/anim/character/gliding.rs b/voxygen/src/anim/character/gliding.rs index d78f8a1142..02cf41e761 100644 --- a/voxygen/src/anim/character/gliding.rs +++ b/voxygen/src/anim/character/gliding.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/character/idle.rs b/voxygen/src/anim/character/idle.rs index 10a7d58c4f..2b252f027f 100644 --- a/voxygen/src/anim/character/idle.rs +++ b/voxygen/src/anim/character/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/character/jump.rs b/voxygen/src/anim/character/jump.rs index 29fb164d83..f1d5f86ae4 100644 --- a/voxygen/src/anim/character/jump.rs +++ b/voxygen/src/anim/character/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/character/mod.rs b/voxygen/src/anim/character/mod.rs index 086c63ea68..be47b1d37a 100644 --- a/voxygen/src/anim/character/mod.rs +++ b/voxygen/src/anim/character/mod.rs @@ -33,8 +33,9 @@ pub use self::wield::WieldAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self, item::Tool}; -#[derive(Clone)] +#[derive(Clone, Default)] pub struct CharacterSkeleton { head: Bone, chest: Bone, @@ -54,26 +55,12 @@ pub struct CharacterSkeleton { impl CharacterSkeleton { pub fn new() -> Self { - Self { - head: Bone::default(), - chest: Bone::default(), - belt: Bone::default(), - shorts: Bone::default(), - l_hand: Bone::default(), - r_hand: Bone::default(), - l_foot: Bone::default(), - r_foot: Bone::default(), - main: Bone::default(), - l_shoulder: Bone::default(), - r_shoulder: Bone::default(), - glider: Bone::default(), - lantern: Bone::default(), - torso: Bone::default(), - } + Self::default() } } impl Skeleton for CharacterSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { let chest_mat = self.chest.compute_base_matrix(); let torso_mat = self.torso.compute_base_matrix(); @@ -118,3 +105,144 @@ impl Skeleton for CharacterSkeleton { self.torso.interpolate(&target.torso, dt); } } + +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 { + 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, + }, + weapon_x: match Tool::Hammer { + // TODO: Inventory + Tool::Sword => 0.0, + Tool::Axe => 3.0, + Tool::Hammer => 0.0, + Tool::Shield => 3.0, + Tool::Staff => 3.0, + Tool::Bow => 0.0, + Tool::Dagger => 0.0, + Tool::Debug(_) => 0.0, + }, + weapon_y: match Tool::Hammer { + // TODO: Inventory + Tool::Sword => -1.25, + Tool::Axe => 0.0, + Tool::Hammer => -2.0, + Tool::Shield => 0.0, + Tool::Staff => 0.0, + Tool::Bow => -2.0, + Tool::Dagger => -2.0, + Tool::Debug(_) => 0.0, + }, + } + } +} diff --git a/voxygen/src/anim/character/roll.rs b/voxygen/src/anim/character/roll.rs index 2e76022b01..88ae08afc8 100644 --- a/voxygen/src/anim/character/roll.rs +++ b/voxygen/src/anim/character/roll.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/character/run.rs b/voxygen/src/anim/character/run.rs index 4e5ae350d6..868330b626 100644 --- a/voxygen/src/anim/character/run.rs +++ b/voxygen/src/anim/character/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::f32::consts::PI; use std::ops::Mul; @@ -140,7 +137,7 @@ impl Animation for RunAnimation { next.lantern.ori = Quaternion::rotation_y(0.0); next.lantern.scale = Vec3::one() * 0.0; - next.torso.offset = Vec3::new(0.0, 0.3 + wave * -0.08, 0.4) * skeleton_attr.scaler; + next.torso.offset = Vec3::new(0.0, -0.3 + wave * -0.08, 0.4) * skeleton_attr.scaler; next.torso.ori = Quaternion::rotation_x(wave_stop * speed * -0.06 + wave_diff * speed * -0.005) * Quaternion::rotation_y(tilt); diff --git a/voxygen/src/anim/character/sit.rs b/voxygen/src/anim/character/sit.rs index 2f1106eb2c..306f337168 100644 --- a/voxygen/src/anim/character/sit.rs +++ b/voxygen/src/anim/character/sit.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/character/sneak.rs b/voxygen/src/anim/character/sneak.rs index d48d9604d5..8872add2fb 100644 --- a/voxygen/src/anim/character/sneak.rs +++ b/voxygen/src/anim/character/sneak.rs @@ -1,6 +1,6 @@ use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, + super::{Animation, }, + CharacterSkeleton,SkeletonAttr }; use std::f32::consts::PI; use std::ops::Mul; diff --git a/voxygen/src/anim/character/stand.rs b/voxygen/src/anim/character/stand.rs index c7f5a47efb..bffcf83673 100644 --- a/voxygen/src/anim/character/stand.rs +++ b/voxygen/src/anim/character/stand.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/character/swim.rs b/voxygen/src/anim/character/swim.rs index e22b827071..1e32be47e1 100644 --- a/voxygen/src/anim/character/swim.rs +++ b/voxygen/src/anim/character/swim.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::f32::consts::PI; use std::ops::Mul; diff --git a/voxygen/src/anim/character/wield.rs b/voxygen/src/anim/character/wield.rs index 9c4d41c10a..426d230ad9 100644 --- a/voxygen/src/anim/character/wield.rs +++ b/voxygen/src/anim/character/wield.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - CharacterSkeleton, -}; +use super::{super::Animation, CharacterSkeleton, SkeletonAttr}; use common::comp::item::Tool; use std::f32::consts::PI; diff --git a/voxygen/src/anim/critter/idle.rs b/voxygen/src/anim/critter/idle.rs new file mode 100644 index 0000000000..47770a7e56 --- /dev/null +++ b/voxygen/src/anim/critter/idle.rs @@ -0,0 +1,64 @@ +use super::{super::Animation, CritterAttr, CritterSkeleton}; +//use std::{f32::consts::PI, ops::Mul}; +use std::{f32::consts::PI, ops::Mul}; +use vek::*; + +pub struct IdleAnimation; + +impl Animation for IdleAnimation { + type Skeleton = CritterSkeleton; + type Dependency = f64; + + fn update_skeleton( + skeleton: &Self::Skeleton, + global_time: Self::Dependency, + anim_time: f64, + _rate: &mut f32, + skeleton_attr: &CritterAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + let wave = (anim_time as f32 * 10.0).sin(); + let wave_slow = (anim_time as f32 * 5.5 + PI).sin(); + + let rat_head_look = Vec2::new( + ((global_time + anim_time) as f32 / 3.0) + .floor() + .mul(7331.0) + .sin() + * 0.5, + ((global_time + anim_time) as f32 / 3.0) + .floor() + .mul(1337.0) + .sin() + * 0.25, + ); + next.head.offset = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1) / 18.0; + next.head.ori = Quaternion::rotation_z(rat_head_look.x) + * Quaternion::rotation_x(rat_head_look.y + wave * 0.03); + next.head.scale = Vec3::one() / 18.0; + + next.chest.offset = Vec3::new( + 0.0, + skeleton_attr.chest.0, + skeleton_attr.chest.1 + wave * 1.0, + ) / 18.0; + next.chest.ori = Quaternion::rotation_y(wave_slow * 0.2); + next.chest.scale = Vec3::one() / 18.0; + + next.feet_f.offset = Vec3::new(0.0, skeleton_attr.feet_f.0, skeleton_attr.feet_f.1) / 18.0; + next.feet_f.ori = Quaternion::rotation_z(0.0); + next.feet_f.scale = Vec3::one() / 18.0; + + next.feet_b.offset = Vec3::new(0.0, skeleton_attr.feet_b.0, skeleton_attr.feet_b.1) / 18.0; + next.feet_b.ori = Quaternion::rotation_x(0.0); + next.feet_b.scale = Vec3::one() / 18.0; + + next.tail.offset = + Vec3::new(0.0, skeleton_attr.tail.0 + wave * 1.0, skeleton_attr.tail.1) / 18.0; + next.tail.ori = Quaternion::rotation_y(wave_slow * 0.25); + next.tail.scale = Vec3::one() / 18.0; + + next + } +} diff --git a/voxygen/src/anim/critter/jump.rs b/voxygen/src/anim/critter/jump.rs new file mode 100644 index 0000000000..342c7a03b7 --- /dev/null +++ b/voxygen/src/anim/critter/jump.rs @@ -0,0 +1,42 @@ +use super::{super::Animation, CritterAttr, CritterSkeleton}; +//use std::f32::consts::PI; +use vek::*; + +pub struct JumpAnimation; + +impl Animation for JumpAnimation { + type Skeleton = CritterSkeleton; + type Dependency = (f32, f64); + + fn update_skeleton( + skeleton: &Self::Skeleton, + _global_time: Self::Dependency, + _anim_time: f64, + _rate: &mut f32, + _skeleton_attr: &CritterAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + next.head.offset = Vec3::new(0.0, 0.0, 0.0) / 18.0; + next.head.ori = Quaternion::rotation_z(0.0); + next.head.scale = Vec3::one() / 18.0; + + next.chest.offset = Vec3::new(0.0, 0.0, 0.0) / 18.0; + next.chest.ori = Quaternion::rotation_x(0.0); + next.chest.scale = Vec3::one() / 18.0; + + next.feet_f.offset = Vec3::new(0.0, 0.0, 0.0) / 18.0; + next.feet_f.ori = Quaternion::rotation_z(0.0); + next.feet_f.scale = Vec3::one() / 18.0; + + next.feet_b.offset = Vec3::new(0.0, 0.0, 0.0) / 18.0; + next.feet_b.ori = Quaternion::rotation_x(0.0); + next.feet_b.scale = Vec3::one() / 18.0; + + next.tail.offset = Vec3::new(0.0, 0.0, 0.0) / 18.0; + next.tail.ori = Quaternion::rotation_x(0.0); + next.tail.scale = Vec3::one() / 18.0; + + next + } +} diff --git a/voxygen/src/anim/critter/mod.rs b/voxygen/src/anim/critter/mod.rs new file mode 100644 index 0000000000..f1f75878e1 --- /dev/null +++ b/voxygen/src/anim/critter/mod.rs @@ -0,0 +1,146 @@ +pub mod idle; +pub mod jump; +pub mod run; + +// Reexports +pub use self::idle::IdleAnimation; +pub use self::jump::JumpAnimation; +pub use self::run::RunAnimation; + +use super::{Bone, Skeleton}; +use crate::render::FigureBoneData; +use common::comp::{self}; + +#[derive(Clone, Default)] +pub struct CritterSkeleton { + head: Bone, + chest: Bone, + feet_f: Bone, + feet_b: Bone, + tail: Bone, +} +pub struct CritterAttr { + head: (f32, f32), + chest: (f32, f32), + feet_f: (f32, f32), + feet_b: (f32, f32), + tail: (f32, f32), +} + +impl CritterSkeleton { + pub fn new() -> Self { + Self::default() + } +} + +impl Skeleton for CritterSkeleton { + type Attr = CritterAttr; + + fn compute_matrices(&self) -> [FigureBoneData; 16] { + [ + FigureBoneData::new(self.head.compute_base_matrix()), + FigureBoneData::new(self.chest.compute_base_matrix()), + FigureBoneData::new(self.feet_f.compute_base_matrix()), + FigureBoneData::new(self.feet_b.compute_base_matrix()), + FigureBoneData::new(self.tail.compute_base_matrix()), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + FigureBoneData::default(), + ] + } + + fn interpolate(&mut self, target: &Self, dt: f32) { + self.head.interpolate(&target.head, dt); + self.chest.interpolate(&target.chest, dt); + self.feet_f.interpolate(&target.feet_f, dt); + self.feet_b.interpolate(&target.feet_b, dt); + self.tail.interpolate(&target.tail, dt); + } +} + +impl<'a> std::convert::TryFrom<&'a comp::Body> for CritterAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::Critter(body) => Ok(CritterAttr::from(body)), + _ => Err(()), + } + } +} + +impl CritterAttr { + pub fn calculate_scale(body: &comp::critter::Body) -> f32 { + match (body.species, body.body_type) { + (_, _) => 0.0, + } + } +} + +impl Default for CritterAttr { + fn default() -> Self { + Self { + head: (0.0, 0.0), + chest: (0.0, 0.0), + feet_f: (0.0, 0.0), + feet_b: (0.0, 0.0), + tail: (0.0, 0.0), + } + } +} + +impl<'a> From<&'a comp::critter::Body> for CritterAttr { + fn from(body: &'a comp::critter::Body) -> Self { + use comp::critter::Species::*; + Self { + head: match (body.species, body.body_type) { + (Rat, _) => (6.5, 7.0), + (Axolotl, _) => (5.0, 5.0), + (Gecko, _) => (5.0, 4.0), + (Turtle, _) => (8.0, 7.0), + (Squirrel, _) => (5.0, 4.0), + (Fungome, _) => (4.0, 4.0), + }, + chest: match (body.species, body.body_type) { + (Rat, _) => (0.0, 6.0), + (Axolotl, _) => (-1.0, 3.0), + (Gecko, _) => (-2.0, 3.0), + (Turtle, _) => (0.0, 6.0), + (Squirrel, _) => (0.0, 3.0), + (Fungome, _) => (0.0, 5.0), + }, + feet_f: match (body.species, body.body_type) { + (Rat, _) => (2.0, 0.5), + (Axolotl, _) => (2.0, 0.5), + (Gecko, _) => (1.0, 0.5), + (Turtle, _) => (3.0, 0.5), + (Squirrel, _) => (1.0, 0.5), + (Fungome, _) => (1.0, 0.5), + }, + feet_b: match (body.species, body.body_type) { + (Rat, _) => (-2.0, 0.5), + (Axolotl, _) => (-2.0, 0.5), + (Gecko, _) => (-2.0, 0.5), + (Turtle, _) => (-2.0, 0.5), + (Squirrel, _) => (-1.0, 0.5), + (Fungome, _) => (-2.0, 0.5), + }, + tail: match (body.species, body.body_type) { + (Rat, _) => (-8.0, 3.0), + (Axolotl, _) => (-7.0, 3.0), + (Gecko, _) => (-7.0, 2.0), + (Turtle, _) => (-6.0, 4.0), + (Squirrel, _) => (-3.0, 4.0), + (Fungome, _) => (-6.0, 3.0), + }, + } + } +} diff --git a/voxygen/src/anim/critter/run.rs b/voxygen/src/anim/critter/run.rs new file mode 100644 index 0000000000..119e74a11a --- /dev/null +++ b/voxygen/src/anim/critter/run.rs @@ -0,0 +1,52 @@ +use super::{super::Animation, CritterAttr, CritterSkeleton}; +//use std::{f32::consts::PI, ops::Mul}; +use std::f32::consts::PI; +use vek::*; + +pub struct RunAnimation; + +impl Animation for RunAnimation { + type Skeleton = CritterSkeleton; + type Dependency = (f32, f64); + + fn update_skeleton( + skeleton: &Self::Skeleton, + (_velocity, _global_time): Self::Dependency, + anim_time: f64, + _rate: &mut f32, + skeleton_attr: &CritterAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + let wave = (anim_time as f32 * 13.0).sin(); + let wave_cos = (anim_time as f32 * 13.0).sin(); + let wave_slow = (anim_time as f32 * 6.5 + PI).sin(); + + next.head.offset = Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1) / 18.0; + next.head.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(0.0 + wave * 0.03); + next.head.scale = Vec3::one() / 18.0; + + next.chest.offset = Vec3::new( + 0.0, + skeleton_attr.chest.0 + wave * 1.0, + skeleton_attr.chest.1, + ) / 18.0; + next.chest.ori = Quaternion::rotation_y(wave_slow * 0.3); + next.chest.scale = Vec3::one() / 18.0; + + next.feet_f.offset = Vec3::new(0.0, skeleton_attr.feet_f.0, skeleton_attr.feet_f.1) / 18.0; + next.feet_f.ori = Quaternion::rotation_x(wave * 1.0); + next.feet_f.scale = Vec3::one() / 18.0; + + next.feet_b.offset = Vec3::new(0.0, skeleton_attr.feet_b.0, skeleton_attr.feet_b.1) / 18.0; + next.feet_b.ori = Quaternion::rotation_x(wave_cos * 1.0); + next.feet_b.scale = Vec3::one() / 18.0; + + next.tail.offset = + Vec3::new(0.0, skeleton_attr.tail.0 + wave * 1.0, skeleton_attr.tail.1) / 18.0; + next.tail.ori = Quaternion::rotation_y(wave_slow * 0.25); + next.tail.scale = Vec3::one() / 18.0; + + next + } +} diff --git a/voxygen/src/anim/dragon/idle.rs b/voxygen/src/anim/dragon/idle.rs index ae271be2fe..d1eaf0c53f 100644 --- a/voxygen/src/anim/dragon/idle.rs +++ b/voxygen/src/anim/dragon/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - DragonSkeleton, -}; +use super::{super::Animation, DragonSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/dragon/jump.rs b/voxygen/src/anim/dragon/jump.rs index 8aa98d93cd..b1b8fef078 100644 --- a/voxygen/src/anim/dragon/jump.rs +++ b/voxygen/src/anim/dragon/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - DragonSkeleton, -}; +use super::{super::Animation, DragonSkeleton, SkeletonAttr}; //use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/dragon/mod.rs b/voxygen/src/anim/dragon/mod.rs index b6950956e5..6d550e7d30 100644 --- a/voxygen/src/anim/dragon/mod.rs +++ b/voxygen/src/anim/dragon/mod.rs @@ -9,6 +9,7 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; #[derive(Clone)] pub struct DragonSkeleton { @@ -48,6 +49,8 @@ impl DragonSkeleton { } impl Skeleton for DragonSkeleton { + type Attr = SkeletonAttr; + fn compute_matrices(&self) -> [FigureBoneData; 16] { let chest_front_mat = self.chest_front.compute_base_matrix(); let wing_in_l_mat = self.wing_in_l.compute_base_matrix(); @@ -90,3 +93,28 @@ impl Skeleton for DragonSkeleton { self.foot_br.interpolate(&target.foot_br, dt); } } + +pub struct SkeletonAttr; + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::Dragon(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self + } +} + +impl<'a> From<&'a comp::dragon::Body> for SkeletonAttr { + fn from(_body: &'a comp::dragon::Body) -> Self { + Self + } +} diff --git a/voxygen/src/anim/dragon/run.rs b/voxygen/src/anim/dragon/run.rs index 2abe9fae1a..1b563443b6 100644 --- a/voxygen/src/anim/dragon/run.rs +++ b/voxygen/src/anim/dragon/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - DragonSkeleton, -}; +use super::{super::Animation, DragonSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/fish_medium/idle.rs b/voxygen/src/anim/fish_medium/idle.rs index bfd71da3f5..9894e3d3fe 100644 --- a/voxygen/src/anim/fish_medium/idle.rs +++ b/voxygen/src/anim/fish_medium/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - FishMediumSkeleton, -}; +use super::{super::Animation, FishMediumSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/fish_medium/jump.rs b/voxygen/src/anim/fish_medium/jump.rs index 6b6266e402..3924aa1b85 100644 --- a/voxygen/src/anim/fish_medium/jump.rs +++ b/voxygen/src/anim/fish_medium/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - FishMediumSkeleton, -}; +use super::{super::Animation, FishMediumSkeleton, SkeletonAttr}; //use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/fish_medium/mod.rs b/voxygen/src/anim/fish_medium/mod.rs index 566967a532..8b1448a68a 100644 --- a/voxygen/src/anim/fish_medium/mod.rs +++ b/voxygen/src/anim/fish_medium/mod.rs @@ -9,6 +9,7 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; #[derive(Clone)] pub struct FishMediumSkeleton { @@ -34,6 +35,7 @@ impl FishMediumSkeleton { } impl Skeleton for FishMediumSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { let torso_mat = self.torso.compute_base_matrix(); let rear_mat = self.rear.compute_base_matrix(); @@ -67,3 +69,27 @@ impl Skeleton for FishMediumSkeleton { self.fin_r.interpolate(&target.fin_r, dt); } } +pub struct SkeletonAttr; + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::FishMedium(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self + } +} + +impl<'a> From<&'a comp::fish_medium::Body> for SkeletonAttr { + fn from(_body: &'a comp::fish_medium::Body) -> Self { + Self + } +} diff --git a/voxygen/src/anim/fish_medium/run.rs b/voxygen/src/anim/fish_medium/run.rs index 18886ee935..935aeef7af 100644 --- a/voxygen/src/anim/fish_medium/run.rs +++ b/voxygen/src/anim/fish_medium/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - FishMediumSkeleton, -}; +use super::{super::Animation, FishMediumSkeleton, SkeletonAttr}; //use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/fish_small/idle.rs b/voxygen/src/anim/fish_small/idle.rs index 47b17ad942..ca0f5f2d1b 100644 --- a/voxygen/src/anim/fish_small/idle.rs +++ b/voxygen/src/anim/fish_small/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - FishSmallSkeleton, -}; +use super::{super::Animation, FishSmallSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/fish_small/jump.rs b/voxygen/src/anim/fish_small/jump.rs index f8088c84df..234a273d8c 100644 --- a/voxygen/src/anim/fish_small/jump.rs +++ b/voxygen/src/anim/fish_small/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - FishSmallSkeleton, -}; +use super::{super::Animation, FishSmallSkeleton, SkeletonAttr}; //use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/fish_small/mod.rs b/voxygen/src/anim/fish_small/mod.rs index 3d8b8e1184..5cc8faeb92 100644 --- a/voxygen/src/anim/fish_small/mod.rs +++ b/voxygen/src/anim/fish_small/mod.rs @@ -9,6 +9,7 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; #[derive(Clone)] pub struct FishSmallSkeleton { @@ -26,6 +27,7 @@ impl FishSmallSkeleton { } impl Skeleton for FishSmallSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { let torso_mat = self.torso.compute_base_matrix(); @@ -54,3 +56,28 @@ impl Skeleton for FishSmallSkeleton { self.tail.interpolate(&target.tail, dt); } } + +pub struct SkeletonAttr; + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::FishSmall(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self + } +} + +impl<'a> From<&'a comp::fish_small::Body> for SkeletonAttr { + fn from(_body: &'a comp::fish_small::Body) -> Self { + Self + } +} diff --git a/voxygen/src/anim/fish_small/run.rs b/voxygen/src/anim/fish_small/run.rs index 0f1952c9dd..cc79aa8a43 100644 --- a/voxygen/src/anim/fish_small/run.rs +++ b/voxygen/src/anim/fish_small/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - FishSmallSkeleton, -}; +use super::{super::Animation, FishSmallSkeleton, SkeletonAttr}; //use std::{f32::consts::PI, ops::Mul}; use vek::*; diff --git a/voxygen/src/anim/fixture/mod.rs b/voxygen/src/anim/fixture/mod.rs index 22a2ba2686..80478eb3bc 100644 --- a/voxygen/src/anim/fixture/mod.rs +++ b/voxygen/src/anim/fixture/mod.rs @@ -4,6 +4,8 @@ use crate::render::FigureBoneData; #[derive(Clone)] pub struct FixtureSkeleton; +pub struct SkeletonAttr; + impl FixtureSkeleton { pub fn new() -> Self { Self {} @@ -11,6 +13,7 @@ impl FixtureSkeleton { } impl Skeleton for FixtureSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { [ FigureBoneData::new(vek::Mat4::identity()), diff --git a/voxygen/src/anim/mod.rs b/voxygen/src/anim/mod.rs index 6f69c17dc0..1a309e95c9 100644 --- a/voxygen/src/anim/mod.rs +++ b/voxygen/src/anim/mod.rs @@ -2,6 +2,7 @@ pub mod biped_large; pub mod bird_medium; pub mod bird_small; pub mod character; +pub mod critter; pub mod dragon; pub mod fish_medium; pub mod fish_small; @@ -11,7 +12,6 @@ pub mod quadruped_medium; pub mod quadruped_small; use crate::render::FigureBoneData; -use common::comp::{self, item::Tool}; use vek::*; #[derive(Copy, Clone)] @@ -21,15 +21,17 @@ pub struct Bone { pub scale: Vec3, } -impl Bone { - pub fn default() -> Self { +impl Default for Bone { + fn default() -> Self { Self { offset: Vec3::zero(), ori: Quaternion::identity(), scale: Vec3::broadcast(1.0 / 11.0), } } +} +impl Bone { pub fn compute_base_matrix(&self) -> Mat4 { Mat4::::translation_3d(self.offset) * Mat4::scaling_3d(self.scale) @@ -47,145 +49,16 @@ impl Bone { } pub trait Skeleton: Send + Sync + 'static { + type Attr; + fn compute_matrices(&self) -> [FigureBoneData; 16]; /// Change the current skeleton to be more like `target`. fn interpolate(&mut self, target: &Self, dt: f32); } -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> 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, - }, - weapon_x: match Tool::Hammer { - // TODO: Inventory - Tool::Sword => 0.0, - Tool::Axe => 3.0, - Tool::Hammer => 0.0, - Tool::Shield => 3.0, - Tool::Staff => 3.0, - Tool::Bow => 0.0, - Tool::Dagger => 0.0, - Tool::Debug(_) => 0.0, - }, - weapon_y: match Tool::Hammer { - // TODO: Inventory - Tool::Sword => -1.25, - Tool::Axe => 0.0, - Tool::Hammer => -2.0, - Tool::Shield => 0.0, - Tool::Staff => 0.0, - Tool::Bow => -2.0, - Tool::Dagger => -2.0, - Tool::Debug(_) => 0.0, - }, - } - } -} - pub trait Animation { - type Skeleton; + type Skeleton: Skeleton; type Dependency; /// Returns a new skeleton that is generated by the animation. @@ -194,6 +67,6 @@ pub trait Animation { dependency: Self::Dependency, anim_time: f64, rate: &mut f32, - skeleton_attr: &SkeletonAttr, + skeleton_attr: &<::Skeleton as Skeleton>::Attr, ) -> Self::Skeleton; } diff --git a/voxygen/src/anim/object/mod.rs b/voxygen/src/anim/object/mod.rs index 5ff3f185f5..e344695506 100644 --- a/voxygen/src/anim/object/mod.rs +++ b/voxygen/src/anim/object/mod.rs @@ -4,6 +4,7 @@ use vek::*; #[derive(Clone)] pub struct ObjectSkeleton; +pub struct SkeletonAttr; impl ObjectSkeleton { pub fn new() -> Self { @@ -14,6 +15,7 @@ impl ObjectSkeleton { const SCALE: f32 = 1.0 / 11.0; impl Skeleton for ObjectSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { [ FigureBoneData::new(Mat4::scaling_3d(Vec3::broadcast(SCALE))), diff --git a/voxygen/src/anim/quadruped_medium/idle.rs b/voxygen/src/anim/quadruped_medium/idle.rs index 6ae25a7474..6421629448 100644 --- a/voxygen/src/anim/quadruped_medium/idle.rs +++ b/voxygen/src/anim/quadruped_medium/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - QuadrupedMediumSkeleton, -}; +use super::{super::Animation, QuadrupedMediumSkeleton, SkeletonAttr}; use std::{f32::consts::PI, ops::Mul}; use vek::*; @@ -16,7 +13,7 @@ impl Animation for IdleAnimation { global_time: Self::Dependency, anim_time: f64, _rate: &mut f32, - _skeleton_attr: &SkeletonAttr, + skeleton_attr: &SkeletonAttr, ) -> Self::Skeleton { let mut next = (*skeleton).clone(); @@ -50,48 +47,92 @@ impl Animation for IdleAnimation { * 0.125, ); - next.head_upper.offset = Vec3::new(0.0, 7.5, 15.0 + wave_ultra_slow * 0.4) / 11.0; - next.head_upper.ori = Quaternion::rotation_z(look.x) * Quaternion::rotation_x(look.y); - next.head_upper.scale = Vec3::one() / 10.88; + next.head_upper.offset = Vec3::new( + 0.0, + skeleton_attr.head_upper.0, + skeleton_attr.head_upper.1 + wave_ultra_slow * 0.4, + ) / 11.0; + next.head_upper.ori = + Quaternion::rotation_z(0.8 * look.x) * Quaternion::rotation_x(0.8 * look.y); + next.head_upper.scale = Vec3::one() / 10.98; - next.jaw.offset = Vec3::new(0.0, 4.5 - wave_ultra_slow_cos * 0.12, 2.0 + wave_slow * 0.2); + 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.02; + + 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() * 1.01; + next.jaw.scale = Vec3::one() * 0.98; - next.head_lower.offset = Vec3::new(0.0, 3.1, -4.5 + wave_ultra_slow * 0.20); - next.head_lower.ori = Quaternion::rotation_z(0.0); - next.head_lower.scale = Vec3::one() * 0.98; - - next.tail.offset = Vec3::new(0.0, -13.0, 8.0 + wave_ultra_slow * 1.2) / 11.0; + next.tail.offset = Vec3::new( + 0.0, + skeleton_attr.tail.0, + skeleton_attr.tail.1 + wave_ultra_slow * 0.6, + ) / 11.0; next.tail.ori = Quaternion::rotation_z(0.0 + wave_slow * 0.2 + tailmove.x) * Quaternion::rotation_x(tailmove.y); next.tail.scale = Vec3::one() / 11.0; - next.torso_back.offset = Vec3::new(0.0, -11.7, 11.0 + wave_ultra_slow * 1.2) / 11.0; - next.torso_back.ori = Quaternion::rotation_y(wave_slow_cos * 0.015); + next.torso_back.offset = Vec3::new( + 0.0, + skeleton_attr.torso_back.0, + skeleton_attr.torso_back.1 + wave_ultra_slow * 0.6, + ) / 11.0; + next.torso_back.ori = Quaternion::rotation_y(wave_slow_cos * 0.015) + * Quaternion::rotation_z(0.1 * look.x) + * Quaternion::rotation_x(0.2 * look.y); next.torso_back.scale = Vec3::one() / 11.0; - next.torso_mid.offset = Vec3::new(0.0, 0.0, 12.0 + wave_ultra_slow * 0.7) / 11.0; + next.torso_mid.offset = Vec3::new( + 0.0, + skeleton_attr.torso_mid.0, + skeleton_attr.torso_mid.1 + wave_ultra_slow * 0.5, + ) / 11.0; next.torso_mid.ori = Quaternion::rotation_y(wave_slow * 0.015); - next.torso_mid.scale = Vec3::one() / 10.5; + next.torso_mid.scale = Vec3::one() / 10.98; - next.ears.offset = Vec3::new(0.0, 0.75, 5.25); - next.ears.ori = Quaternion::rotation_x(0.0 + wave_slow * 0.1); - next.ears.scale = Vec3::one() * 1.05; + next.ears.offset = Vec3::new(0.0, skeleton_attr.ears.0, skeleton_attr.ears.1); + next.ears.ori = Quaternion::rotation_x(0.0 + wave_ultra_slow * 0.03); + next.ears.scale = Vec3::one() / 1.02; - next.foot_lf.offset = Vec3::new(-5.0, 5.0, 2.5) / 11.0; + next.foot_lf.offset = Vec3::new( + -skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1, + skeleton_attr.feet_f.2, + ) / 11.0; next.foot_lf.ori = Quaternion::rotation_x(0.0); next.foot_lf.scale = Vec3::one() / 11.0; - next.foot_rf.offset = Vec3::new(5.0, 5.0, 2.5) / 11.0; + next.foot_rf.offset = Vec3::new( + skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1, + skeleton_attr.feet_f.2, + ) / 11.0; next.foot_rf.ori = Quaternion::rotation_x(0.0); next.foot_rf.scale = Vec3::one() / 11.0; - next.foot_lb.offset = Vec3::new(-5.0, -10.0, 2.5) / 11.0; + next.foot_lb.offset = Vec3::new( + -skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1, + skeleton_attr.feet_b.2, + ) / 11.0; next.foot_lb.ori = Quaternion::rotation_x(0.0); next.foot_lb.scale = Vec3::one() / 11.0; - next.foot_rb.offset = Vec3::new(5.0, -10.0, 2.5) / 11.0; + next.foot_rb.offset = Vec3::new( + skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1, + skeleton_attr.feet_b.2, + ) / 11.0; next.foot_rb.ori = Quaternion::rotation_x(0.0); next.foot_rb.scale = Vec3::one() / 11.0; diff --git a/voxygen/src/anim/quadruped_medium/jump.rs b/voxygen/src/anim/quadruped_medium/jump.rs index d262a85067..15b3e90b33 100644 --- a/voxygen/src/anim/quadruped_medium/jump.rs +++ b/voxygen/src/anim/quadruped_medium/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - QuadrupedMediumSkeleton, -}; +use super::{super::Animation, QuadrupedMediumSkeleton, SkeletonAttr}; use std::f32::consts::PI; use vek::*; @@ -29,14 +26,14 @@ impl Animation for JumpAnimation { Quaternion::rotation_z(0.0) * Quaternion::rotation_x(wave_slow * -0.25); next.head_upper.scale = Vec3::one() / 10.88; - next.jaw.offset = Vec3::new(0.0, 4.5, 2.0); - next.jaw.ori = Quaternion::rotation_x(0.0); - next.jaw.scale = Vec3::one() * 1.01; - next.head_lower.offset = Vec3::new(0.0, 3.1, -4.5); next.head_lower.ori = Quaternion::rotation_x(wave_stop * -0.1); next.head_lower.scale = Vec3::one() * 0.98; + next.jaw.offset = Vec3::new(0.0, 4.5, 2.0); + next.jaw.ori = Quaternion::rotation_x(0.0); + next.jaw.scale = Vec3::one() * 1.01; + next.tail.offset = Vec3::new(0.0, -12.0, 8.0) / 11.0; next.tail.ori = Quaternion::rotation_z(0.0) * Quaternion::rotation_x(wave_slow * -0.25); next.tail.scale = Vec3::one() / 11.0; diff --git a/voxygen/src/anim/quadruped_medium/mod.rs b/voxygen/src/anim/quadruped_medium/mod.rs index 3f294968d8..da76f93449 100644 --- a/voxygen/src/anim/quadruped_medium/mod.rs +++ b/voxygen/src/anim/quadruped_medium/mod.rs @@ -9,12 +9,13 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; -#[derive(Clone)] +#[derive(Clone, Default)] pub struct QuadrupedMediumSkeleton { head_upper: Bone, - jaw: Bone, head_lower: Bone, + jaw: Bone, tail: Bone, torso_back: Bone, torso_mid: Bone, @@ -27,23 +28,12 @@ pub struct QuadrupedMediumSkeleton { impl QuadrupedMediumSkeleton { pub fn new() -> Self { - Self { - head_upper: Bone::default(), - jaw: Bone::default(), - head_lower: Bone::default(), - tail: Bone::default(), - torso_back: Bone::default(), - torso_mid: Bone::default(), - ears: Bone::default(), - foot_lf: Bone::default(), - foot_rf: Bone::default(), - foot_lb: Bone::default(), - foot_rb: Bone::default(), - } + Self::default() } } impl Skeleton for QuadrupedMediumSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { let ears_mat = self.ears.compute_base_matrix(); let head_upper_mat = self.head_upper.compute_base_matrix(); @@ -51,8 +41,8 @@ impl Skeleton for QuadrupedMediumSkeleton { [ FigureBoneData::new(head_upper_mat), - FigureBoneData::new(head_upper_mat * head_lower_mat * self.jaw.compute_base_matrix()), FigureBoneData::new(head_upper_mat * head_lower_mat), + FigureBoneData::new(head_upper_mat * self.jaw.compute_base_matrix()), FigureBoneData::new(self.tail.compute_base_matrix()), FigureBoneData::new(self.torso_back.compute_base_matrix()), FigureBoneData::new(self.torso_mid.compute_base_matrix()), @@ -71,8 +61,8 @@ impl Skeleton for QuadrupedMediumSkeleton { fn interpolate(&mut self, target: &Self, dt: f32) { self.head_upper.interpolate(&target.head_upper, dt); - self.jaw.interpolate(&target.jaw, dt); self.head_lower.interpolate(&target.head_lower, dt); + self.jaw.interpolate(&target.jaw, dt); self.tail.interpolate(&target.tail, dt); self.torso_back.interpolate(&target.torso_back, dt); self.torso_mid.interpolate(&target.torso_mid, dt); @@ -83,3 +73,140 @@ impl Skeleton for QuadrupedMediumSkeleton { self.foot_rb.interpolate(&target.foot_rb, dt); } } + +pub struct SkeletonAttr { + head_upper: (f32, f32), + head_lower: (f32, f32), + jaw: (f32, f32), + tail: (f32, f32), + torso_back: (f32, f32), + torso_mid: (f32, f32), + ears: (f32, f32), + feet_f: (f32, f32, f32), + feet_b: (f32, f32, f32), +} + +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::QuadrupedMedium(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self { + head_upper: (0.0, 0.0), + head_lower: (0.0, 0.0), + jaw: (0.0, 0.0), + tail: (0.0, 0.0), + torso_back: (0.0, 0.0), + torso_mid: (0.0, 0.0), + ears: (0.0, 0.0), + feet_f: (0.0, 0.0, 0.0), + feet_b: (0.0, 0.0, 0.0), + } + } +} + +impl<'a> From<&'a comp::quadruped_medium::Body> for SkeletonAttr { + fn from(body: &'a comp::quadruped_medium::Body) -> Self { + use comp::quadruped_medium::Species::*; + Self { + head_upper: match (body.species, body.body_type) { + (Wolf, _) => (12.0, 16.0), + (Saber, _) => (14.0, 12.0), + (Viper, _) => (14.0, 10.0), + (Tuskram, _) => (13.0, 12.0), + (Alligator, _) => (16.0, 11.0), + (Monitor, _) => (14.0, 6.0), + (Lion, _) => (11.5, 14.0), + (Tarasque, _) => (12.0, 19.0), + }, + head_lower: match (body.species, body.body_type) { + (Wolf, _) => (-4.0, -7.0), + (Saber, _) => (-6.0, 1.0), + (Viper, _) => (-3.0, -2.0), + (Tuskram, _) => (-3.0, 0.0), + (Alligator, _) => (-5.0, -4.0), + (Monitor, _) => (0.0, -1.0), + (Lion, _) => (-6.0, -1.0), + (Tarasque, _) => (-5.0, -8.0), + }, + jaw: match (body.species, body.body_type) { + (Wolf, _) => (3.0, -5.0), + (Saber, _) => (2.0, -1.0), + (Viper, _) => (3.0, -2.0), + (Tuskram, _) => (2.0, -2.0), + (Alligator, _) => (6.0, -6.0), + (Monitor, _) => (4.0, -3.0), + (Lion, _) => (3.0, -3.0), + (Tarasque, _) => (4.0, -9.0), + }, + tail: match (body.species, body.body_type) { + (Wolf, _) => (-13.0, 5.0), + (Saber, _) => (-13.0, 5.0), + (Viper, _) => (-13.0, 5.0), + (Tuskram, _) => (-13.0, 5.0), + (Alligator, _) => (-16.0, 5.0), + (Monitor, _) => (-13.0, 5.0), + (Lion, _) => (-14.0, 8.0), + (Tarasque, _) => (-13.0, 5.0), + }, + torso_back: match (body.species, body.body_type) { + (Wolf, _) => (4.0, 11.0), + (Saber, _) => (4.0, 9.0), + (Viper, _) => (4.0, 7.0), + (Tuskram, _) => (4.0, 9.0), + (Alligator, _) => (4.0, 6.0), + (Monitor, _) => (4.0, 4.0), + (Lion, _) => (4.0, 10.0), + (Tarasque, _) => (4.0, 9.0), + }, + torso_mid: match (body.species, body.body_type) { + (Wolf, _) => (-7.0, 10.5), + (Saber, _) => (-8.0, 9.5), + (Viper, _) => (-7.0, 7.0), + (Tuskram, _) => (-7.0, 9.0), + (Alligator, _) => (-7.0, 6.0), + (Monitor, _) => (-7.0, 4.0), + (Lion, _) => (-7.0, 9.0), + (Tarasque, _) => (-7.0, 8.0), + }, + ears: match (body.species, body.body_type) { + (Wolf, _) => (1.0, 6.0), + (Saber, _) => (-1.0, 6.0), + (Viper, _) => (10.0, 2.0), + (Tuskram, _) => (10.0, 2.0), + (Alligator, _) => (10.0, 2.0), + (Monitor, _) => (10.0, 2.0), + (Lion, _) => (-2.0, 4.0), + (Tarasque, _) => (1.0, 2.0), + }, + feet_f: match (body.species, body.body_type) { + (Wolf, _) => (4.0, 6.0, 3.0), + (Saber, _) => (4.0, 6.0, 3.0), + (Viper, _) => (4.0, 6.0, 3.0), + (Tuskram, _) => (4.0, 6.0, 3.0), + (Alligator, _) => (4.0, 6.0, 3.0), + (Monitor, _) => (4.0, 6.0, 3.0), + (Lion, _) => (4.0, 6.0, 3.0), + (Tarasque, _) => (4.0, 6.0, 3.0), + }, + feet_b: match (body.species, body.body_type) { + (Wolf, _) => (4.0, -4.0, 3.5), + (Saber, _) => (4.0, -4.0, 3.5), + (Viper, _) => (4.0, -4.0, 3.5), + (Tuskram, _) => (4.0, -8.0, 3.5), + (Alligator, _) => (4.0, -4.0, 3.5), + (Monitor, _) => (4.0, -6.0, 3.5), + (Lion, _) => (4.0, -7.0, 3.5), + (Tarasque, _) => (4.0, -8.0, 3.5), + }, + } + } +} diff --git a/voxygen/src/anim/quadruped_medium/run.rs b/voxygen/src/anim/quadruped_medium/run.rs index 6aea5b70b8..f12f72075d 100644 --- a/voxygen/src/anim/quadruped_medium/run.rs +++ b/voxygen/src/anim/quadruped_medium/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - QuadrupedMediumSkeleton, -}; +use super::{super::Animation, QuadrupedMediumSkeleton, SkeletonAttr}; use std::{f32::consts::PI, ops::Mul}; use vek::*; @@ -16,7 +13,7 @@ impl Animation for RunAnimation { (_velocity, global_time): Self::Dependency, anim_time: f64, _rate: &mut f32, - _skeleton_attr: &SkeletonAttr, + skeleton_attr: &SkeletonAttr, ) -> Self::Skeleton { let mut next = (*skeleton).clone(); @@ -41,56 +38,85 @@ impl Animation for RunAnimation { * 0.125, ); - next.head_upper.offset = - Vec3::new(0.0, 9.5 + wave_quick_cos * 2.0, 15.0 + wave_med * 3.0) / 11.0; + next.head_upper.offset = Vec3::new( + 0.0, + skeleton_attr.head_upper.0 + wave_quick_cos * 2.0, + skeleton_attr.head_upper.1 + wave_med * 3.0, + ) / 11.0; next.head_upper.ori = Quaternion::rotation_x(-0.12 + wave_quick_cos * 0.12 + wolf_look.y) * Quaternion::rotation_z(wolf_look.x); - next.head_upper.scale = Vec3::one() / 10.88; + next.head_upper.scale = Vec3::one() / 10.98; - next.jaw.offset = Vec3::new(0.0, 4.5, 2.0 + wave_slow_cos * 1.0); - next.jaw.ori = Quaternion::rotation_x(wave_slow * 0.05); - next.jaw.scale = Vec3::one() * 1.01; - - next.head_lower.offset = Vec3::new(0.0, 3.1, -4.5 + wave_med * 1.0); + next.head_lower.offset = Vec3::new( + 0.0, + skeleton_attr.head_lower.0, + skeleton_attr.head_lower.1 + wave_med * 1.0, + ); next.head_lower.ori = Quaternion::rotation_z(0.0); next.head_lower.scale = Vec3::one() * 0.98; - next.tail.offset = Vec3::new(0.0, -12.0, 10.0) / 11.0; + next.jaw.offset = Vec3::new( + 0.0, + skeleton_attr.jaw.0, + skeleton_attr.jaw.1 + wave_slow_cos * 1.0, + ); + next.jaw.ori = Quaternion::rotation_x(wave_slow * 0.05); + next.jaw.scale = Vec3::one() * 1.01; + + next.tail.offset = Vec3::new(0.0, skeleton_attr.tail.0, skeleton_attr.tail.1) / 11.0; next.tail.ori = Quaternion::rotation_x(wave_quick * 0.18); next.tail.scale = Vec3::one() / 11.0; - next.torso_back.offset = - Vec3::new(0.0, -9.5 + wave_quick_cos * 2.2, 13.0 + wave_med * 2.8) / 11.0; - next.torso_back.ori = Quaternion::rotation_x(-0.15 + wave_med_cos * 0.14); + next.torso_back.offset = Vec3::new( + 0.0, + skeleton_attr.torso_back.0 + wave_quick_cos * 2.2, + skeleton_attr.torso_back.1 + wave_med * 2.8, + ) / 11.0; + next.torso_back.ori = Quaternion::rotation_x(-0.05 + wave_med_cos * 0.14); next.torso_back.scale = Vec3::one() / 11.0; - next.torso_mid.offset = - Vec3::new(0.0, 0.0 + wave_quick_cos * 2.2, 14.0 + wave_med * 3.2) / 11.0; - next.torso_mid.ori = Quaternion::rotation_x(-0.15 + wave_med_cos * 0.12); - next.torso_mid.scale = Vec3::one() / 10.5; + next.torso_mid.offset = Vec3::new( + 0.0, + skeleton_attr.torso_mid.0 + wave_quick_cos * 2.2, + skeleton_attr.torso_mid.1 + wave_med * 3.2, + ) / 11.0; + next.torso_mid.ori = Quaternion::rotation_x(-0.05 + wave_med_cos * 0.12); + next.torso_mid.scale = Vec3::one() / 10.98; - next.ears.offset = Vec3::new(0.0, 0.75 + wave * 0.4, 6.25); + next.ears.offset = Vec3::new(0.0, skeleton_attr.ears.0 + wave * 0.4, skeleton_attr.ears.1); next.ears.ori = Quaternion::rotation_x(wave * 0.2); - next.ears.scale = Vec3::one() * 1.05; + next.ears.scale = Vec3::one() * 1.02; - next.foot_lf.offset = - Vec3::new(-5.0, 5.0 + wave_quick * 3.0, 7.0 + wave_quick_cos * 4.0) / 11.0; - next.foot_lf.ori = Quaternion::rotation_x(0.0 + wave_quick * 0.8); + next.foot_lf.offset = Vec3::new( + -skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1 + wave_quick * 3.0, + skeleton_attr.feet_f.2 + wave_quick_cos * 4.0, + ) / 11.0; + next.foot_lf.ori = Quaternion::rotation_x(wave_quick * 0.8); next.foot_lf.scale = Vec3::one() / 11.0; - next.foot_rf.offset = - Vec3::new(5.0, 5.0 - wave_quick_cos * 3.0, 7.0 + wave_quick * 4.0) / 11.0; - next.foot_rf.ori = Quaternion::rotation_x(0.0 - wave_quick_cos * 0.8); + next.foot_rf.offset = Vec3::new( + skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1 - wave_quick_cos * 3.0, + skeleton_attr.feet_f.2 + wave_quick * 4.0, + ) / 11.0; + next.foot_rf.ori = Quaternion::rotation_x(wave_quick_cos * 0.8); next.foot_rf.scale = Vec3::one() / 11.0; - next.foot_lb.offset = - Vec3::new(-5.0, -10.0 - wave_quick_cos * 3.0, 7.0 + wave_quick * 4.0) / 11.0; - next.foot_lb.ori = Quaternion::rotation_x(0.0 - wave_quick_cos * 0.8); + next.foot_lb.offset = Vec3::new( + -skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1 - wave_quick_cos * 3.0, + skeleton_attr.feet_b.2 + wave_quick * 4.0, + ) / 11.0; + next.foot_lb.ori = Quaternion::rotation_x(wave_quick_cos * 0.8); next.foot_lb.scale = Vec3::one() / 11.0; - next.foot_rb.offset = - Vec3::new(5.0, -10.0 + wave_quick * 3.0, 7.0 + wave_quick_cos * 4.0) / 11.0; - next.foot_rb.ori = Quaternion::rotation_x(0.0 + wave_quick * 0.8); + next.foot_rb.offset = Vec3::new( + skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1 + wave_quick * 3.0, + skeleton_attr.feet_b.2 + wave_quick_cos * 4.0, + ) / 11.0; + next.foot_rb.ori = Quaternion::rotation_x(wave_quick * 0.8); next.foot_rb.scale = Vec3::one() / 11.0; next diff --git a/voxygen/src/anim/quadruped_small/idle.rs b/voxygen/src/anim/quadruped_small/idle.rs index 7b9faa7d60..846e15fc72 100644 --- a/voxygen/src/anim/quadruped_small/idle.rs +++ b/voxygen/src/anim/quadruped_small/idle.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - QuadrupedSmallSkeleton, -}; +use super::{super::Animation, QuadrupedSmallSkeleton, SkeletonAttr}; use std::{f32::consts::PI, ops::Mul}; use vek::*; @@ -16,7 +13,7 @@ impl Animation for IdleAnimation { global_time: Self::Dependency, anim_time: f64, _rate: &mut f32, - _skeleton_attr: &SkeletonAttr, + skeleton_attr: &SkeletonAttr, ) -> Self::Skeleton { let mut next = (*skeleton).clone(); @@ -37,28 +34,49 @@ impl Animation for IdleAnimation { * 0.25, ); - next.head.offset = Vec3::new(0.0, -2.0, -1.5 + wave * 0.2) / 11.0; + next.head.offset = + Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1 + wave * 0.2) / 11.0; next.head.ori = Quaternion::rotation_z(pig_head_look.x) * Quaternion::rotation_x(pig_head_look.y + wave_slow_cos * 0.03); next.head.scale = Vec3::one() / 10.5; - next.chest.offset = Vec3::new(wave_slow * 0.05, -9.0, 1.5 + wave_slow_cos * 0.4) / 11.0; + next.chest.offset = Vec3::new( + wave_slow * 0.05, + skeleton_attr.chest.0, + skeleton_attr.chest.1 + wave_slow_cos * 0.2, + ) / 11.0; next.chest.ori = Quaternion::rotation_y(wave_slow * 0.05); next.chest.scale = Vec3::one() / 11.0; - next.leg_lf.offset = Vec3::new(-4.5, 2.0, 1.5) / 11.0; + next.leg_lf.offset = Vec3::new( + -skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1, + skeleton_attr.feet_f.2, + ) / 11.0; next.leg_lf.ori = Quaternion::rotation_x(wave_slow * 0.08); next.leg_lf.scale = Vec3::one() / 11.0; - next.leg_rf.offset = Vec3::new(2.5, 2.0, 1.5) / 11.0; + next.leg_rf.offset = Vec3::new( + skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1, + skeleton_attr.feet_f.2, + ) / 11.0; next.leg_rf.ori = Quaternion::rotation_x(wave_slow_cos * 0.08); next.leg_rf.scale = Vec3::one() / 11.0; - next.leg_lb.offset = Vec3::new(-4.5, -3.0, 1.5) / 11.0; + next.leg_lb.offset = Vec3::new( + -skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1, + skeleton_attr.feet_b.2, + ) / 11.0; next.leg_lb.ori = Quaternion::rotation_x(wave_slow_cos * 0.08); next.leg_lb.scale = Vec3::one() / 11.0; - next.leg_rb.offset = Vec3::new(2.5, -3.0, 1.5) / 11.0; + next.leg_rb.offset = Vec3::new( + skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1, + skeleton_attr.feet_b.2, + ) / 11.0; next.leg_rb.ori = Quaternion::rotation_x(wave_slow * 0.08); next.leg_rb.scale = Vec3::one() / 11.0; diff --git a/voxygen/src/anim/quadruped_small/jump.rs b/voxygen/src/anim/quadruped_small/jump.rs index 11d38973b4..2173cfdc64 100644 --- a/voxygen/src/anim/quadruped_small/jump.rs +++ b/voxygen/src/anim/quadruped_small/jump.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - QuadrupedSmallSkeleton, -}; +use super::{super::Animation, QuadrupedSmallSkeleton, SkeletonAttr}; use std::f32::consts::PI; use vek::*; diff --git a/voxygen/src/anim/quadruped_small/mod.rs b/voxygen/src/anim/quadruped_small/mod.rs index 600bb9d2ba..2bba14afbd 100644 --- a/voxygen/src/anim/quadruped_small/mod.rs +++ b/voxygen/src/anim/quadruped_small/mod.rs @@ -9,8 +9,9 @@ pub use self::run::RunAnimation; use super::{Bone, Skeleton}; use crate::render::FigureBoneData; +use common::comp::{self}; -#[derive(Clone)] +#[derive(Clone, Default)] pub struct QuadrupedSmallSkeleton { head: Bone, chest: Bone, @@ -22,18 +23,12 @@ pub struct QuadrupedSmallSkeleton { impl QuadrupedSmallSkeleton { pub fn new() -> Self { - Self { - head: Bone::default(), - chest: Bone::default(), - leg_lf: Bone::default(), - leg_rf: Bone::default(), - leg_lb: Bone::default(), - leg_rb: Bone::default(), - } + Self::default() } } impl Skeleton for QuadrupedSmallSkeleton { + type Attr = SkeletonAttr; fn compute_matrices(&self) -> [FigureBoneData; 16] { [ FigureBoneData::new(self.head.compute_base_matrix()), @@ -64,3 +59,95 @@ impl Skeleton for QuadrupedSmallSkeleton { self.leg_rb.interpolate(&target.leg_rb, dt); } } + +pub struct SkeletonAttr { + head: (f32, f32), + chest: (f32, f32), + feet_f: (f32, f32, f32), + feet_b: (f32, f32, f32), +} +impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { + type Error = (); + + fn try_from(body: &'a comp::Body) -> Result { + match body { + comp::Body::QuadrupedSmall(body) => Ok(SkeletonAttr::from(body)), + _ => Err(()), + } + } +} + +impl Default for SkeletonAttr { + fn default() -> Self { + Self { + head: (0.0, 0.0), + chest: (0.0, 0.0), + feet_f: (0.0, 0.0, 0.0), + feet_b: (0.0, 0.0, 0.0), + } + } +} + +impl<'a> From<&'a comp::quadruped_small::Body> for SkeletonAttr { + fn from(body: &'a comp::quadruped_small::Body) -> Self { + use comp::quadruped_small::Species::*; + Self { + head: match (body.species, body.body_type) { + (Pig, _) => (6.0, 7.0), + (Fox, _) => (8.0, 8.0), + (Sheep, _) => (8.0, 8.0), + (Boar, _) => (13.0, 8.0), + (Jackalope, _) => (6.0, 9.0), + (Skunk, _) => (7.0, 9.0), + (Cat, _) => (7.0, 8.0), + (Batfox, _) => (8.0, 9.0), + (Raccoon, _) => (9.0, 7.0), + (Quokka, _) => (10.0, 10.0), + (Dodarock, _) => (8.0, 9.0), + (Holladon, _) => (8.0, 8.0), + }, + chest: match (body.species, body.body_type) { + (Pig, _) => (0.0, 8.0), + (Fox, _) => (-2.0, 5.0), + (Sheep, _) => (-2.0, 6.0), + (Boar, _) => (-2.0, 7.0), + (Jackalope, _) => (-2.0, 6.0), + (Skunk, _) => (-5.0, 6.0), + (Cat, _) => (-2.0, 6.0), + (Batfox, _) => (-2.0, 6.0), + (Raccoon, _) => (-2.0, 6.0), + (Quokka, _) => (2.0, 8.0), + (Dodarock, _) => (-2.0, 8.0), + (Holladon, _) => (-2.0, 6.0), + }, + feet_f: match (body.species, body.body_type) { + (Pig, _) => (3.0, 5.0, 2.0), + (Fox, _) => (3.0, 5.0, 3.0), + (Sheep, _) => (3.0, 3.0, 3.0), + (Boar, _) => (3.0, 5.0, 3.0), + (Jackalope, _) => (3.0, 5.0, 4.0), + (Skunk, _) => (3.0, 3.0, 4.0), + (Cat, _) => (3.0, 5.0, 3.0), + (Batfox, _) => (2.5, 5.0, 3.0), + (Raccoon, _) => (3.0, 5.0, 3.0), + (Quokka, _) => (3.0, 5.0, 3.0), + (Dodarock, _) => (3.5, 5.0, 4.0), + (Holladon, _) => (3.0, 5.0, 4.0), + }, + feet_b: match (body.species, body.body_type) { + (Pig, _) => (3.0, -2.0, 2.0), + (Fox, _) => (2.5, -2.0, 3.0), + (Sheep, _) => (3.0, -4.0, 3.0), + (Boar, _) => (3.0, -3.0, 5.0), + (Jackalope, _) => (3.0, -2.0, 4.0), + (Skunk, _) => (3.0, -4.0, 4.0), + (Cat, _) => (2.0, -2.0, 3.0), + (Batfox, _) => (2.5, -2.0, 3.0), + (Raccoon, _) => (3.0, -2.0, 3.0), + (Quokka, _) => (3.0, -4.0, 3.0), + (Dodarock, _) => (4.5, -3.0, 4.0), + (Holladon, _) => (4.0, -4.0, 0.0), + }, + } + } +} diff --git a/voxygen/src/anim/quadruped_small/run.rs b/voxygen/src/anim/quadruped_small/run.rs index c5af0a7af8..f44fbfdced 100644 --- a/voxygen/src/anim/quadruped_small/run.rs +++ b/voxygen/src/anim/quadruped_small/run.rs @@ -1,7 +1,4 @@ -use super::{ - super::{Animation, SkeletonAttr}, - QuadrupedSmallSkeleton, -}; +use super::{super::Animation, QuadrupedSmallSkeleton, SkeletonAttr}; use vek::*; pub struct RunAnimation; @@ -15,7 +12,7 @@ impl Animation for RunAnimation { (_velocity, _global_time): Self::Dependency, anim_time: f64, _rate: &mut f32, - _skeleton_attr: &SkeletonAttr, + skeleton_attr: &SkeletonAttr, ) -> Self::Skeleton { let mut next = (*skeleton).clone(); @@ -24,32 +21,49 @@ impl Animation for RunAnimation { let wave_quick_cos = (anim_time as f32 * 20.0).cos(); let wave_cos = (anim_time as f32 * 14.0).cos(); - next.head.offset = Vec3::new(0.0, 0.0, -1.5 + wave * 1.5) / 11.0; + next.head.offset = + Vec3::new(0.0, skeleton_attr.head.0, skeleton_attr.head.1 + wave * 1.5) / 11.0; next.head.ori = Quaternion::rotation_x(0.2 + wave * 0.05) * Quaternion::rotation_y(wave_cos * 0.03); next.head.scale = Vec3::one() / 10.5; - next.chest.offset = Vec3::new(0.0, -9.0, 1.5 + wave_cos * 1.2) / 11.0; + next.chest.offset = Vec3::new( + 0.0, + skeleton_attr.chest.0, + skeleton_attr.chest.1 + wave_cos * 1.2, + ) / 11.0; next.chest.ori = Quaternion::rotation_x(wave * 0.1); next.chest.scale = Vec3::one() / 11.0; - next.leg_lf.offset = - Vec3::new(-4.5, 2.0 + wave_quick * 0.8, 2.5 + wave_quick_cos * 1.5) / 11.0; + next.leg_lf.offset = Vec3::new( + -skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1 + wave_quick * 0.8, + skeleton_attr.feet_f.2 + wave_quick_cos * 1.5, + ) / 11.0; next.leg_lf.ori = Quaternion::rotation_x(wave_quick * 0.3); next.leg_lf.scale = Vec3::one() / 11.0; - next.leg_rf.offset = - Vec3::new(2.5, 2.0 - wave_quick_cos * 0.8, 2.5 + wave_quick * 1.5) / 11.0; + next.leg_rf.offset = Vec3::new( + skeleton_attr.feet_f.0, + skeleton_attr.feet_f.1 - wave_quick_cos * 0.8, + skeleton_attr.feet_f.2 + wave_quick * 1.5, + ) / 11.0; next.leg_rf.ori = Quaternion::rotation_x(wave_quick_cos * -0.3); next.leg_rf.scale = Vec3::one() / 11.0; - next.leg_lb.offset = - Vec3::new(-4.5, -3.0 - wave_quick_cos * 0.8, 2.5 + wave_quick * 1.5) / 11.0; + next.leg_lb.offset = Vec3::new( + -skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1 - wave_quick_cos * 0.8, + skeleton_attr.feet_b.2 + wave_quick * 1.5, + ) / 11.0; next.leg_lb.ori = Quaternion::rotation_x(wave_quick_cos * -0.3); next.leg_lb.scale = Vec3::one() / 11.0; - next.leg_rb.offset = - Vec3::new(2.5, -3.0 + wave_quick * 0.8, 2.5 + wave_quick_cos * 1.5) / 11.0; + next.leg_rb.offset = Vec3::new( + skeleton_attr.feet_b.0, + skeleton_attr.feet_b.1 + wave_quick * 0.8, + skeleton_attr.feet_b.2 + wave_quick_cos * 1.5, + ) / 11.0; next.leg_rb.ori = Quaternion::rotation_x(wave_quick * 0.3); next.leg_rb.scale = Vec3::one() / 11.0; diff --git a/voxygen/src/menu/char_selection/scene.rs b/voxygen/src/menu/char_selection/scene.rs index 5ddbe64b60..f0f75e4d70 100644 --- a/voxygen/src/menu/char_selection/scene.rs +++ b/voxygen/src/menu/char_selection/scene.rs @@ -1,8 +1,8 @@ use crate::{ anim::{ - character::{CharacterSkeleton, IdleAnimation}, + character::{CharacterSkeleton, IdleAnimation, SkeletonAttr}, fixture::FixtureSkeleton, - Animation, Skeleton, SkeletonAttr, + Animation, Skeleton, }, render::{ create_pp_mesh, create_skybox_mesh, Consts, FigurePipeline, Globals, Light, Model, diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index 54fe68a2d5..fa4a50ab7f 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -1,6 +1,6 @@ use super::load::*; use crate::{ - anim::SkeletonAttr, + anim::{self, Skeleton}, render::{FigurePipeline, Mesh, Model, Renderer}, scene::camera::CameraMode, }; @@ -8,8 +8,11 @@ use common::{ assets::watch::ReloadIndicator, comp::{ActionState, Body, CharacterState, Equipment, MovementState}, }; -use hashbrown::HashMap; -use std::mem::{discriminant, Discriminant}; +use hashbrown::{hash_map::Entry, HashMap}; +use std::{ + convert::TryInto, + mem::{discriminant, Discriminant}, +}; #[derive(PartialEq, Eq, Hash, Clone)] enum FigureKey { @@ -37,12 +40,15 @@ impl From<&CharacterState> for CharacterStateCacheKey { } } -pub struct FigureModelCache { - models: HashMap, SkeletonAttr), u64)>, +pub struct FigureModelCache +where + Skel: Skeleton, +{ + models: HashMap, Skel::Attr), u64)>, manifest_indicator: ReloadIndicator, } -impl FigureModelCache { +impl FigureModelCache { pub fn new() -> Self { Self { models: HashMap::new(), @@ -58,7 +64,11 @@ impl FigureModelCache { tick: u64, camera_mode: CameraMode, character_state: Option<&CharacterState>, - ) -> &(Model, SkeletonAttr) { + ) -> &(Model, Skel::Attr) + where + for<'a> &'a common::comp::Body: std::convert::TryInto, + Skel::Attr: Default, + { let key = if equipment.is_some() { FigureKey::Complex( body, @@ -70,32 +80,35 @@ impl FigureModelCache { FigureKey::Simple(body) }; - match self.models.get_mut(&key) { - Some((_model, last_used)) => { + match self.models.entry(key) { + Entry::Occupied(o) => { + let (model, last_used) = o.into_mut(); *last_used = tick; + model } - None => { - self.models.insert( - key.clone(), - ( - { - let humanoid_head_spec = - HumHeadSpec::load_watched(&mut self.manifest_indicator); - let humanoid_armor_shoulder_spec = - HumArmorShoulderSpec::load_watched(&mut self.manifest_indicator); - let humanoid_armor_chest_spec = - HumArmorChestSpec::load_watched(&mut self.manifest_indicator); - let humanoid_armor_hand_spec = - HumArmorHandSpec::load_watched(&mut self.manifest_indicator); - let humanoid_armor_belt_spec = - HumArmorBeltSpec::load_watched(&mut self.manifest_indicator); - let humanoid_armor_pants_spec = - HumArmorPantsSpec::load_watched(&mut self.manifest_indicator); - let humanoid_armor_foot_spec = - HumArmorFootSpec::load_watched(&mut self.manifest_indicator); + Entry::Vacant(v) => { + &v.insert(( + { + let bone_meshes = match body { + Body::Humanoid(body) => { + let humanoid_head_spec = + HumHeadSpec::load_watched(&mut self.manifest_indicator); + let humanoid_armor_shoulder_spec = + HumArmorShoulderSpec::load_watched( + &mut self.manifest_indicator, + ); + let humanoid_armor_chest_spec = + HumArmorChestSpec::load_watched(&mut self.manifest_indicator); + let humanoid_armor_hand_spec = + HumArmorHandSpec::load_watched(&mut self.manifest_indicator); + let humanoid_armor_belt_spec = + HumArmorBeltSpec::load_watched(&mut self.manifest_indicator); + let humanoid_armor_pants_spec = + HumArmorPantsSpec::load_watched(&mut self.manifest_indicator); + let humanoid_armor_foot_spec = + HumArmorFootSpec::load_watched(&mut self.manifest_indicator); - let bone_meshes = match body { - Body::Humanoid(body) => [ + [ match camera_mode { CameraMode::ThirdPerson => { Some(humanoid_head_spec.mesh_head( @@ -189,196 +202,374 @@ impl FigureModelCache { None, None, None, - ], - Body::QuadrupedSmall(body) => [ - Some(mesh_quadruped_small_head(body.head)), - Some(mesh_quadruped_small_chest(body.chest)), - Some(mesh_quadruped_small_leg_lf(body.leg_l)), - Some(mesh_quadruped_small_leg_rf(body.leg_r)), - Some(mesh_quadruped_small_leg_lb(body.leg_l)), - Some(mesh_quadruped_small_leg_rb(body.leg_r)), - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - ], - Body::QuadrupedMedium(body) => [ - Some(mesh_quadruped_medium_head_upper(body.head_upper)), - Some(mesh_quadruped_medium_jaw(body.jaw)), - Some(mesh_quadruped_medium_head_lower(body.head_lower)), - Some(mesh_quadruped_medium_tail(body.tail)), - Some(mesh_quadruped_medium_torso_back(body.torso_back)), - Some(mesh_quadruped_medium_torso_mid(body.torso_mid)), - Some(mesh_quadruped_medium_ears(body.ears)), - Some(mesh_quadruped_medium_foot_lf(body.foot_lf)), - Some(mesh_quadruped_medium_foot_rf(body.foot_rf)), - Some(mesh_quadruped_medium_foot_lb(body.foot_lb)), - Some(mesh_quadruped_medium_foot_rb(body.foot_rb)), - None, - None, - None, - None, - None, - ], - Body::BirdMedium(body) => [ - Some(mesh_bird_medium_head(body.head)), - Some(mesh_bird_medium_torso(body.torso)), - Some(mesh_bird_medium_tail(body.tail)), - Some(mesh_bird_medium_wing_l(body.wing_l)), - Some(mesh_bird_medium_wing_r(body.wing_r)), - Some(mesh_bird_medium_leg_l(body.leg_l)), - Some(mesh_bird_medium_leg_r(body.leg_r)), - None, - None, - None, - None, - None, - None, - None, - None, - None, - ], - Body::FishMedium(body) => [ - Some(mesh_fish_medium_head(body.head)), - Some(mesh_fish_medium_torso(body.torso)), - Some(mesh_fish_medium_rear(body.rear)), - Some(mesh_fish_medium_tail(body.tail)), - Some(mesh_fish_medium_fin_l(body.fin_l)), - Some(mesh_fish_medium_fin_r(body.fin_r)), - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - ], - Body::Dragon(body) => [ - Some(mesh_dragon_head(body.head)), - Some(mesh_dragon_chest_front(body.chest_front)), - Some(mesh_dragon_chest_rear(body.chest_rear)), - Some(mesh_dragon_tail_front(body.tail_front)), - Some(mesh_dragon_tail_rear(body.tail_rear)), - Some(mesh_dragon_wing_in_l(body.wing_in_l)), - Some(mesh_dragon_wing_in_r(body.wing_in_r)), - Some(mesh_dragon_wing_out_l(body.wing_out_l)), - Some(mesh_dragon_wing_out_r(body.wing_out_r)), - Some(mesh_dragon_foot_fl(body.foot_fl)), - Some(mesh_dragon_foot_fr(body.foot_fr)), - Some(mesh_dragon_foot_bl(body.foot_bl)), - Some(mesh_dragon_foot_br(body.foot_br)), - None, - None, - None, - ], - Body::BirdSmall(body) => [ - Some(mesh_bird_small_head(body.head)), - Some(mesh_bird_small_torso(body.torso)), - Some(mesh_bird_small_wing_l(body.wing_l)), - Some(mesh_bird_small_wing_r(body.wing_r)), - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - ], - Body::FishSmall(body) => [ - Some(mesh_fish_small_torso(body.torso)), - Some(mesh_fish_small_tail(body.tail)), - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - ], - Body::BipedLarge(body) => [ - Some(mesh_biped_large_head(body.head)), - Some(mesh_biped_large_upper_torso(body.upper_torso)), - Some(mesh_biped_large_lower_torso(body.lower_torso)), - Some(mesh_biped_large_shoulder_l(body.shoulder_l)), - Some(mesh_biped_large_shoulder_r(body.shoulder_r)), - Some(mesh_biped_large_hand_l(body.hand_l)), - Some(mesh_biped_large_hand_r(body.hand_r)), - Some(mesh_biped_large_leg_l(body.leg_l)), - Some(mesh_biped_large_leg_r(body.leg_r)), - Some(mesh_biped_large_foot_l(body.foot_l)), - Some(mesh_biped_large_foot_r(body.foot_r)), - None, - None, - None, - None, - None, - ], - Body::Object(object) => [ - Some(mesh_object(object)), - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - ], - }; + ] + } + Body::QuadrupedSmall(body) => { + let quadruped_small_central_spec = + QuadrupedSmallCentralSpec::load_watched( + &mut self.manifest_indicator, + ); + let quadruped_small_lateral_spec = + QuadrupedSmallLateralSpec::load_watched( + &mut self.manifest_indicator, + ); - let skeleton_attr = match body { - Body::Humanoid(body) => SkeletonAttr::from(&body), - _ => SkeletonAttr::default(), - }; + [ + Some( + quadruped_small_central_spec + .mesh_head(body.species, body.body_type), + ), + Some( + quadruped_small_central_spec + .mesh_chest(body.species, body.body_type), + ), + Some( + quadruped_small_lateral_spec + .mesh_foot_lf(body.species, body.body_type), + ), + Some( + quadruped_small_lateral_spec + .mesh_foot_rf(body.species, body.body_type), + ), + Some( + quadruped_small_lateral_spec + .mesh_foot_lb(body.species, body.body_type), + ), + Some( + quadruped_small_lateral_spec + .mesh_foot_rb(body.species, body.body_type), + ), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ] + } + Body::QuadrupedMedium(body) => { + let quadruped_medium_central_spec = + QuadrupedMediumCentralSpec::load_watched( + &mut self.manifest_indicator, + ); + let quadruped_medium_lateral_spec = + QuadrupedMediumLateralSpec::load_watched( + &mut self.manifest_indicator, + ); - let mut mesh = Mesh::new(); - bone_meshes - .iter() - .enumerate() - .filter_map(|(i, bm)| bm.as_ref().map(|bm| (i, bm))) - .for_each(|(i, bone_mesh)| { - mesh.push_mesh_map(bone_mesh, |vert| { - vert.with_bone_idx(i as u8) - }) - }); + [ + Some( + quadruped_medium_central_spec + .mesh_head_upper(body.species, body.body_type), + ), + Some( + quadruped_medium_central_spec + .mesh_head_lower(body.species, body.body_type), + ), + Some( + quadruped_medium_central_spec + .mesh_jaw(body.species, body.body_type), + ), + Some( + quadruped_medium_central_spec + .mesh_tail(body.species, body.body_type), + ), + Some( + quadruped_medium_central_spec + .mesh_torso_f(body.species, body.body_type), + ), + Some( + quadruped_medium_central_spec + .mesh_torso_b(body.species, body.body_type), + ), + Some( + quadruped_medium_central_spec + .mesh_ears(body.species, body.body_type), + ), + Some( + quadruped_medium_lateral_spec + .mesh_foot_lf(body.species, body.body_type), + ), + Some( + quadruped_medium_lateral_spec + .mesh_foot_rf(body.species, body.body_type), + ), + Some( + quadruped_medium_lateral_spec + .mesh_foot_lb(body.species, body.body_type), + ), + Some( + quadruped_medium_lateral_spec + .mesh_foot_rb(body.species, body.body_type), + ), + None, + None, + None, + None, + None, + ] + } + Body::BirdMedium(body) => { + let bird_medium_center_spec = BirdMediumCenterSpec::load_watched( + &mut self.manifest_indicator, + ); + let bird_medium_lateral_spec = BirdMediumLateralSpec::load_watched( + &mut self.manifest_indicator, + ); - (renderer.create_model(&mesh).unwrap(), skeleton_attr) - }, - tick, - ), - ); + [ + Some( + bird_medium_center_spec + .mesh_head(body.species, body.body_type), + ), + Some( + bird_medium_center_spec + .mesh_torso(body.species, body.body_type), + ), + Some( + bird_medium_center_spec + .mesh_tail(body.species, body.body_type), + ), + Some( + bird_medium_lateral_spec + .mesh_wing_l(body.species, body.body_type), + ), + Some( + bird_medium_lateral_spec + .mesh_wing_r(body.species, body.body_type), + ), + Some( + bird_medium_lateral_spec + .mesh_foot_l(body.species, body.body_type), + ), + Some( + bird_medium_lateral_spec + .mesh_foot_r(body.species, body.body_type), + ), + None, + None, + None, + None, + None, + None, + None, + None, + None, + ] + } + Body::FishMedium(body) => [ + Some(mesh_fish_medium_head(body.head)), + Some(mesh_fish_medium_torso(body.torso)), + Some(mesh_fish_medium_rear(body.rear)), + Some(mesh_fish_medium_tail(body.tail)), + Some(mesh_fish_medium_fin_l(body.fin_l)), + Some(mesh_fish_medium_fin_r(body.fin_r)), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ], + Body::Dragon(body) => [ + Some(mesh_dragon_head(body.head)), + Some(mesh_dragon_chest_front(body.chest_front)), + Some(mesh_dragon_chest_rear(body.chest_rear)), + Some(mesh_dragon_tail_front(body.tail_front)), + Some(mesh_dragon_tail_rear(body.tail_rear)), + Some(mesh_dragon_wing_in_l(body.wing_in_l)), + Some(mesh_dragon_wing_in_r(body.wing_in_r)), + Some(mesh_dragon_wing_out_l(body.wing_out_l)), + Some(mesh_dragon_wing_out_r(body.wing_out_r)), + Some(mesh_dragon_foot_fl(body.foot_fl)), + Some(mesh_dragon_foot_fr(body.foot_fr)), + Some(mesh_dragon_foot_bl(body.foot_bl)), + Some(mesh_dragon_foot_br(body.foot_br)), + None, + None, + None, + ], + Body::BirdSmall(body) => [ + Some(mesh_bird_small_head(body.head)), + Some(mesh_bird_small_torso(body.torso)), + Some(mesh_bird_small_wing_l(body.wing_l)), + Some(mesh_bird_small_wing_r(body.wing_r)), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ], + Body::FishSmall(body) => [ + Some(mesh_fish_small_torso(body.torso)), + Some(mesh_fish_small_tail(body.tail)), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ], + Body::BipedLarge(body) => { + let biped_large_center_spec = BipedLargeCenterSpec::load_watched( + &mut self.manifest_indicator, + ); + let biped_large_lateral_spec = BipedLargeLateralSpec::load_watched( + &mut self.manifest_indicator, + ); + + [ + Some( + biped_large_center_spec + .mesh_head(body.species, body.body_type), + ), + Some( + biped_large_center_spec + .mesh_torso_upper(body.species, body.body_type), + ), + Some( + biped_large_center_spec + .mesh_torso_lower(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_shoulder_l(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_shoulder_r(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_hand_l(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_hand_r(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_leg_l(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_leg_r(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_foot_l(body.species, body.body_type), + ), + Some( + biped_large_lateral_spec + .mesh_foot_r(body.species, body.body_type), + ), + None, + None, + None, + None, + None, + ] + } + Body::Critter(body) => { + let critter_center_spec = + CritterCenterSpec::load_watched(&mut self.manifest_indicator); + + [ + Some( + critter_center_spec.mesh_head(body.species, body.body_type), + ), + Some( + critter_center_spec + .mesh_chest(body.species, body.body_type), + ), + Some( + critter_center_spec + .mesh_feet_f(body.species, body.body_type), + ), + Some( + critter_center_spec + .mesh_feet_b(body.species, body.body_type), + ), + Some( + critter_center_spec.mesh_tail(body.species, body.body_type), + ), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ] + } + Body::Object(object) => [ + Some(mesh_object(object)), + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ], + }; + + let skeleton_attr = (&body) + .try_into() + .ok() + .unwrap_or_else(::default); + + let mut mesh = Mesh::new(); + bone_meshes + .iter() + .enumerate() + .filter_map(|(i, bm)| bm.as_ref().map(|bm| (i, bm))) + .for_each(|(i, bone_mesh)| { + mesh.push_mesh_map(bone_mesh, |vert| vert.with_bone_idx(i as u8)) + }); + + (renderer.create_model(&mesh).unwrap(), skeleton_attr) + }, + tick, + )) + .0 } } - - &self.models[&key].0 } pub fn clean(&mut self, tick: u64) { diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index fe553db45a..656d884b6c 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -6,12 +6,19 @@ use common::comp::humanoid::Body; use common::{ assets::{self, watch::ReloadIndicator, Asset}, comp::{ - biped_large, bird_medium, bird_small, dragon, fish_medium, fish_small, + biped_large::{BodyType as BLBodyType, Species as BLSpecies}, + bird_medium::{BodyType as BMBodyType, Species as BMSpecies}, + bird_small, + critter::{BodyType as CBodyType, Species as CSpecies}, + dragon, fish_medium, fish_small, humanoid::{ Belt, BodyType, Chest, EyeColor, Eyebrows, Foot, Hand, Pants, Race, Shoulder, Skin, }, item::Tool, - object, quadruped_medium, quadruped_small, Item, ItemKind, + object, + quadruped_medium::{BodyType as QMBodyType, Species as QMSpecies}, + quadruped_small::{BodyType as QSBodyType, Species as QSSpecies}, + Item, ItemKind, }, figure::{DynaUnionizer, MatSegment, Material, Segment}, }; @@ -88,7 +95,9 @@ fn recolor_grey(rgb: Rgb, color: Rgb) -> Rgb { #[derive(Serialize, Deserialize)] struct VoxSpec(String, [T; 3]); -// Armor can have the color modified. +#[derive(Serialize, Deserialize)] +struct VoxSimple(String); + #[derive(Serialize, Deserialize)] struct ArmorVoxSpec { vox_spec: VoxSpec, @@ -102,6 +111,12 @@ struct SidedArmorVoxSpec { right: ArmorVoxSpec, } +#[derive(Serialize, Deserialize)] +struct MobSidedVoxSpec { + left: ArmorVoxSpec, + right: ArmorVoxSpec, +} + // All reliant on humanoid::Race and humanoid::BodyType #[derive(Serialize, Deserialize)] struct HumHeadSubSpec { @@ -540,228 +555,664 @@ pub fn mesh_lantern() -> Mesh { } ///////// -pub fn mesh_quadruped_small_head(head: quadruped_small::Head) -> Mesh { - load_mesh( - match head { - quadruped_small::Head::Default => "npc.pig_purple.head", - }, - Vec3::new(-6.0, 4.5, 3.0), - ) +#[derive(Serialize, Deserialize)] +pub struct QuadrupedSmallCentralSpec(HashMap<(QSSpecies, QSBodyType), SidedQSCentralVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedQSCentralVoxSpec { + head: QuadrupedSmallCentralSubSpec, + chest: QuadrupedSmallCentralSubSpec, +} +#[derive(Serialize, Deserialize)] +struct QuadrupedSmallCentralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + central: VoxSimple, } -pub fn mesh_quadruped_small_chest(chest: quadruped_small::Chest) -> Mesh { - load_mesh( - match chest { - quadruped_small::Chest::Default => "npc.pig_purple.chest", - }, - Vec3::new(-5.0, 4.5, 0.0), - ) +#[derive(Serialize, Deserialize)] +pub struct QuadrupedSmallLateralSpec(HashMap<(QSSpecies, QSBodyType), SidedQSLateralVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedQSLateralVoxSpec { + left_front: QuadrupedSmallLateralSubSpec, + right_front: QuadrupedSmallLateralSubSpec, + left_back: QuadrupedSmallLateralSubSpec, + right_back: QuadrupedSmallLateralSubSpec, +} +#[derive(Serialize, Deserialize)] +struct QuadrupedSmallLateralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + lateral: VoxSimple, } -pub fn mesh_quadruped_small_leg_lf(leg_l: quadruped_small::LegL) -> Mesh { - load_mesh( - match leg_l { - quadruped_small::LegL::Default => "npc.pig_purple.leg_l", - }, - Vec3::new(0.0, -1.0, -1.5), - ) +impl Asset for QuadrupedSmallCentralSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing quad_small central spec")) + } } -pub fn mesh_quadruped_small_leg_rf(leg_r: quadruped_small::LegR) -> Mesh { - load_mesh( - match leg_r { - quadruped_small::LegR::Default => "npc.pig_purple.leg_r", - }, - Vec3::new(0.0, -1.0, -1.5), - ) +impl Asset for QuadrupedSmallLateralSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing quadruped small lateral spec")) + } } -pub fn mesh_quadruped_small_leg_lb(leg_l: quadruped_small::LegL) -> Mesh { - load_mesh( - match leg_l { - quadruped_small::LegL::Default => "npc.pig_purple.leg_l", - }, - Vec3::new(0.0, -1.0, -1.5), - ) +impl QuadrupedSmallCentralSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.quadruped_small_central_manifest", indicator) + .unwrap() + } + pub fn mesh_head(&self, species: QSSpecies, body_type: QSBodyType) -> Mesh { + 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); + + generate_mesh(¢ral, Vec3::from(spec.head.offset)) + } + pub fn mesh_chest(&self, species: QSSpecies, body_type: QSBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No chest 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.chest.central.0); + + generate_mesh(¢ral, Vec3::from(spec.chest.offset)) + } } -pub fn mesh_quadruped_small_leg_rb(leg_r: quadruped_small::LegR) -> Mesh { - load_mesh( - match leg_r { - quadruped_small::LegR::Default => "npc.pig_purple.leg_r", - }, - Vec3::new(0.0, -1.0, -1.5), - ) +impl QuadrupedSmallLateralSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.quadruped_small_lateral_manifest", indicator) + .unwrap() + } + + pub fn mesh_foot_lf(&self, species: QSSpecies, body_type: QSBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.left_front.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.left_front.offset)) + } + pub fn mesh_foot_rf(&self, species: QSSpecies, body_type: QSBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.right_front.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.right_front.offset)) + } + pub fn mesh_foot_lb(&self, species: QSSpecies, body_type: QSBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.left_back.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.left_back.offset)) + } + pub fn mesh_foot_rb(&self, species: QSSpecies, body_type: QSBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.right_back.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.right_back.offset)) + } } + ////// -pub fn mesh_quadruped_medium_head_upper( - upper_head: quadruped_medium::HeadUpper, -) -> Mesh { - load_mesh( - match upper_head { - quadruped_medium::HeadUpper::Default => "npc.wolf.head_upper", - }, - Vec3::new(-7.0, -6.0, -5.5), - ) +#[derive(Serialize, Deserialize)] +pub struct QuadrupedMediumCentralSpec(HashMap<(QMSpecies, QMBodyType), SidedQMCentralVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedQMCentralVoxSpec { + upper: QuadrupedMediumCentralSubSpec, + lower: QuadrupedMediumCentralSubSpec, + jaw: QuadrupedMediumCentralSubSpec, + ears: QuadrupedMediumCentralSubSpec, + torso_f: QuadrupedMediumCentralSubSpec, + torso_b: QuadrupedMediumCentralSubSpec, + tail: QuadrupedMediumCentralSubSpec, +} +#[derive(Serialize, Deserialize)] +struct QuadrupedMediumCentralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + central: VoxSimple, } -pub fn mesh_quadruped_medium_jaw(jaw: quadruped_medium::Jaw) -> Mesh { - load_mesh( - match jaw { - quadruped_medium::Jaw::Default => "npc.wolf.jaw", - }, - Vec3::new(-3.0, -3.0, -2.5), - ) +#[derive(Serialize, Deserialize)] +pub struct QuadrupedMediumLateralSpec(HashMap<(QMSpecies, QMBodyType), SidedQMLateralVoxSpec>); +#[derive(Serialize, Deserialize)] +struct SidedQMLateralVoxSpec { + left_front: QuadrupedMediumLateralSubSpec, + right_front: QuadrupedMediumLateralSubSpec, + left_back: QuadrupedMediumLateralSubSpec, + right_back: QuadrupedMediumLateralSubSpec, +} +#[derive(Serialize, Deserialize)] +struct QuadrupedMediumLateralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + lateral: VoxSimple, } -pub fn mesh_quadruped_medium_head_lower( - head_lower: quadruped_medium::HeadLower, -) -> Mesh { - load_mesh( - match head_lower { - quadruped_medium::HeadLower::Default => "npc.wolf.head_lower", - }, - Vec3::new(-7.0, -6.0, -5.5), - ) +impl Asset for QuadrupedMediumCentralSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing quadruped medium central spec")) + } } -pub fn mesh_quadruped_medium_tail(tail: quadruped_medium::Tail) -> Mesh { - load_mesh( - match tail { - quadruped_medium::Tail::Default => "npc.wolf.tail", - }, - Vec3::new(-2.0, -12.0, -5.0), - ) +impl Asset for QuadrupedMediumLateralSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing quadruped medium lateral spec")) + } } -pub fn mesh_quadruped_medium_torso_back( - torso_back: quadruped_medium::TorsoBack, -) -> Mesh { - load_mesh( - match torso_back { - quadruped_medium::TorsoBack::Default => "npc.wolf.torso_back", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) +impl QuadrupedMediumCentralSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.quadruped_medium_central_manifest", indicator) + .unwrap() + } + + pub fn mesh_head_upper( + &self, + species: QMSpecies, + body_type: QMBodyType, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No upper 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.upper.central.0); + + generate_mesh(¢ral, Vec3::from(spec.upper.offset)) + } + pub fn mesh_head_lower( + &self, + species: QMSpecies, + body_type: QMBodyType, + ) -> Mesh { + 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)); + } + }; + let central = graceful_load_segment(&spec.lower.central.0); + + generate_mesh(¢ral, Vec3::from(spec.lower.offset)) + } + pub fn mesh_jaw(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + 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)); + } + }; + let central = graceful_load_segment(&spec.jaw.central.0); + + generate_mesh(¢ral, Vec3::from(spec.jaw.offset)) + } + pub fn mesh_ears(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No ears 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.ears.central.0); + + generate_mesh(¢ral, Vec3::from(spec.ears.offset)) + } + pub fn mesh_torso_f(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No torso 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.torso_f.central.0); + + generate_mesh(¢ral, Vec3::from(spec.torso_f.offset)) + } + pub fn mesh_torso_b(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No torso 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.torso_b.central.0); + + generate_mesh(¢ral, Vec3::from(spec.torso_b.offset)) + } + pub fn mesh_tail(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No tail 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.tail.central.0); + + generate_mesh(¢ral, Vec3::from(spec.tail.offset)) + } } -pub fn mesh_quadruped_medium_torso_mid( - torso_mid: quadruped_medium::TorsoMid, -) -> Mesh { - load_mesh( - match torso_mid { - quadruped_medium::TorsoMid::Default => "npc.wolf.torso_mid", - }, - Vec3::new(-8.0, -5.5, -6.0), - ) +impl QuadrupedMediumLateralSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.quadruped_medium_lateral_manifest", indicator) + .unwrap() + } + + pub fn mesh_foot_lf(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.left_front.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.left_front.offset)) + } + + pub fn mesh_foot_rf(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.right_front.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.right_front.offset)) + } + pub fn mesh_foot_lb(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.left_back.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.left_back.offset)) + } + pub fn mesh_foot_rb(&self, species: QMSpecies, body_type: QMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.right_back.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.right_back.offset)) + } } -pub fn mesh_quadruped_medium_ears(ears: quadruped_medium::Ears) -> Mesh { - load_mesh( - match ears { - quadruped_medium::Ears::Default => "npc.wolf.ears", - }, - Vec3::new(-4.0, -1.0, -1.0), - ) +//// +#[derive(Serialize, Deserialize)] +pub struct BirdMediumCenterSpec(HashMap<(BMSpecies, BMBodyType), SidedBMCenterVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedBMCenterVoxSpec { + head: BirdMediumCenterSubSpec, + torso: BirdMediumCenterSubSpec, + tail: BirdMediumCenterSubSpec, +} +#[derive(Serialize, Deserialize)] +struct BirdMediumCenterSubSpec { + offset: [f32; 3], // Should be relative to initial origin + center: VoxSimple, } -pub fn mesh_quadruped_medium_foot_lf(foot_lf: quadruped_medium::FootLF) -> Mesh { - load_mesh( - match foot_lf { - quadruped_medium::FootLF::Default => "npc.wolf.foot_lf", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) +#[derive(Serialize, Deserialize)] +pub struct BirdMediumLateralSpec(HashMap<(BMSpecies, BMBodyType), SidedBMLateralVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedBMLateralVoxSpec { + wing_l: BirdMediumLateralSubSpec, + wing_r: BirdMediumLateralSubSpec, + foot_l: BirdMediumLateralSubSpec, + foot_r: BirdMediumLateralSubSpec, +} +#[derive(Serialize, Deserialize)] +struct BirdMediumLateralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + lateral: VoxSimple, } -pub fn mesh_quadruped_medium_foot_rf(foot_rf: quadruped_medium::FootRF) -> Mesh { - load_mesh( - match foot_rf { - quadruped_medium::FootRF::Default => "npc.wolf.foot_rf", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) +impl Asset for BirdMediumCenterSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing bird medium center spec")) + } } -pub fn mesh_quadruped_medium_foot_lb(foot_lb: quadruped_medium::FootLB) -> Mesh { - load_mesh( - match foot_lb { - quadruped_medium::FootLB::Default => "npc.wolf.foot_lb", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) +impl Asset for BirdMediumLateralSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing bird medium lateral spec")) + } } -pub fn mesh_quadruped_medium_foot_rb(foot_rb: quadruped_medium::FootRB) -> Mesh { - load_mesh( - match foot_rb { - quadruped_medium::FootRB::Default => "npc.wolf.foot_rb", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) +impl BirdMediumCenterSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.bird_medium_center_manifest", indicator) + .unwrap() + } + + pub fn mesh_head(&self, species: BMSpecies, body_type: BMBodyType) -> Mesh { + 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 center = graceful_load_segment(&spec.head.center.0); + + generate_mesh(¢er, Vec3::from(spec.head.offset)) + } + pub fn mesh_torso(&self, species: BMSpecies, body_type: BMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No torso specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.torso.center.0); + + generate_mesh(¢er, Vec3::from(spec.torso.offset)) + } + pub fn mesh_tail(&self, species: BMSpecies, body_type: BMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No tail specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.tail.center.0); + + generate_mesh(¢er, Vec3::from(spec.tail.offset)) + } +} +impl BirdMediumLateralSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.bird_medium_lateral_manifest", indicator) + .unwrap() + } + + pub fn mesh_wing_l(&self, species: BMSpecies, body_type: BMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No wing specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.wing_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.wing_l.offset)) + } + pub fn mesh_wing_r(&self, species: BMSpecies, body_type: BMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No wing specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.wing_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.wing_r.offset)) + } + pub fn mesh_foot_l(&self, species: BMSpecies, body_type: BMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.foot_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_l.offset)) + } + pub fn mesh_foot_r(&self, species: BMSpecies, body_type: BMBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.foot_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_r.offset)) + } } //// -pub fn mesh_bird_medium_head(head: bird_medium::Head) -> Mesh { - load_mesh( - match head { - bird_medium::Head::Default => "npc.duck_m.head", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) +#[derive(Serialize, Deserialize)] +pub struct CritterCenterSpec(HashMap<(CSpecies, CBodyType), SidedCCenterVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedCCenterVoxSpec { + head: CritterCenterSubSpec, + chest: CritterCenterSubSpec, + feet_f: CritterCenterSubSpec, + feet_b: CritterCenterSubSpec, + tail: CritterCenterSubSpec, +} +#[derive(Serialize, Deserialize)] +struct CritterCenterSubSpec { + offset: [f32; 3], // Should be relative to initial origin + center: VoxSimple, } -pub fn mesh_bird_medium_torso(torso: bird_medium::Torso) -> Mesh { - load_mesh( - match torso { - bird_medium::Torso::Default => "npc.duck_m.body", - }, - Vec3::new(-8.0, -5.5, -6.0), - ) +impl Asset for CritterCenterSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing critter center spec")) + } } -pub fn mesh_bird_medium_tail(tail: bird_medium::Tail) -> Mesh { - load_mesh( - match tail { - bird_medium::Tail::Default => "npc.duck_m.tail", - }, - Vec3::new(-4.0, -1.0, -1.0), - ) -} +impl CritterCenterSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.critter_center_manifest", indicator).unwrap() + } -pub fn mesh_bird_medium_wing_l(wing_l: bird_medium::WingL) -> Mesh { - load_mesh( - match wing_l { - bird_medium::WingL::Default => "npc.duck_m.wing", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) -} + pub fn mesh_head(&self, species: CSpecies, body_type: CBodyType) -> Mesh { + 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 center = graceful_load_segment(&spec.head.center.0); -pub fn mesh_bird_medium_wing_r(wing_r: bird_medium::WingR) -> Mesh { - load_mesh( - match wing_r { - bird_medium::WingR::Default => "npc.duck_m.wing", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) -} + generate_mesh(¢er, Vec3::from(spec.head.offset)) + } + pub fn mesh_chest(&self, species: CSpecies, body_type: CBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No chest specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.chest.center.0); -pub fn mesh_bird_medium_leg_l(leg_l: bird_medium::LegL) -> Mesh { - load_mesh( - match leg_l { - bird_medium::LegL::Default => "npc.duck_m.leg_l", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) -} + generate_mesh(¢er, Vec3::from(spec.chest.offset)) + } + pub fn mesh_feet_f(&self, species: CSpecies, body_type: CBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No feet specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.feet_f.center.0); -pub fn mesh_bird_medium_leg_r(leg_r: bird_medium::LegR) -> Mesh { - load_mesh( - match leg_r { - bird_medium::LegR::Default => "npc.duck_m.leg_r", - }, - Vec3::new(-2.5, -4.0, -2.5), - ) + generate_mesh(¢er, Vec3::from(spec.feet_f.offset)) + } + pub fn mesh_feet_b(&self, species: CSpecies, body_type: CBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No feet specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.feet_b.center.0); + + generate_mesh(¢er, Vec3::from(spec.feet_b.offset)) + } + pub fn mesh_tail(&self, species: CSpecies, body_type: CBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No tail specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.tail.center.0); + + generate_mesh(¢er, Vec3::from(spec.tail.offset)) + } } //// pub fn mesh_fish_medium_head(head: fish_medium::Head) -> Mesh { @@ -817,7 +1268,7 @@ pub fn mesh_fish_medium_fin_r(fin_r: fish_medium::FinR) -> Mesh Vec3::new(-7.0, -6.0, -6.0), ) } -//// + pub fn mesh_dragon_head(head: dragon::Head) -> Mesh { load_mesh( match head { @@ -990,105 +1441,255 @@ pub fn mesh_fish_small_tail(tail: fish_small::Tail) -> Mesh { ) } //// -pub fn mesh_biped_large_head(head: biped_large::Head) -> Mesh { - load_mesh( - match head { - biped_large::Head::Default => "npc.knight.head", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) +#[derive(Serialize, Deserialize)] +pub struct BipedLargeCenterSpec(HashMap<(BLSpecies, BLBodyType), SidedBLCenterVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedBLCenterVoxSpec { + head: BipedLargeCenterSubSpec, + torso_upper: BipedLargeCenterSubSpec, + torso_lower: BipedLargeCenterSubSpec, +} +#[derive(Serialize, Deserialize)] +struct BipedLargeCenterSubSpec { + offset: [f32; 3], // Should be relative to initial origin + center: VoxSimple, } -pub fn mesh_biped_large_upper_torso(upper_torso: biped_large::UpperTorso) -> Mesh { - load_mesh( - match upper_torso { - biped_large::UpperTorso::Default => "npc.knight.upper_torso", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) +#[derive(Serialize, Deserialize)] +pub struct BipedLargeLateralSpec(HashMap<(BLSpecies, BLBodyType), SidedBLLateralVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedBLLateralVoxSpec { + shoulder_l: BipedLargeLateralSubSpec, + shoulder_r: BipedLargeLateralSubSpec, + hand_l: BipedLargeLateralSubSpec, + hand_r: BipedLargeLateralSubSpec, + leg_l: BipedLargeLateralSubSpec, + leg_r: BipedLargeLateralSubSpec, + foot_l: BipedLargeLateralSubSpec, + foot_r: BipedLargeLateralSubSpec, +} +#[derive(Serialize, Deserialize)] +struct BipedLargeLateralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + lateral: VoxSimple, } -pub fn mesh_biped_large_lower_torso(lower_torso: biped_large::LowerTorso) -> Mesh { - load_mesh( - match lower_torso { - biped_large::LowerTorso::Default => "npc.knight.lower_torso", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) +impl Asset for BipedLargeCenterSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing biped large center spec")) + } } -pub fn mesh_biped_large_shoulder_l(shoulder_l: biped_large::ShoulderL) -> Mesh { - load_mesh( - match shoulder_l { - biped_large::ShoulderL::Default => "npc.knight.shoulder_l", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) +impl Asset for BipedLargeLateralSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + fn parse(buf_reader: BufReader) -> Result { + Ok(ron::de::from_reader(buf_reader).expect("Error parsing biped large lateral spec")) + } } -pub fn mesh_biped_large_shoulder_r(shoulder_r: biped_large::ShoulderR) -> Mesh { - load_mesh( - match shoulder_r { - biped_large::ShoulderR::Default => "npc.knight.shoulder_r", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) -} +impl BipedLargeCenterSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.biped_large_center_manifest", indicator) + .unwrap() + } -pub fn mesh_biped_large_hand_l(hand_l: biped_large::HandL) -> Mesh { - load_mesh( - match hand_l { - biped_large::HandL::Default => "npc.knight.hand_l", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) -} + pub fn mesh_head(&self, species: BLSpecies, body_type: BLBodyType) -> Mesh { + 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 center = graceful_load_segment(&spec.head.center.0); -pub fn mesh_biped_large_hand_r(hand_r: biped_large::HandR) -> Mesh { - load_mesh( - match hand_r { - biped_large::HandR::Default => "npc.knight.hand_r", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) -} + generate_mesh(¢er, Vec3::from(spec.head.offset)) + } + pub fn mesh_torso_upper( + &self, + species: BLSpecies, + body_type: BLBodyType, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No torso upper specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.torso_upper.center.0); -pub fn mesh_biped_large_leg_l(leg_l: biped_large::LegL) -> Mesh { - load_mesh( - match leg_l { - biped_large::LegL::Default => "npc.knight.leg_l", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) -} + generate_mesh(¢er, Vec3::from(spec.torso_upper.offset)) + } + pub fn mesh_torso_lower( + &self, + species: BLSpecies, + body_type: BLBodyType, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No torso lower specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let center = graceful_load_segment(&spec.torso_lower.center.0); -pub fn mesh_biped_large_leg_r(leg_r: biped_large::LegR) -> Mesh { - load_mesh( - match leg_r { - biped_large::LegR::Default => "npc.knight.leg_r", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) + generate_mesh(¢er, Vec3::from(spec.torso_lower.offset)) + } } +impl BipedLargeLateralSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.biped_large_lateral_manifest", indicator) + .unwrap() + } -pub fn mesh_biped_large_foot_l(foot_l: biped_large::FootL) -> Mesh { - load_mesh( - match foot_l { - biped_large::FootL::Default => "npc.knight.foot_l", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) + pub fn mesh_shoulder_l( + &self, + species: BLSpecies, + body_type: BLBodyType, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No shoulder specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.shoulder_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.shoulder_l.offset)) + } + + pub fn mesh_shoulder_r( + &self, + species: BLSpecies, + body_type: BLBodyType, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No shoulder specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.shoulder_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.shoulder_r.offset)) + } + + pub fn mesh_hand_l(&self, species: BLSpecies, body_type: BLBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No hand specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.hand_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.hand_l.offset)) + } + + pub fn mesh_hand_r(&self, species: BLSpecies, body_type: BLBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No hand specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.hand_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.hand_r.offset)) + } + pub fn mesh_leg_l(&self, species: BLSpecies, body_type: BLBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.leg_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.leg_l.offset)) + } + + pub fn mesh_leg_r(&self, species: BLSpecies, body_type: BLBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No leg specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.leg_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.leg_r.offset)) + } + pub fn mesh_foot_l(&self, species: BLSpecies, body_type: BLBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.foot_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_l.offset)) + } + + pub fn mesh_foot_r(&self, species: BLSpecies, body_type: BLBodyType) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); + } + }; + let lateral = graceful_load_segment(&spec.foot_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_r.offset)) + } } - -pub fn mesh_biped_large_foot_r(foot_r: biped_large::FootR) -> Mesh { - load_mesh( - match foot_r { - biped_large::FootR::Default => "npc.knight.foot_r", - }, - Vec3::new(-7.0, -6.0, -6.0), - ) -} - //// pub fn mesh_object(obj: object::Body) -> Mesh { use object::Body; diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index b706be5183..0ea5b68ac1 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -7,10 +7,10 @@ pub use load::load_mesh; // TODO: Don't make this public. use crate::{ anim::{ self, biped_large::BipedLargeSkeleton, bird_medium::BirdMediumSkeleton, - bird_small::BirdSmallSkeleton, character::CharacterSkeleton, dragon::DragonSkeleton, - fish_medium::FishMediumSkeleton, fish_small::FishSmallSkeleton, object::ObjectSkeleton, - quadruped_medium::QuadrupedMediumSkeleton, quadruped_small::QuadrupedSmallSkeleton, - Animation, Skeleton, + bird_small::BirdSmallSkeleton, character::CharacterSkeleton, critter::CritterSkeleton, + dragon::DragonSkeleton, fish_medium::FishMediumSkeleton, fish_small::FishSmallSkeleton, + object::ObjectSkeleton, quadruped_medium::QuadrupedMediumSkeleton, + quadruped_small::QuadrupedSmallSkeleton, Animation, Skeleton, }, render::{Consts, FigureBoneData, FigureLocals, Globals, Light, Renderer, Shadow}, scene::camera::{Camera, CameraMode}, @@ -34,11 +34,21 @@ const DAMAGE_FADE_COEFFICIENT: f64 = 5.0; pub struct FigureMgr { model_cache: FigureModelCache, + critter_model_cache: FigureModelCache, + quadruped_small_model_cache: FigureModelCache, + quadruped_medium_model_cache: FigureModelCache, + bird_medium_model_cache: FigureModelCache, + bird_small_model_cache: FigureModelCache, + dragon_model_cache: FigureModelCache, + fish_medium_model_cache: FigureModelCache, + fish_small_model_cache: FigureModelCache, + biped_large_model_cache: FigureModelCache, character_states: HashMap>, quadruped_small_states: HashMap>, quadruped_medium_states: HashMap>, bird_medium_states: HashMap>, fish_medium_states: HashMap>, + critter_states: HashMap>, dragon_states: HashMap>, bird_small_states: HashMap>, fish_small_states: HashMap>, @@ -50,11 +60,21 @@ impl FigureMgr { pub fn new() -> Self { Self { model_cache: FigureModelCache::new(), + critter_model_cache: FigureModelCache::new(), + quadruped_small_model_cache: FigureModelCache::new(), + quadruped_medium_model_cache: FigureModelCache::new(), + bird_medium_model_cache: FigureModelCache::new(), + bird_small_model_cache: FigureModelCache::new(), + dragon_model_cache: FigureModelCache::new(), + fish_medium_model_cache: FigureModelCache::new(), + fish_small_model_cache: FigureModelCache::new(), + biped_large_model_cache: FigureModelCache::new(), character_states: HashMap::new(), quadruped_small_states: HashMap::new(), quadruped_medium_states: HashMap::new(), bird_medium_states: HashMap::new(), fish_medium_states: HashMap::new(), + critter_states: HashMap::new(), dragon_states: HashMap::new(), bird_small_states: HashMap::new(), fish_small_states: HashMap::new(), @@ -65,6 +85,15 @@ impl FigureMgr { pub fn clean(&mut self, tick: u64) { self.model_cache.clean(tick); + self.critter_model_cache.clean(tick); + self.quadruped_small_model_cache.clean(tick); + self.quadruped_medium_model_cache.clean(tick); + self.bird_medium_model_cache.clean(tick); + self.bird_small_model_cache.clean(tick); + self.dragon_model_cache.clean(tick); + self.fish_medium_model_cache.clean(tick); + self.fish_small_model_cache.clean(tick); + self.biped_large_model_cache.clean(tick); } pub fn maintain(&mut self, renderer: &mut Renderer, client: &Client, camera: &Camera) { @@ -117,6 +146,9 @@ impl FigureMgr { Body::FishMedium(_) => { self.fish_medium_states.remove(&entity); } + Body::Critter(_) => { + self.critter_states.remove(&entity); + } Body::Dragon(_) => { self.dragon_states.remove(&entity); } @@ -161,6 +193,11 @@ impl FigureMgr { .get_mut(&entity) .map(|state| state.visible = false); } + Body::Critter(_) => { + self.critter_states + .get_mut(&entity) + .map(|state| state.visible = false); + } Body::Dragon(_) => { self.dragon_states .get_mut(&entity) @@ -216,6 +253,9 @@ impl FigureMgr { .fish_medium_states .get(&entity) .map(|state| state.lpindex), + Body::Critter(_) => { + self.critter_states.get(&entity).map(|state| state.lpindex) + } Body::Dragon(_) => { self.dragon_states.get(&entity).map(|state| state.lpindex) } @@ -270,6 +310,12 @@ impl FigureMgr { state.visible = false }); } + Body::Critter(_) => { + self.critter_states.get_mut(&entity).map(|state| { + state.lpindex = lpindex; + state.visible = false + }); + } Body::Dragon(_) => { self.dragon_states.get_mut(&entity).map(|state| { state.lpindex = lpindex; @@ -316,18 +362,6 @@ impl FigureMgr { let scale = scale.map(|s| s.0).unwrap_or(1.0); - let skeleton_attr = &self - .model_cache - .get_or_create_model( - renderer, - *body, - stats.map(|s| &s.equipment), - tick, - CameraMode::default(), - None, - ) - .1; - let mut movement_animation_rate = 1.0; let mut action_animation_rate = 1.0; @@ -348,6 +382,18 @@ impl FigureMgr { match body { Body::Humanoid(_) => { + let skeleton_attr = &self + .model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .character_states .entry(entity) @@ -486,6 +532,18 @@ impl FigureMgr { ); } Body::QuadrupedSmall(_) => { + let skeleton_attr = &self + .quadruped_small_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .quadruped_small_states .entry(entity) @@ -545,6 +603,18 @@ impl FigureMgr { ); } Body::QuadrupedMedium(_) => { + let skeleton_attr = &self + .quadruped_medium_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .quadruped_medium_states .entry(entity) @@ -604,6 +674,18 @@ impl FigureMgr { ); } Body::BirdMedium(_) => { + let skeleton_attr = &self + .bird_medium_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .bird_medium_states .entry(entity) @@ -661,6 +743,18 @@ impl FigureMgr { ); } Body::FishMedium(_) => { + let skeleton_attr = &self + .fish_medium_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .fish_medium_states .entry(entity) @@ -718,6 +812,18 @@ impl FigureMgr { ); } Body::Dragon(_) => { + let skeleton_attr = &self + .dragon_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .dragon_states .entry(entity) @@ -774,7 +880,88 @@ impl FigureMgr { true, ); } + Body::Critter(_) => { + let skeleton_attr = &self + .critter_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + + let state = self + .critter_states + .entry(entity) + .or_insert_with(|| FigureState::new(renderer, CritterSkeleton::new())); + + let (character, last_character) = match (character, last_character) { + (Some(c), Some(l)) => (c, l), + _ => continue, + }; + + if !character.is_same_movement(&last_character.0) { + state.movement_time = 0.0; + } + + let target_base = match character.movement { + Stand => anim::critter::IdleAnimation::update_skeleton( + &CritterSkeleton::new(), + time, + state.movement_time, + &mut movement_animation_rate, + skeleton_attr, + ), + Run => anim::critter::RunAnimation::update_skeleton( + &CritterSkeleton::new(), + (vel.0.magnitude(), time), + state.movement_time, + &mut movement_animation_rate, + skeleton_attr, + ), + Jump => anim::critter::JumpAnimation::update_skeleton( + &CritterSkeleton::new(), + (vel.0.magnitude(), time), + state.movement_time, + &mut movement_animation_rate, + skeleton_attr, + ), + + // TODO! + _ => state.skeleton_mut().clone(), + }; + + state.skeleton.interpolate(&target_base, dt); + state.update( + renderer, + pos.0, + vel.0, + ori.0, + scale, + col, + dt, + movement_animation_rate, + action_animation_rate, + lpindex, + true, + ); + } Body::BirdSmall(_) => { + let skeleton_attr = &self + .bird_small_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .bird_small_states .entry(entity) @@ -832,6 +1019,18 @@ impl FigureMgr { ); } Body::FishSmall(_) => { + let skeleton_attr = &self + .fish_small_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .fish_small_states .entry(entity) @@ -889,6 +1088,18 @@ impl FigureMgr { ); } Body::BipedLarge(_) => { + let skeleton_attr = &self + .biped_large_model_cache + .get_or_create_model( + renderer, + *body, + stats.map(|s| &s.equipment), + tick, + CameraMode::default(), + None, + ) + .1; + let state = self .biped_large_states .entry(entity) @@ -980,6 +1191,8 @@ impl FigureMgr { .retain(|entity, _| ecs.entities().is_alive(*entity)); self.fish_medium_states .retain(|entity, _| ecs.entities().is_alive(*entity)); + self.critter_states + .retain(|entity, _| ecs.entities().is_alive(*entity)); self.dragon_states .retain(|entity, _| ecs.entities().is_alive(*entity)); self.bird_small_states @@ -1021,72 +1234,219 @@ impl FigureMgr { // Don't render dead entities .filter(|(_, _, _, _, stats, _)| stats.map_or(true, |s| !s.is_dead)) { - if let Some((locals, bone_consts, visible)) = match body { - Body::Humanoid(_) => self - .character_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::QuadrupedSmall(_) => self - .quadruped_small_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::QuadrupedMedium(_) => self - .quadruped_medium_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::BirdMedium(_) => self - .bird_medium_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::FishMedium(_) => self - .fish_medium_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::Dragon(_) => self - .dragon_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::BirdSmall(_) => self - .bird_small_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::FishSmall(_) => self - .fish_small_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::BipedLarge(_) => self - .biped_large_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - Body::Object(_) => self - .object_states - .get(&entity) - .map(|state| (state.locals(), state.bone_consts(), state.visible)), - } { - if !visible { - continue; - } + let is_player = entity == client.entity(); + let player_camera_mode = if is_player { + camera.get_mode() + } else { + CameraMode::default() + }; + let stats = stats.map(|s| &s.equipment); + let character_state = if is_player { character_state } else { None }; - let is_player = entity == client.entity(); - - let player_camera_mode = if is_player { - camera.get_mode() - } else { - CameraMode::default() - }; - - let model = &self - .model_cache - .get_or_create_model( - renderer, - *body, - stats.map(|s| &s.equipment), - tick, - player_camera_mode, - if is_player { character_state } else { None }, + let FigureMgr { + model_cache, + critter_model_cache, + quadruped_small_model_cache, + quadruped_medium_model_cache, + bird_medium_model_cache, + bird_small_model_cache, + dragon_model_cache, + fish_medium_model_cache, + fish_small_model_cache, + biped_large_model_cache, + character_states, + quadruped_small_states, + quadruped_medium_states, + bird_medium_states, + fish_medium_states, + critter_states, + dragon_states, + bird_small_states, + fish_small_states, + biped_large_states, + object_states, + } = self; + if let Some((locals, bone_consts, model)) = match body { + Body::Humanoid(_) => character_states + .get(&entity) + .filter(|state| state.visible) + .map(|state| { + ( + state.locals(), + state.bone_consts(), + &model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::QuadrupedSmall(_) => quadruped_small_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &quadruped_small_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, ) - .0; - + }), + Body::QuadrupedMedium(_) => quadruped_medium_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &quadruped_medium_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::BirdMedium(_) => bird_medium_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &bird_medium_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::FishMedium(_) => fish_medium_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &fish_medium_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::Critter(_) => critter_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &critter_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::Dragon(_) => dragon_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &dragon_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::BirdSmall(_) => bird_small_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &bird_small_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::FishSmall(_) => fish_small_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &fish_small_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::BipedLarge(_) => biped_large_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &biped_large_model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + Body::Object(_) => object_states.get(&entity).map(|state| { + ( + state.locals(), + state.bone_consts(), + &model_cache + .get_or_create_model( + renderer, + *body, + stats, + tick, + player_camera_mode, + character_state, + ) + .0, + ) + }), + } { renderer.render_figure(model, globals, locals, bone_consts, lights, shadows); } else { trace!("Body has no saved figure"); @@ -1101,6 +1461,7 @@ impl FigureMgr { + self.quadruped_medium_states.len() + self.bird_medium_states.len() + self.fish_medium_states.len() + + self.critter_states.len() + self.dragon_states.len() + self.bird_small_states.len() + self.fish_small_states.len() @@ -1129,11 +1490,16 @@ impl FigureMgr { .filter(|(_, c)| c.visible) .count() + self - .fish_medium_states + .critter_states .iter() .filter(|(_, c)| c.visible) .count() + self.dragon_states.iter().filter(|(_, c)| c.visible).count() + + self + .fish_medium_states + .iter() + .filter(|(_, c)| c.visible) + .count() + self .bird_small_states .iter() diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index e571e175c7..231c5516f8 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -8,7 +8,7 @@ use self::{ terrain::Terrain, }; use crate::{ - anim::SkeletonAttr, + anim::character::SkeletonAttr, audio::{sfx::SfxMgr, AudioFrontend}, render::{ create_pp_mesh, create_skybox_mesh, Consts, Globals, Light, Model, PostProcessLocals, diff --git a/world/src/block/mod.rs b/world/src/block/mod.rs index dfdf535277..27db5f686f 100644 --- a/world/src/block/mod.rs +++ b/world/src/block/mod.rs @@ -599,11 +599,20 @@ pub fn block_from_structure( Lerp::lerp(Rgb::new(0.0, 60.0, 50.0), Rgb::new(30.0, 100.0, 10.0), lerp) .map(|e| e as u8), )), - StructureBlock::PalmLeaves => Some(Block::new( + StructureBlock::PalmLeavesInner => Some(Block::new( BlockKind::Leaves, Lerp::lerp( - Rgb::new(0.0, 108.0, 113.0), - Rgb::new(30.0, 156.0, 10.0), + Rgb::new(61.0, 166.0, 43.0), + Rgb::new(29.0, 130.0, 32.0), + lerp, + ) + .map(|e| e as u8), + )), + StructureBlock::PalmLeavesOuter => Some(Block::new( + BlockKind::Leaves, + Lerp::lerp( + Rgb::new(62.0, 171.0, 38.0), + Rgb::new(45.0, 171.0, 65.0), lerp, ) .map(|e| e as u8),