diff --git a/voxygen/src/menu/char_selection/scene.rs b/voxygen/src/menu/char_selection/scene.rs index 87bbcdb02d..03d9a761cf 100644 --- a/voxygen/src/menu/char_selection/scene.rs +++ b/voxygen/src/menu/char_selection/scene.rs @@ -164,6 +164,8 @@ impl Scene { Body::Humanoid(body), Some(equipment), client.get_tick(), + false, + false, ) .0; diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index b3d0cf24f4..f5153b1bf3 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -12,7 +12,7 @@ use hashbrown::HashMap; #[derive(PartialEq, Eq, Hash, Clone)] enum FigureKey { Simple(Body), - Complex(Body, Option), + Complex(Body, Option, bool, bool), } pub struct FigureModelCache { @@ -34,9 +34,11 @@ impl FigureModelCache { body: Body, equipment: Option<&Equipment>, tick: u64, + first_person: bool, + gliding: bool, ) -> &(Model, SkeletonAttr) { let key = if equipment.is_some() { - FigureKey::Complex(body, equipment.cloned()) + FigureKey::Complex(body, equipment.cloned(), first_person, gliding) } else { FigureKey::Simple(body) }; @@ -54,6 +56,9 @@ impl FigureModelCache { HumHeadSpec::load_watched(&mut self.manifest_indicator); let bone_meshes = match body { Body::Humanoid(body) => [ + +if !first_person { + Some(humanoid_head_spec.mesh_head( body.race, body.body_type, @@ -64,7 +69,13 @@ impl FigureModelCache { body.skin, body.eyebrows, body.accessory, - )), + )) + + } else { +None + } + + , Some(mesh_chest(body.chest)), Some(mesh_belt(body.belt)), Some(mesh_pants(body.pants)), diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index d8b11c4b39..c759b0fcee 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -116,7 +116,7 @@ impl FigureMgr { let skeleton_attr = &self .model_cache - .get_or_create_model(renderer, *body, stats.map(|s| &s.equipment), tick) + .get_or_create_model(renderer, *body, stats.map(|s| &s.equipment), tick, false, false) .1; match body { @@ -381,22 +381,27 @@ impl FigureMgr { .get(&entity) .map(|state| (state.locals(), state.bone_consts())), } { - let model = &self - .model_cache - .get_or_create_model(renderer, *body, stats.map(|s| &s.equipment), tick) - .0; - // Don't render the player's body while in first person mode - if camera.get_mode() == CameraMode::FirstPerson + let fp = + camera.get_mode() == CameraMode::FirstPerson && client .state() .read_storage::() .get(client.entity()) .is_some() - && entity == client.entity() - { - continue; - } + && entity == client.entity(); + + let gliding = client + .state() + .read_storage::() + .get(client.entity()) + .unwrap_or(&common::comp::CharacterState::default()) + .movement == common::comp::MovementState::Glide; + + let model = &self + .model_cache + .get_or_create_model(renderer, *body, stats.map(|s| &s.equipment), tick, fp, gliding) + .0; renderer.render_figure(model, globals, locals, bone_consts, lights); } else {