TextureAtlas的主要作用是保存了一张纹理以及一批Quad矩形顶点数据,然后一个gl draw call中,将这些顶点数据全部绘制,这些quad数据是可以动态改变的。这其实就是批量绘制(batch drawing)的基础。

一、数据结构

  1. class CC_DLL TextureAtlas : public Ref
  2. {
  3. protected:
  4. GLushort* _indices; // 顶点索引
  5. GLuint _VAOname; // VAO
  6. GLuint _buffersVBO[2]; //0: vertex 1: indices
  7. bool _dirty; // indicates whether or not the array buffer of the VBO needs to be updated
  8. ssize_t _totalQuads; // 矩形数量,一般就是一个quad一个sprite
  9. ssize_t _capacity; // 在不触发内存重新分配的情况下,最多能有几个quad
  10. Texture2D* _texture; // 使用到的纹理
  11. V3F_C4B_T2F_Quad* _quads; // 矩形顶点数据数组,一个或多个quad
  12. // 一个quad 4个顶点,构成两个三角形,每个顶点的数据如下:
  13. // 顶点坐标:V3F,3个float(x、y、z)
  14. // 颜色数据:C4B,4个byte(r、g、b、a)
  15. // 纹理坐标;T2F,2个float(u,v)
  16. #if CC_ENABLE_CACHE_TEXTURE_DATA
  17. EventListenerCustom* _rendererRecreatedListener;
  18. #endif
  19. };

二、创建

  1. class CC_DLL TextureAtlas : public Ref
  2. {
  3. public:
  4. // file: texutre的image file path
  5. // capacity: 预计最多会有几个quad,避免频繁的内存重分配
  6. static TextureAtlas* create(const std::string& file , ssize_t capacity);
  7. static TextureAtlas* createWithTexture(Texture2D *texture, ssize_t capacity);
  8. }

三、绘制

  1. class CC_DLL TextureAtlas : public Ref
  2. {
  3. // 绘制从0 ~ n-1的quad,n<=capacity
  4. void drawNumberOfQuads(ssize_t n);
  5. // 绘制从start ~ n + start-1的quad,n + start-1 <= capacity
  6. void drawNumberOfQuads(ssize_t n, ssize_t start);
  7. // 绘制所有quad
  8. void drawQuads();
  9. }

四、更新quad顶点数据

  1. class CC_DLL TextureAtlas : public Ref
  2. {
  3. public:
  4. // ********************************************************
  5. // ****************** 改
  6. // ********************************************************
  7. void setQuads(V3F_C4B_T2F_Quad* quads);
  8. void updateQuad(V3F_C4B_T2F_Quad* quad, ssize_t index);
  9. // Moves an amount of quads from oldIndex at newIndex.
  10. void moveQuadsFromIndex(ssize_t oldIndex, ssize_t amount, ssize_t newIndex);
  11. // Moves quads from index till totalQuads to the newIndex.Used internally by ParticleBatchNode.
  12. // This method doesn't enlarge the array if newIndex + quads to be moved > capacity.
  13. void moveQuadsFromIndex(ssize_t index, ssize_t newIndex);
  14. // fill an amout of empty quads at index. Used internally by ParticleBatchNode.
  15. void fillWithEmptyQuadsFromIndex(ssize_t index, ssize_t amount);
  16. // ********************************************************
  17. // ****************** 插
  18. // ********************************************************
  19. void insertQuad(V3F_C4B_T2F_Quad* quad, ssize_t index);
  20. // 在index开始,插入amount个quad,数据在quads中。
  21. void insertQuads(V3F_C4B_T2F_Quad* quads, ssize_t index, ssize_t amount);
  22. // 将fromIndex的quad插入到newIndex位置
  23. void insertQuadFromIndex(ssize_t fromIndex, ssize_t newIndex);
  24. // ********************************************************
  25. // ****************** 删
  26. // ********************************************************
  27. void removeQuadAtIndex(ssize_t index);
  28. void removeQuadsAtIndex(ssize_t index, ssize_t amount);
  29. // 数组的内的数据不会变动,仅仅是标记有用元素为0个。
  30. void removeAllQuads();
  31. }