// // TiledPolygonSprite.hpp // building // // Created by yanqian on 2023/4/17. // #ifndef TiledPolygonSprite_hpp #define TiledPolygonSprite_hpp #include "cocos2d.h" #include "proto_triangle.pb.h" #include "google/protobuf/repeated_field.h" #include #include "2d/CustomMaterial.hpp" NS_CC_BEGIN /// 顶点数据结构 struct TriangleVertexInfo { /// vertices (2F) Vec2 vertices; /// tex coords (2F) Tex2F texCoords; }; using namespace PrototTriangle; class TiledPolygonSprite : public Sprite { public: /** * 创建一个多边形平铺精灵 */ static TiledPolygonSprite* create(); const std::string& getPbvertsFile() const { return _vertsFullPath; } /** * 设置顶点数据 * @param pbvertsFilePath 顶点数据文件的相对路径/绝对路径 */ void setPbvertsFile(const std::string& pbvertsFilePath); /** * 通过plist设置纹理 * @param spriteFrameName 平铺的纹理名称 */ virtual void setSpriteFrame(const std::string &spriteFrameName) override; /** * 通过单图设置纹理 * @param textureFrame 平铺的纹理 */ virtual void setSpriteFrame(SpriteFrame* textureFrame) override; /** * 获取纹理的大小 */ Size getSpSize() { return _spSize; } /** * 重写绘制方法,绘制多边形及纹理 * @param renderer 渲染器 * @param transform 变换矩阵 * @param flags 渲染器标志 */ virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override; /** * 析构函数 */ ~TiledPolygonSprite(); protected: /** * 初始化绘制所需的参数 */ void _initParamForRender(); /** * 初始化着色器、VAO、VBO */ void _setupVBOAndVAO(); /** * 初始化三角形的顶点和uv数据 */ void _initTriangleInfo(); /** * 计算最小包围盒 * @param vertices 三角形的顶点列表 * @return 左下角和右上角的坐标 */ std::pair _calBoundingBox(const google::protobuf::RepeatedPtrField& vertices); /** * 渲染器回调 * @param transform 变换矩阵 * @param flags 渲染器标志 */ void onDraw(const Mat4 &transform, uint32_t flags); /** * 清空顶点相关数据 */ void _clearVertexBuffer(); private: int _verticesNumber = 0; // 绘制的顶点个数 TriangleInfo _triangleInfo; // 顶点protobuf数据 TriangleVertexInfo *_vertices = nullptr; // 顶点数据 Texture2D *_texture = nullptr; // 纹理 Size _spSize; // 纹理尺寸 std::string _vertsFullPath; // 顶点文件的绝对路径 GLuint _vao; // 顶点数组对象 GLuint _vbo; // 顶点缓冲对象 CustomCommand _customCommand; static GLProgram* _tiledProgram; // 着色器程序 Vec2 _texRectOffset; // 图集中纹理的矩形偏移 Vec2 _texRectSize; // 图集中纹理的尺寸信息 }; NS_CC_END #endif /* defined(TiledPolygonSprite_hpp) */