diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index 967a218910..b91498d9cf 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -6,14 +6,35 @@ use crate::{ }; use common::{ assets::watch::ReloadIndicator, - comp::{Body, CharacterState, Equipment}, + comp::{ActionState, Body, CharacterState, Equipment, MovementState}, }; use hashbrown::HashMap; +use std::mem::{discriminant, Discriminant}; #[derive(PartialEq, Eq, Hash, Clone)] enum FigureKey { Simple(Body), - Complex(Body, Option, CameraMode, Option), + Complex( + Body, + Option, + CameraMode, + Option, + ), +} + +#[derive(PartialEq, Eq, Hash, Clone)] +struct CharacterStateCacheKey { + movement: Discriminant, + action: Discriminant, +} + +impl From<&CharacterState> for CharacterStateCacheKey { + fn from(cs: &CharacterState) -> Self { + Self { + movement: discriminant(&cs.movement), + action: discriminant(&cs.action), + } + } } pub struct FigureModelCache { @@ -43,7 +64,7 @@ impl FigureModelCache { body, equipment.cloned(), camera_mode, - character_state.cloned(), + character_state.map(|cs| CharacterStateCacheKey::from(cs)), ) } else { FigureKey::Simple(body)