pose_controller.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. #include "humanoid_specs.h"
  3. #include "rig.h"
  4. #include <QVector3D>
  5. #include <cstdint>
  6. namespace Render::GL {
  7. enum class AmbientIdleType : std::uint8_t {
  8. None = 0,
  9. SitDown,
  10. ShuffleFeet,
  11. TapFoot,
  12. ShiftWeight,
  13. StepInPlace,
  14. BendKnee,
  15. RaiseWeapon,
  16. Jump
  17. };
  18. class HumanoidPoseController {
  19. public:
  20. HumanoidPoseController(HumanoidPose &pose,
  21. const HumanoidAnimationContext &anim_ctx);
  22. void stand_idle();
  23. void apply_micro_idle(float time, std::uint32_t seed);
  24. void apply_ambient_idle(float time, std::uint32_t seed, float idle_duration);
  25. void apply_ambient_idle_explicit(AmbientIdleType idle_type, float phase);
  26. static auto get_ambient_idle_type(float time, std::uint32_t seed,
  27. float idle_duration) -> AmbientIdleType;
  28. void kneel(float depth);
  29. void kneel_transition(float progress, bool standing_up);
  30. void lean(const QVector3D &direction, float amount);
  31. void place_hand_at(bool is_left, const QVector3D &target_position);
  32. void aim_bow(float draw_phase);
  33. void melee_strike(float strike_phase);
  34. void grasp_two_handed(const QVector3D &grip_center, float hand_separation);
  35. void spear_thrust(float attack_phase);
  36. void spear_thrust_from_hold(float attack_phase, float hold_depth);
  37. void sword_slash(float attack_phase);
  38. void sword_slash_variant(float attack_phase, std::uint8_t variant);
  39. void spear_thrust_variant(float attack_phase, std::uint8_t variant);
  40. void mount_on_horse(float saddle_height);
  41. void hold_sword_and_shield();
  42. void look_at(const QVector3D &target);
  43. void hit_flinch(float intensity);
  44. void tilt_torso(float side_tilt, float forward_tilt);
  45. auto solve_elbow_ik(bool is_left, const QVector3D &shoulder,
  46. const QVector3D &hand, const QVector3D &outward_dir,
  47. float along_frac, float lateral_offset, float y_bias,
  48. float outward_sign) const -> QVector3D;
  49. auto solve_knee_ik(bool is_left, const QVector3D &hip, const QVector3D &foot,
  50. float height_scale) const -> QVector3D;
  51. auto get_shoulder_y(bool is_left) const -> float;
  52. auto get_pelvis_y() const -> float;
  53. private:
  54. HumanoidPose &m_pose;
  55. const HumanoidAnimationContext &m_anim_ctx;
  56. auto get_shoulder(bool is_left) const -> const QVector3D &;
  57. auto get_hand(bool is_left) -> QVector3D &;
  58. auto get_hand(bool is_left) const -> const QVector3D &;
  59. auto get_elbow(bool is_left) -> QVector3D &;
  60. auto compute_right_axis() const -> QVector3D;
  61. auto compute_outward_dir(bool is_left) const -> QVector3D;
  62. };
  63. } // namespace Render::GL