TiledPolygonSprite.hpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //
  2. // TiledPolygonSprite.hpp
  3. // building
  4. //
  5. // Created by yanqian on 2023/4/17.
  6. //
  7. #ifndef TiledPolygonSprite_hpp
  8. #define TiledPolygonSprite_hpp
  9. #include "cocos2d.h"
  10. #include "proto_triangle.pb.h"
  11. #include "google/protobuf/repeated_field.h"
  12. #include <fstream>
  13. #include "2d/CustomMaterial.hpp"
  14. NS_CC_BEGIN
  15. /// 顶点数据结构
  16. struct TriangleVertexInfo {
  17. /// vertices (2F)
  18. Vec2 vertices;
  19. /// tex coords (2F)
  20. Tex2F texCoords;
  21. };
  22. using namespace PrototTriangle;
  23. class TiledPolygonSprite : public Sprite
  24. {
  25. public:
  26. /**
  27. * 创建一个多边形平铺精灵
  28. */
  29. static TiledPolygonSprite* create();
  30. const std::string& getPbvertsFile() const { return _vertsFullPath; }
  31. /**
  32. * 设置顶点数据
  33. * @param pbvertsFilePath 顶点数据文件的相对路径/绝对路径
  34. */
  35. void setPbvertsFile(const std::string& pbvertsFilePath);
  36. /**
  37. * 通过plist设置纹理
  38. * @param spriteFrameName 平铺的纹理名称
  39. */
  40. virtual void setSpriteFrame(const std::string &spriteFrameName) override;
  41. /**
  42. * 通过单图设置纹理
  43. * @param textureFrame 平铺的纹理
  44. */
  45. virtual void setSpriteFrame(SpriteFrame* textureFrame) override;
  46. /**
  47. * 获取纹理的大小
  48. */
  49. Size getSpSize() { return _spSize; }
  50. /**
  51. * 重写绘制方法,绘制多边形及纹理
  52. * @param renderer 渲染器
  53. * @param transform 变换矩阵
  54. * @param flags 渲染器标志
  55. */
  56. virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;
  57. /**
  58. * 析构函数
  59. */
  60. ~TiledPolygonSprite();
  61. protected:
  62. /**
  63. * 初始化绘制所需的参数
  64. */
  65. void _initParamForRender();
  66. /**
  67. * 初始化着色器、VAO、VBO
  68. */
  69. void _setupVBOAndVAO();
  70. /**
  71. * 初始化三角形的顶点和uv数据
  72. */
  73. void _initTriangleInfo();
  74. /**
  75. * 计算最小包围盒
  76. * @param vertices 三角形的顶点列表
  77. * @return 左下角和右上角的坐标
  78. */
  79. std::pair<Vec2, Vec2> _calBoundingBox(const google::protobuf::RepeatedPtrField<float>& vertices);
  80. /**
  81. * 渲染器回调
  82. * @param transform 变换矩阵
  83. * @param flags 渲染器标志
  84. */
  85. void onDraw(const Mat4 &transform, uint32_t flags);
  86. /**
  87. * 清空顶点相关数据
  88. */
  89. void _clearVertexBuffer();
  90. private:
  91. int _verticesNumber = 0; // 绘制的顶点个数
  92. TriangleInfo _triangleInfo; // 顶点protobuf数据
  93. TriangleVertexInfo *_vertices = nullptr; // 顶点数据
  94. Texture2D *_texture = nullptr; // 纹理
  95. Size _spSize; // 纹理尺寸
  96. std::string _vertsFullPath; // 顶点文件的绝对路径
  97. GLuint _vao; // 顶点数组对象
  98. GLuint _vbo; // 顶点缓冲对象
  99. CustomCommand _customCommand;
  100. static GLProgram* _tiledProgram; // 着色器程序
  101. Vec2 _texRectOffset; // 图集中纹理的矩形偏移
  102. Vec2 _texRectSize; // 图集中纹理的尺寸信息
  103. };
  104. NS_CC_END
  105. #endif /* defined(TiledPolygonSprite_hpp) */