CCGrid
#ifndef __EFFECTS_CCGRID_H__
#define __EFFECTS_CCGRID_H__
#include "cocoa/CCObject.h"
#include "base_nodes/CCNode.h"
#include "CCCamera.h"
#include "ccTypes.h"
#include "textures/CCTexture2D.h"
#include "CCDirector.h"
#include "kazmath/mat4.h"
#ifdef EMSCRIPTEN
#include "base_nodes/CCGLBufferedNode.h"
#endif // EMSCRIPTEN
NS_CC_BEGIN
class CCTexture2D;
class CCGrabber;
class CCGLProgram;
/**
* @addtogroup effects
* @{
*/
/** Base class for other
*/
class CC_DLL CCGridBase : public CCObject
{
public:
virtual ~CCGridBase(void);
/** whether or not the grid is active */
inline bool isActive(void) { return m_bActive; }
void setActive(bool bActive);
/** number of times that the grid will be reused */
inline int getReuseGrid(void) { return m_nReuseGrid; }
inline void setReuseGrid(int nReuseGrid) { m_nReuseGrid = nReuseGrid; }
/** size of the grid */
inline const CCSize& getGridSize(void) { return m_sGridSize; }
inline void setGridSize(const CCSize& gridSize) { m_sGridSize = gridSize; }
/** pixels between the grids */
inline const CCPoint& getStep(void) { return m_obStep; }
inline void setStep(const CCPoint& step) { m_obStep = step; }
/** is texture flipped */
inline bool isTextureFlipped(void) { return m_bIsTextureFlipped; }
void setTextureFlipped(bool bFlipped);
bool initWithSize(const CCSize& gridSize, CCTexture2D *pTexture, bool bFlipped);
bool initWithSize(const CCSize& gridSize);
void beforeDraw(void);
void afterDraw(CCNode *pTarget);
virtual void blit(void);
virtual void reuse(void);
virtual void calculateVertexPoints(void);
public:
/** create one Grid */
static CCGridBase* create(const CCSize& gridSize, CCTexture2D *texture, bool flipped);
/** create one Grid */
static CCGridBase* create(const CCSize& gridSize);
void set2DProjection(void);
protected:
bool m_bActive;
int m_nReuseGrid;
CCSize m_sGridSize;
CCTexture2D *m_pTexture;
CCPoint m_obStep;
CCGrabber *m_pGrabber;
bool m_bIsTextureFlipped;
CCGLProgram* m_pShaderProgram;
ccDirectorProjection m_directorProjection;
};
/**
CCGrid3D is a 3D grid implementation. Each vertex has 3 dimensions: x,y,z
*/
class CC_DLL CCGrid3D : public CCGridBase
#ifdef EMSCRIPTEN
, public CCGLBufferedNode
#endif // EMSCRIPTEN
{
public:
CCGrid3D();
~CCGrid3D(void);
/** returns the vertex at a given position */
ccVertex3F vertex(const CCPoint& pos);
/** returns the original (non-transformed) vertex at a given position */
ccVertex3F originalVertex(const CCPoint& pos);
/** sets a new vertex at a given position */
void setVertex(const CCPoint& pos, const ccVertex3F& vertex);
virtual void blit(void);
virtual void reuse(void);
virtual void calculateVertexPoints(void);
public:
/** create one Grid */
static CCGrid3D* create(const CCSize& gridSize, CCTexture2D *pTexture, bool bFlipped);
/** create one Grid */
static CCGrid3D* create(const CCSize& gridSize);
protected:
GLvoid *m_pTexCoordinates;
GLvoid *m_pVertices;
GLvoid *m_pOriginalVertices;
GLushort *m_pIndices;
};
/**
CCTiledGrid3D is a 3D grid implementation. It differs from Grid3D in that
the tiles can be separated from the grid.
*/
class CC_DLL CCTiledGrid3D : public CCGridBase
#ifdef EMSCRIPTEN
, public CCGLBufferedNode
#endif // EMSCRIPTEN
{
public:
CCTiledGrid3D();
~CCTiledGrid3D(void);
/** returns the tile at the given position */
ccQuad3 tile(const CCPoint& pos);
/** returns the original tile (untransformed) at the given position */
ccQuad3 originalTile(const CCPoint& pos);
/** sets a new tile */
void setTile(const CCPoint& pos, const ccQuad3& coords);
virtual void blit(void);
virtual void reuse(void);
virtual void calculateVertexPoints(void);
public:
/** create one Grid */
static CCTiledGrid3D* create(const CCSize& gridSize, CCTexture2D *pTexture, bool bFlipped);
/** create one Grid */
static CCTiledGrid3D* create(const CCSize& gridSize);
protected:
GLvoid *m_pTexCoordinates;
GLvoid *m_pVertices;
GLvoid *m_pOriginalVertices;
GLushort *m_pIndices;
};
// end of effects group
/// @}
NS_CC_END
#endif // __EFFECTS_CCGRID_H__