diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs
index ddeb9f3fba..135521148f 100644
--- a/voxygen/src/scene/figure/cache.rs
+++ b/voxygen/src/scene/figure/cache.rs
@@ -81,6 +81,19 @@ impl FigureModelCache {
{
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 {
@@ -100,27 +113,39 @@ impl FigureModelCache {
CameraMode::FirstPerson => None,
},
match camera_mode {
- CameraMode::ThirdPerson => Some(mesh_chest(
- body.chest,
- body.race,
- body.skin,
- body.hair_color,
- body.eye_color,
- )),
+ CameraMode::ThirdPerson => Some(
+ humanoid_armor_chest_spec.mesh_chest(
+ body.chest,
+ body.race,
+ body.body_type,
+ body.skin,
+ body.hair_color,
+ body.eye_color,
+ )
+ ),
CameraMode::FirstPerson => None,
},
match camera_mode {
- CameraMode::ThirdPerson => Some(mesh_belt(body.belt)),
+ CameraMode::ThirdPerson => Some(
+ humanoid_armor_belt_spec.mesh_belt(
+ body.belt,
+ body.race,
+ body.body_type,
+ )
+ ),
CameraMode::FirstPerson => None,
},
match camera_mode {
- CameraMode::ThirdPerson => Some(mesh_pants(
- body.pants,
- body.race,
- body.skin,
- body.hair_color,
- body.eye_color,
- )),
+ CameraMode::ThirdPerson => Some(
+ humanoid_armor_pants_spec.mesh_pants(
+ body.pants,
+ body.race,
+ body.body_type,
+ body.skin,
+ body.hair_color,
+ body.eye_color,
+ )
+ ),
CameraMode::FirstPerson => None,
},
if camera_mode == CameraMode::FirstPerson
@@ -130,9 +155,10 @@ impl FigureModelCache {
{
None
} else {
- Some(mesh_left_hand(
+ Some(humanoid_armor_hand_spec.mesh_left_hand(
body.hand,
body.race,
+ body.body_type,
body.skin,
body.hair_color,
body.eye_color,
@@ -144,32 +170,39 @@ impl FigureModelCache {
{
None
} else {
- Some(mesh_right_hand(
+ Some(humanoid_armor_hand_spec.mesh_right_hand(
body.hand,
body.race,
+ body.body_type,
body.skin,
body.hair_color,
body.eye_color,
))
},
match camera_mode {
- CameraMode::ThirdPerson => Some(mesh_left_foot(
- body.foot,
- body.race,
- body.skin,
- body.hair_color,
- body.eye_color,
- )),
+ CameraMode::ThirdPerson => Some(
+ humanoid_armor_foot_spec.mesh_left_foot(
+ body.foot,
+ body.race,
+ body.body_type,
+ body.skin,
+ body.hair_color,
+ body.eye_color,
+ )
+ ),
CameraMode::FirstPerson => None,
},
match camera_mode {
- CameraMode::ThirdPerson => Some(mesh_right_foot(
- body.foot,
- body.race,
- body.skin,
- body.hair_color,
- body.eye_color,
- )),
+ CameraMode::ThirdPerson => Some(
+ humanoid_armor_foot_spec.mesh_right_foot(
+ body.foot,
+ body.race,
+ body.body_type,
+ body.skin,
+ body.hair_color,
+ body.eye_color,
+ )
+ ),
CameraMode::FirstPerson => None,
},
if camera_mode != CameraMode::FirstPerson
@@ -186,23 +219,29 @@ impl FigureModelCache {
None
},
match camera_mode {
- CameraMode::ThirdPerson => Some(mesh_left_shoulder(
- body.shoulder,
- body.race,
- body.skin,
- body.hair_color,
- body.eye_color,
- )),
+ CameraMode::ThirdPerson => Some(
+ humanoid_armor_shoulder_spec.mesh_left_shoulder(
+ body.shoulder,
+ body.race,
+ body.body_type,
+ body.skin,
+ body.hair_color,
+ body.eye_color,
+ )
+ ),
CameraMode::FirstPerson => None,
},
match camera_mode {
- CameraMode::ThirdPerson => Some(mesh_right_shoulder(
- body.shoulder,
- body.race,
- body.skin,
- body.hair_color,
- body.eye_color,
- )),
+ CameraMode::ThirdPerson => Some(
+ humanoid_armor_shoulder_spec.mesh_right_shoulder(
+ body.shoulder,
+ body.race,
+ body.body_type,
+ body.skin,
+ body.hair_color,
+ body.eye_color,
+ )
+ ),
CameraMode::FirstPerson => None,
},
Some(mesh_draw()),
diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs
index 94ae64f548..0a0a585f56 100644
--- a/voxygen/src/scene/figure/load.rs
+++ b/voxygen/src/scene/figure/load.rs
@@ -192,160 +192,342 @@ impl HumHeadSpec {
)
}
}
+// All reliant on humanoid::Race and humanoid::BodyType
+// Armor spects should be in the same order, top to bottom.
+// These seem overly split up, but wanted to keep the armor seperated
+// unlike head which is done above. This can also make adding further
+// customization easier, such as allowing a 'chest_emblem' to be added.
+#[derive(Serialize, Deserialize)]
+struct HumArmorShoulderSubSpec {
+ offset: [f32; 3],
+ shoulder: Vec