formation_arrow.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "formation_arrow.h"
  2. #include "../gl/resources.h"
  3. #include "../scene_renderer.h"
  4. #include <QMatrix4x4>
  5. #include <cmath>
  6. #include <numbers>
  7. #include <qvectornd.h>
  8. namespace Render::GL {
  9. void render_formation_arrow(Renderer *renderer, ResourceManager *resources,
  10. const FormationPlacementInfo &placement) {
  11. if ((renderer == nullptr) || (resources == nullptr) || !placement.active) {
  12. return;
  13. }
  14. float const visual_angle_degrees = placement.angle_degrees + 180.0F;
  15. QVector3D const arrow_main(0.1F, 0.7F, 0.9F);
  16. QVector3D const arrow_accent(0.0F, 0.9F, 1.0F);
  17. QVector3D const arrow_edge(0.05F, 0.4F, 0.6F);
  18. float const arrow_length = 1.5F;
  19. float const arrow_width = 0.15F;
  20. float const arrow_head_size = 0.6F;
  21. float const arrow_height = 0.125F;
  22. float const base_y = placement.position.y() + 0.12F;
  23. {
  24. QMatrix4x4 shaft_model;
  25. shaft_model.translate(placement.position.x(), base_y,
  26. placement.position.z());
  27. shaft_model.rotate(visual_angle_degrees, 0.0F, 1.0F, 0.0F);
  28. shaft_model.translate(0.0F, 0.0F, -arrow_length * 0.25F);
  29. shaft_model.scale(arrow_width * 0.3F, arrow_height * 0.8F,
  30. arrow_length * 0.5F);
  31. renderer->mesh(resources->unit(), shaft_model, arrow_main,
  32. resources->white(), 0.85F);
  33. }
  34. float const head_tip_z = -arrow_length * 0.55F;
  35. float const stick_len = arrow_head_size * 0.7F;
  36. float const stick_thickness = 0.05F;
  37. float const stick_height = arrow_height * 0.8F;
  38. float const head_angle_deg = 35.0F;
  39. {
  40. QMatrix4x4 head_left;
  41. head_left.translate(placement.position.x(), base_y, placement.position.z());
  42. head_left.rotate(visual_angle_degrees, 0.0F, 1.0F, 0.0F);
  43. head_left.translate(-arrow_head_size * 0.22F, 0.0F, head_tip_z);
  44. head_left.rotate(-head_angle_deg, 0.0F, 1.0F, 0.0F);
  45. head_left.translate(0.0F, 0.0F, stick_len * 0.5F);
  46. head_left.scale(stick_thickness, stick_height, stick_len);
  47. renderer->mesh(resources->unit(), head_left, arrow_accent,
  48. resources->white(), 0.95F);
  49. }
  50. {
  51. QMatrix4x4 head_right;
  52. head_right.translate(placement.position.x(), base_y,
  53. placement.position.z());
  54. head_right.rotate(visual_angle_degrees, 0.0F, 1.0F, 0.0F);
  55. head_right.translate(arrow_head_size * 0.22F, 0.0F, head_tip_z);
  56. head_right.rotate(head_angle_deg, 0.0F, 1.0F, 0.0F);
  57. head_right.translate(0.0F, 0.0F, stick_len * 0.5F);
  58. head_right.scale(stick_thickness, stick_height, stick_len);
  59. renderer->mesh(resources->unit(), head_right, arrow_accent,
  60. resources->white(), 0.95F);
  61. }
  62. {
  63. QMatrix4x4 edge_model;
  64. edge_model.translate(placement.position.x(), base_y + arrow_height * 0.3F,
  65. placement.position.z());
  66. edge_model.rotate(visual_angle_degrees, 0.0F, 1.0F, 0.0F);
  67. edge_model.translate(arrow_width * 0.1F, 0.0F, -arrow_length * 0.2F);
  68. edge_model.scale(0.05F, 0.04F, arrow_length * 0.45F);
  69. renderer->mesh(resources->unit(), edge_model, arrow_accent,
  70. resources->white(), 0.6F);
  71. }
  72. }
  73. } // namespace Render::GL