/****************************************************************************
****************************************************************************/
"FilterSprite.h"
FilterSprite::FilterSprite(
)
{
m_uSpriteFilter=Mat4::IDENTITY;
}
FilterSprite::~FilterSprite()
{
}
FilterSprite*FilterSprite::create()
{
FilterSprite*sprite=
new
(std::
nothrow
)FilterSprite();
if
(sprite&&sprite->init())
{
sprite->autorelease();
return
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
}
FilterSprite*FilterSprite::create(
std::string&filename)
{
)FilterSprite();
(sprite&&sprite->initWithFile(filename))
{
sprite->autorelease();
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
}
Rect&rect)
{
)FilterSprite();
(sprite&&sprite->initWithFile(filename,rect))
{
sprite->autorelease();
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
}
FilterSprite*FilterSprite::createWithTexture(Texture2D*pTexture)
{
)FilterSprite();
Rectrect=Rect::ZERO;
rect.size=pTexture->getContentSize();
(sprite&&sprite->initWithTexture(pTexture,rect))
{
sprite->autorelease();
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
}
FilterSprite*FilterSprite::createWithTexture(Texture2D*texture,monospace!important; font-size:1em!important; min-height:inherit!important">rotated)
{
)FilterSprite();
(sprite&&sprite->initWithTexture(texture,rect))
{
sprite->autorelease();
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
}
FilterSprite*FilterSprite::createWithSpriteFrame(SpriteFrame*spriteFrame)
{
)FilterSprite();
(sprite&&spriteFrame&&sprite->initWithSpriteFrame(spriteFrame))
{
sprite->autorelease();
sprite;
}
CC_SAFE_DELETE(sprite);
nullptr;
}
FilterSprite*FilterSprite::createWithSpriteFrameName(
std::string&spriteFrameName)
{
SpriteFrame*frame=SpriteFrameCache::getInstance()->getSpriteFrameByName(spriteFrameName);
#
COCOS2D_DEBUG>0
char
msg[256]={0};
sprintf
(msg,
"InvalidspriteFrameName:%s"
CCASSERT(frame!=nullptr,msg);
#endif
createWithSpriteFrame(frame);
}
FilterSprite::initWithTexture(Texture2D*pTexture,monospace!important; font-size:1em!important; min-height:inherit!important">Rect&tRect){
do
{
CC_BREAK_IF(!Sprite::initWithTexture(pTexture,tRect));
GLchar*pszFragSource=
"#ifdefGL_ESn
;n
#endifn
uniformsampler2Du_texture;n
varyingvec2v_texCoord;n
varyingvec4v_fragmentColor;n
uniformmat4fiterMat;n
)n
{n
gl_FragColor=fiterMat*value;n
}";
autoglprogram=GLProgram::createWithByteArrays(ccPositionTextureColor_vert,pszFragSource);
autoglprogramstate=GLProgramState::getOrCreateWithGLProgram(glprogram);
setGLProgramState(glprogramstate);
CHECK_GL_ERROR_DEBUG();
return
true
;
}
while
(0);
;
}
FilterSprite::setFilterMat(cocos2d::Mat4matrixArray)
{
m_uSpriteFilter=matrixArray;
}
FilterSprite::draw(Renderer*renderer,uint32_tflags)
{
_customCommand.init(_globalZOrder);
_customCommand.func=CC_CALLBACK_0(FilterSprite::onDraw,153)!important">this
renderer->addCommand(&_customCommand);
}
FilterSprite::onDraw(
{
autoglProgramState=getGLProgramState();
glProgramState->apply(transform);
GL::blendFunc(_blendFunc.src,_blendFunc.dst);
GL::bindTexture2D(_texture->getName());
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POS_COLOR_TEX);
#definekQuadSize
sizeof
(_quad.bl)
size_t
offset=(
)&_quad;
//vertex
int
diff=offsetof(V3F_C4B_T2F,vertices);
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION,3,GL_FLOAT,GL_FALSE,kQuadSize,(
*)(offset+diff));
//texCoods
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD,2,monospace!important; font-size:1em!important; min-height:inherit!important">*)(offset+diff));
//color
glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR,4,GL_UNSIGNED_BYTE,GL_TRUE,monospace!important; font-size:1em!important; min-height:inherit!important">*)(offset+diff));
glDrawArrays(GL_TRIANGLE_STRIP,4);
CHECK_GL_ERROR_DEBUG();
CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1,4);
}
|