quiver_renderer.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "quiver_renderer.h"
  2. #include "../../entity/registry.h"
  3. #include "../../geom/math_utils.h"
  4. #include "../../geom/transforms.h"
  5. #include "../../gl/primitives.h"
  6. #include "../../gl/render_constants.h"
  7. #include "../../humanoid/humanoid_math.h"
  8. #include "../../humanoid/humanoid_specs.h"
  9. #include "../../humanoid/rig.h"
  10. #include "../../submitter.h"
  11. #include <QMatrix4x4>
  12. #include <QVector3D>
  13. namespace Render::GL {
  14. using Render::Geom::cone_from_to;
  15. using Render::Geom::cylinder_between;
  16. using Render::GL::HashXorShift::k_golden_ratio;
  17. QuiverRenderer::QuiverRenderer(QuiverRenderConfig config)
  18. : m_config(std::move(config)) {}
  19. void QuiverRenderer::render(const DrawContext &ctx, const BodyFrames &frames,
  20. const HumanoidPalette &palette,
  21. const HumanoidAnimationContext &,
  22. ISubmitter &submitter) {
  23. QVector3D const hip_r =
  24. frames.waist.origin + frames.waist.right * frames.waist.radius * 0.9F;
  25. QVector3D const quiver_pos =
  26. hip_r + frames.waist.right * 0.15F - frames.waist.up * 0.10F;
  27. QVector3D const q_top =
  28. quiver_pos + frames.waist.up * 0.15F - frames.waist.forward * 0.10F;
  29. QVector3D const q_base =
  30. quiver_pos - frames.waist.up * 0.25F + frames.waist.forward * 0.05F;
  31. submitter.mesh(
  32. get_unit_cylinder(),
  33. cylinder_between(ctx.model, q_base, q_top, m_config.quiver_radius),
  34. palette.leather, nullptr, 1.0F, m_config.material_id);
  35. uint32_t seed = 0U;
  36. if (ctx.entity != nullptr) {
  37. seed = uint32_t(reinterpret_cast<uintptr_t>(ctx.entity) & 0xFFFFFFFFU);
  38. }
  39. float const j = (hash_01(seed) - 0.5F) * 0.04F;
  40. float const k = (hash_01(seed ^ k_golden_ratio) - 0.5F) * 0.04F;
  41. QVector3D const a1 = q_top + QVector3D(0.00F + j, 0.08F, 0.00F + k);
  42. submitter.mesh(get_unit_cylinder(),
  43. cylinder_between(ctx.model, q_top, a1, 0.010F), palette.wood,
  44. nullptr, 1.0F, m_config.material_id);
  45. submitter.mesh(
  46. get_unit_cone(),
  47. cone_from_to(ctx.model, a1, a1 + QVector3D(0, 0.05F, 0), 0.025F),
  48. m_config.fletching_color, nullptr, 1.0F, m_config.material_id);
  49. if (m_config.num_arrows >= 2) {
  50. QVector3D const a2 = q_top + QVector3D(0.02F - j, 0.07F, 0.02F - k);
  51. submitter.mesh(get_unit_cylinder(),
  52. cylinder_between(ctx.model, q_top, a2, 0.010F), palette.wood,
  53. nullptr, 1.0F, m_config.material_id);
  54. submitter.mesh(
  55. get_unit_cone(),
  56. cone_from_to(ctx.model, a2, a2 + QVector3D(0, 0.05F, 0), 0.025F),
  57. m_config.fletching_color, nullptr, 1.0F, m_config.material_id);
  58. }
  59. }
  60. } // namespace Render::GL