pose_palette_cache.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "pose_palette_cache.h"
  2. #include "humanoid/rig.h"
  3. #include "template_cache.h"
  4. namespace Render::GL {
  5. void PosePaletteCache::generate() {
  6. std::lock_guard<std::mutex> lock(m_mutex);
  7. m_palette.clear();
  8. VariationParams default_variation{};
  9. default_variation.height_scale = 1.0F;
  10. default_variation.bulk_scale = 1.0F;
  11. default_variation.stance_width = 1.0F;
  12. default_variation.arm_swing_amp = 1.0F;
  13. default_variation.walk_speed_mult = 1.0F;
  14. default_variation.posture_slump = 0.0F;
  15. default_variation.shoulder_tilt = 0.0F;
  16. constexpr std::uint32_t k_base_seed = 0;
  17. constexpr float k_cycle = 1.0F;
  18. constexpr AnimState k_states[] = {AnimState::Idle, AnimState::Move,
  19. AnimState::Run, AnimState::Construct,
  20. AnimState::Heal, AnimState::Hit};
  21. for (AnimState state : k_states) {
  22. bool is_moving = (state == AnimState::Move || state == AnimState::Run);
  23. for (std::uint8_t frame = 0; frame < k_anim_frame_count; ++frame) {
  24. float phase = (k_anim_frame_count > 1)
  25. ? static_cast<float>(frame) /
  26. static_cast<float>(k_anim_frame_count - 1)
  27. : 0.0F;
  28. float time = phase * k_cycle;
  29. HumanoidPose pose;
  30. HumanoidRendererBase::compute_locomotion_pose(
  31. k_base_seed, time, is_moving, default_variation, pose);
  32. PosePaletteKey key;
  33. key.state = state;
  34. key.frame = frame;
  35. key.is_moving = is_moving;
  36. PosePaletteEntry entry;
  37. entry.pose = pose;
  38. entry.time = time;
  39. m_palette[key] = entry;
  40. }
  41. }
  42. constexpr AnimState k_combat_states[] = {AnimState::AttackMelee,
  43. AnimState::AttackRanged};
  44. for (AnimState state : k_combat_states) {
  45. for (std::uint8_t frame = 0; frame < k_anim_frame_count; ++frame) {
  46. float phase = (k_anim_frame_count > 1)
  47. ? static_cast<float>(frame) /
  48. static_cast<float>(k_anim_frame_count - 1)
  49. : 0.0F;
  50. float time = phase * k_cycle;
  51. HumanoidPose pose;
  52. HumanoidRendererBase::compute_locomotion_pose(k_base_seed, time, false,
  53. default_variation, pose);
  54. PosePaletteKey key;
  55. key.state = state;
  56. key.frame = frame;
  57. key.is_moving = false;
  58. PosePaletteEntry entry;
  59. entry.pose = pose;
  60. entry.time = time;
  61. m_palette[key] = entry;
  62. }
  63. }
  64. m_generated = true;
  65. }
  66. auto PosePaletteCache::get(const PosePaletteKey &key) const
  67. -> const PosePaletteEntry * {
  68. std::lock_guard<std::mutex> lock(m_mutex);
  69. auto it = m_palette.find(key);
  70. if (it == m_palette.end()) {
  71. return nullptr;
  72. }
  73. return &it->second;
  74. }
  75. void PosePaletteCache::clear() {
  76. std::lock_guard<std::mutex> lock(m_mutex);
  77. m_palette.clear();
  78. m_generated = false;
  79. }
  80. auto PosePaletteCache::size() const -> std::size_t {
  81. std::lock_guard<std::mutex> lock(m_mutex);
  82. return m_palette.size();
  83. }
  84. } // namespace Render::GL