43 #ifndef __CU_SPRITE_BATCH_H__ 
   44 #define __CU_SPRITE_BATCH_H__ 
   47 #include <cugl/math/CUMathBase.h> 
   48 #include <cugl/math/CUMat4.h> 
   49 #include <cugl/renderer/CUVertex.h> 
   52 #define DEFAULT_CAPACITY 8192 
   82     std::shared_ptr<SpriteShader> _shader;
 
   84     unsigned int _capacity;
 
   99     unsigned int _vertMax;
 
  101     unsigned int _vertSize;
 
  104     unsigned int _indxMax;
 
  106     unsigned int _indxSize;
 
  109     std::shared_ptr<Texture> _texture;
 
  118     GLenum _blendEquation;
 
  125     unsigned int _vertTotal;
 
  127     unsigned int _callTotal;
 
  135     static std::shared_ptr<Texture> _blank;
 
  139 #pragma mark Constructors 
  188     bool init(std::shared_ptr<SpriteShader> shader) {
 
  189         return init(DEFAULT_CAPACITY,shader);
 
  209     bool init(
unsigned int capacity);
 
  228     bool init(
unsigned int capacity, std::shared_ptr<SpriteShader> shader);
 
  231 #pragma mark Static Constructors 
  245     static std::shared_ptr<SpriteBatch> 
alloc() {
 
  246         std::shared_ptr<SpriteBatch> result = std::make_shared<SpriteBatch>();
 
  247         return (result->init() ? result : 
nullptr);
 
  267     static std::shared_ptr<SpriteBatch> 
alloc(
unsigned int capacity) {
 
  268         std::shared_ptr<SpriteBatch> result = std::make_shared<SpriteBatch>();
 
  269         return (result->init(capacity) ? result : 
nullptr);
 
  273 #pragma mark Attributes 
  316     void setShader(
const std::shared_ptr<SpriteShader>& shader);
 
  325     const std::shared_ptr<SpriteShader>& 
getShader()
 const { 
return _shader; }
 
  362     void setTexture(
const std::shared_ptr<Texture>& texture);
 
  373     const std::shared_ptr<Texture>& 
getTexture()
 const { 
return _texture; }
 
  477 #pragma mark Rendering 
  520 #pragma mark Solid Shapes 
  555     void fill(
const Rect& rect, 
const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset);
 
  680     void fill(
const Poly2& poly, 
const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset);
 
  764     void fill(
const std::vector<Vertex2>& vertices, 
const std::vector<unsigned short>& indices,
 
  765               const Mat4& transform, 
bool tint = 
true) {
 
  766         fill(vertices.data(),(
unsigned int)vertices.size(),0,indices.data(),(
unsigned int)indices.size(),0,transform,tint);
 
  789     void fill(
const std::vector<Vertex2>& vertices, 
const std::vector<unsigned short>& indices,
 
  790               const Affine2& transform, 
bool tint = 
true) {
 
  791         fill(vertices.data(),(
unsigned int)vertices.size(),0,indices.data(),(
unsigned int)indices.size(),0,transform,tint);
 
  818     void fill(
const Vertex2* vertices, 
unsigned int vsize, 
unsigned int voffset,
 
  819               const unsigned short* indices, 
unsigned int isize, 
unsigned int ioffset,
 
  820               const Mat4& transform, 
bool tint = 
true);
 
  846     void fill(
const Vertex2* vertices, 
unsigned int vsize, 
unsigned int voffset,
 
  847               const unsigned short* indices, 
unsigned int isize, 
unsigned int ioffset,
 
  848               const Affine2& transform, 
bool tint = 
true);
 
  851 #pragma mark Outlines 
 1099     void outline(
const std::vector<Vertex2>& vertices, 
const std::vector<unsigned short>& indices,
 
 1100                  const Mat4& transform, 
bool tint = 
true) {
 
 1101         outline(vertices.data(),(
unsigned int)vertices.size(),0,indices.data(),(
unsigned int)indices.size(),0,transform,tint);
 
 1124     void outline(
const std::vector<Vertex2>& vertices, 
const std::vector<unsigned short>& indices,
 
 1125                  const Affine2& transform, 
bool tint = 
true) {
 
 1126         outline(vertices.data(),(
unsigned int)vertices.size(),0,indices.data(),(
unsigned int)indices.size(),0,transform,tint);
 
 1153     void outline(
const Vertex2* vertices, 
unsigned int vsize, 
unsigned int voffset,
 
 1154                  const unsigned short* indices, 
unsigned int isize, 
unsigned int ioffset,
 
 1155                  const Mat4& transform, 
bool tint = 
true);
 
 1181     void outline(
const Vertex2* vertices, 
unsigned int vsize, 
unsigned int voffset,
 
 1182                  const unsigned short* indices, 
unsigned int isize, 
unsigned int ioffset,
 
 1183                  const Affine2& transform, 
bool tint = 
true);
 
 1186 #pragma mark Convenience Methods 
 1198     void draw(
const std::shared_ptr<Texture>& texture, 
const Vec2& position);
 
 1212     void draw(
const std::shared_ptr<Texture>& texture, 
Color4 color, 
const Vec2& position);
 
 1224     void draw(
const std::shared_ptr<Texture>& texture, 
const Rect& bounds) {
 
 1240     void draw(
const std::shared_ptr<Texture>& texture, 
Color4 color, 
const Rect& bounds) {
 
 1265     void draw(
const std::shared_ptr<Texture>& texture,
 
 1266               const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset);
 
 1289     void draw(
const std::shared_ptr<Texture>& texture, 
Color4 color,
 
 1290               const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset);
 
 1313     void draw(
const std::shared_ptr<Texture>& texture, 
const Rect& bounds,
 
 1314               const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset) {
 
 1316         fill(bounds, origin, scale, angle, offset);
 
 1342               const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset) {
 
 1344         fill(bounds, origin, scale, angle, offset);
 
 1363     void draw(
const std::shared_ptr<Texture>& texture, 
const Vec2& origin, 
const Mat4& transform);
 
 1382     void draw(
const std::shared_ptr<Texture>& texture, 
Color4 color, 
const Vec2& origin, 
const Mat4& transform);
 
 1401     void draw(
const std::shared_ptr<Texture>& texture, 
const Rect& bounds,
 
 1402               const Vec2& origin, 
const Mat4& transform) {
 
 1404         fill(bounds, origin, transform);
 
 1426               const Vec2& origin, 
const Mat4& transform) {
 
 1428         fill(bounds, origin, transform);
 
 1447     void draw(
const std::shared_ptr<Texture>& texture, 
const Vec2& origin, 
const Affine2& transform);
 
 1466     void draw(
const std::shared_ptr<Texture>& texture, 
Color4 color,
 
 1486     void draw(
const std::shared_ptr<Texture>& texture, 
const Rect& bounds,
 
 1489         fill(bounds, origin, transform);
 
 1513         fill(bounds, origin, transform);
 
 1544     void draw(
const std::shared_ptr<Texture>& texture, 
const Poly2& poly, 
const Vec2& offset) {
 
 1620     void draw(
const std::shared_ptr<Texture>& texture, 
const Poly2& poly,
 
 1621               const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset) {
 
 1623         fill(poly, origin, scale, angle, offset);
 
 1665               const Vec2& origin, 
const Vec2& scale, 
float angle, 
const Vec2& offset) {
 
 1667         fill(poly, origin, scale, angle, offset);
 
 1703     void draw(
const std::shared_ptr<Texture>& texture, 
const Poly2& poly,
 
 1704               const Vec2& origin, 
const Mat4& transform) {
 
 1706         fill(poly, origin, transform);
 
 1744               const Vec2& origin, 
const Mat4& transform) {
 
 1746         fill(poly, origin, transform);
 
 1782     void draw(
const std::shared_ptr<Texture>& texture, 
const Poly2& poly,
 
 1785         fill(poly, origin, transform);
 
 1825         fill(poly, origin, transform);
 
 1829 #pragma mark Internal Helpers 
 1839     void setCommand(GLenum command);
 
 1849     GLenum getCommand()
 const { 
return _command; }
 
 1861     bool validateBuffer(GLuint buffer, 
const char* message);
 
 1874     unsigned int prepare(
const Rect& rect,  
bool solid);
 
 1887     unsigned int prepare(
const Poly2& poly, 
bool solid);
 
 1906     unsigned int prepare(
const Vertex2* vertices, 
unsigned int vsize, 
unsigned int voffset,
 
 1907                          const unsigned short* indices, 
unsigned int isize, 
unsigned int ioffset,
 
 1908                          bool solid, 
bool tint = 
true);
 
void setBlendFunc(GLenum srcFactor, GLenum dstFactor)
 
void setColor(Color4 color)
Definition: CUSpriteBatch.h:337
 
Definition: CUSpriteBatch.h:78
 
Definition: CUPoly2.h:115
 
void fill(const std::vector< Vertex2 > &vertices, const std::vector< unsigned short > &indices, const Mat4 &transform, bool tint=true)
Definition: CUSpriteBatch.h:764
 
GLenum getSourceBlendFactor() const 
Definition: CUSpriteBatch.h:436
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Rect &bounds, const Vec2 &origin, const Mat4 &transform)
Definition: CUSpriteBatch.h:1425
 
Definition: CUAffine2.h:63
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Rect &bounds)
Definition: CUSpriteBatch.h:1240
 
unsigned int getVerticesDrawn() const 
Definition: CUSpriteBatch.h:298
 
bool init(std::shared_ptr< SpriteShader > shader)
Definition: CUSpriteBatch.h:188
 
static std::shared_ptr< SpriteBatch > alloc()
Definition: CUSpriteBatch.h:245
 
static std::shared_ptr< SpriteBatch > alloc(unsigned int capacity)
Definition: CUSpriteBatch.h:267
 
static const std::shared_ptr< Texture > & getBlankTexture()
 
void draw(const std::shared_ptr< Texture > &texture, const Rect &bounds, const Vec2 &origin, const Affine2 &transform)
Definition: CUSpriteBatch.h:1486
 
unsigned int getCallsMade() const 
Definition: CUSpriteBatch.h:307
 
void draw(const std::shared_ptr< Texture > &texture, const Poly2 &poly, const Vec2 &origin, const Mat4 &transform)
Definition: CUSpriteBatch.h:1703
 
static const Color4 WHITE
Definition: CUColor4.h:1106
 
void begin(const Mat4 &perspective)
Definition: CUSpriteBatch.h:498
 
bool isReady() const 
Definition: CUSpriteBatch.h:279
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Rect &bounds, const Vec2 &origin, const Affine2 &transform)
Definition: CUSpriteBatch.h:1510
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Rect &bounds, const Vec2 &origin, const Vec2 &scale, float angle, const Vec2 &offset)
Definition: CUSpriteBatch.h:1341
 
void fill(const Rect &rect)
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Poly2 &poly, const Vec2 &offset)
Definition: CUSpriteBatch.h:1578
 
void setShader(const std::shared_ptr< SpriteShader > &shader)
 
const std::shared_ptr< Texture > & getTexture() const 
Definition: CUSpriteBatch.h:373
 
Definition: CUVertex.h:46
 
Color4 getColor() const 
Definition: CUSpriteBatch.h:347
 
void fill(const std::vector< Vertex2 > &vertices, const std::vector< unsigned short > &indices, const Affine2 &transform, bool tint=true)
Definition: CUSpriteBatch.h:789
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Poly2 &poly, const Vec2 &origin, const Mat4 &transform)
Definition: CUSpriteBatch.h:1743
 
void draw(const std::shared_ptr< Texture > &texture, const Rect &bounds, const Vec2 &origin, const Vec2 &scale, float angle, const Vec2 &offset)
Definition: CUSpriteBatch.h:1313
 
void draw(const std::shared_ptr< Texture > &texture, const Rect &bounds, const Vec2 &origin, const Mat4 &transform)
Definition: CUSpriteBatch.h:1401
 
void setTexture(const std::shared_ptr< Texture > &texture)
 
const Mat4 & getPerspective() const 
Definition: CUSpriteBatch.h:406
 
void outline(const Rect &rect)
 
bool isDrawing() const 
Definition: CUSpriteBatch.h:289
 
void setBlendEquation(GLenum equation)
 
void outline(const std::vector< Vertex2 > &vertices, const std::vector< unsigned short > &indices, const Affine2 &transform, bool tint=true)
Definition: CUSpriteBatch.h:1124
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Poly2 &poly, const Vec2 &origin, const Vec2 &scale, float angle, const Vec2 &offset)
Definition: CUSpriteBatch.h:1664
 
~SpriteBatch()
Definition: CUSpriteBatch.h:151
 
void draw(const std::shared_ptr< Texture > &texture, const Rect &bounds)
Definition: CUSpriteBatch.h:1224
 
Definition: CUColor4.h:1084
 
void draw(const std::shared_ptr< Texture > &texture, Color4 color, const Poly2 &poly, const Vec2 &origin, const Affine2 &transform)
Definition: CUSpriteBatch.h:1822
 
void draw(const std::shared_ptr< Texture > &texture, const Poly2 &poly, const Vec2 &origin, const Vec2 &scale, float angle, const Vec2 &offset)
Definition: CUSpriteBatch.h:1620
 
GLenum getBlendEquation() const 
Definition: CUSpriteBatch.h:474
 
void outline(const std::vector< Vertex2 > &vertices, const std::vector< unsigned short > &indices, const Mat4 &transform, bool tint=true)
Definition: CUSpriteBatch.h:1099
 
Definition: CUAction.h:51
 
const std::shared_ptr< SpriteShader > & getShader() const 
Definition: CUSpriteBatch.h:325
 
void setPerspective(const Mat4 &perspective)
 
void draw(const std::shared_ptr< Texture > &texture, const Vec2 &position)
 
GLenum getDestinationBlendFactor() const 
Definition: CUSpriteBatch.h:447
 
void draw(const std::shared_ptr< Texture > &texture, const Poly2 &poly, const Vec2 &origin, const Affine2 &transform)
Definition: CUSpriteBatch.h:1782
 
void draw(const std::shared_ptr< Texture > &texture, const Poly2 &poly, const Vec2 &offset)
Definition: CUSpriteBatch.h:1544