SpriteBatch.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. // Работает в двух режимах - рендеринг фигур и рендеринг спрайтов.
  4. // Если после рисования спрайтов рисуется какая-либо фигура (или наоборот) автоматически вызывается Flush().
  5. #pragma once
  6. #include "SpriteBatchBase.h"
  7. #include "../UI/Font.h"
  8. namespace Urho3D
  9. {
  10. /// Режимы зеркального отображения спрайтов и текста
  11. enum class FlipModes : u32
  12. {
  13. None = 0,
  14. Horizontally = 1,
  15. Vertically = 2,
  16. Both = Horizontally | Vertically
  17. };
  18. URHO3D_FLAGS(FlipModes);
  19. /// @nobindtemp
  20. class URHO3D_API SpriteBatch : public SpriteBatchBase
  21. {
  22. URHO3D_OBJECT(SpriteBatch, SpriteBatchBase);
  23. // ============================ Рисование фигур с помощью функции AddTriangle() ============================
  24. public:
  25. void DrawTriangle(const Vector2& v0, const Vector2& v1, const Vector2& v2);
  26. void DrawLine(const Vector2& start, const Vector2&end, float width);
  27. void DrawLine(float startX, float startY, float endX, float endY, float width);
  28. void DrawAABBSolid(const Vector2& min, const Vector2& max);
  29. void DrawAABoxSolid(const Vector2& centerPos, const Vector2& halfSize);
  30. void DrawAABoxSolid(float centerX, float centerY, float halfWidth, float halfHeight);
  31. void DrawCircle(const Vector2& centerPos, float radius);
  32. void DrawCircle(float centerX, float centerY, float radius);
  33. // Граница рисуется по внутреннему периметру (не выходит за пределы AABox)
  34. void DrawAABoxBorder(float centerX, float centerY, float halfWidth, float halfHeight, float borderWidth);
  35. void DrawArrow(const Vector2& start, const Vector2& end, float width);
  36. // ========================== Рисование спрайтов и текста с помощью функции AddQuad() ==========================
  37. public:
  38. /// color - цвет в формате 0xAABBGGRR
  39. void DrawSprite(Texture2D* texture, const Rect& destination, const Rect* source = nullptr, u32 color = 0xFFFFFFFF,
  40. float rotation = 0.0f, const Vector2& origin = Vector2::ZERO, const Vector2& scale = Vector2::ONE, FlipModes flipModes = FlipModes::None);
  41. /// color - цвет в формате 0xAABBGGRR
  42. void DrawSprite(Texture2D* texture, const Vector2& position, const Rect* source = nullptr, u32 color = 0xFFFFFFFF,
  43. float rotation = 0.0f, const Vector2 &origin = Vector2::ZERO, const Vector2& scale = Vector2::ONE, FlipModes flipModes = FlipModes::None);
  44. /// color - цвет в формате 0xAABBGGRR
  45. void DrawString(const String& text, Font* font, float fontSize, const Vector2& position, u32 color = 0xFFFFFFFF,
  46. float rotation = 0.0f, const Vector2& origin = Vector2::ZERO, const Vector2& scale = Vector2::ONE, FlipModes flipModes = FlipModes::None);
  47. private:
  48. // Кэширование шейдеров. Инициализируются в конструкторе
  49. ShaderVariation* spriteVS_;
  50. ShaderVariation* spritePS_;
  51. ShaderVariation* ttfTextVS_;
  52. ShaderVariation* ttfTextPS_;
  53. ShaderVariation* spriteTextVS_;
  54. ShaderVariation* spriteTextPS_;
  55. ShaderVariation* sdfTextVS_;
  56. ShaderVariation* sdfTextPS_;
  57. ShaderVariation* shapeVS_;
  58. ShaderVariation* shapePS_;
  59. // Данные для функции DrawSpriteInternal()
  60. struct
  61. {
  62. Texture2D* texture_;
  63. ShaderVariation* vs_;
  64. ShaderVariation* ps_;
  65. Rect destination_;
  66. Rect sourceUV_; // Текстурные координаты в диапазоне [0, 1]
  67. FlipModes flipModes_;
  68. Vector2 scale_;
  69. float rotation_;
  70. Vector2 origin_;
  71. u32 color0_;
  72. u32 color1_;
  73. u32 color2_;
  74. u32 color3_;
  75. } sprite_;
  76. // Перед вызовом этой функции нужно заполнить структуру sprite_
  77. void DrawSpriteInternal();
  78. // ========================================= Остальное =========================================
  79. public:
  80. SpriteBatch(Context* context);
  81. };
  82. }