Merge pull request #500 from flyingpacer/renderendcrash

Renderendcrash
This commit is contained in:
minggo 2011-09-05 20:52:50 -07:00
commit 8ccc3321a3
3 changed files with 37 additions and 58 deletions

View File

@ -78,13 +78,9 @@ public:
/** end is key word of lua, use other name to export to lua. */ /** end is key word of lua, use other name to export to lua. */
inline void endToLua(){ end();}; inline void endToLua(){ end();};
#if CC_ENABLE_CACHE_TEXTTURE_DATA /** ends grabbing*/
/** ends grabbing for android */ // para bIsTOCacheTexture the parameter is only used for android to cache the texture
void end(bool bIsTOCasheTexture = true); void end(bool bIsTOCacheTexture = true);
#else
/** ends grabbing */
void end();
#endif
/** clears the texture with a color */ /** clears the texture with a color */
void clear(float r, float g, float b, float a); void clear(float r, float g, float b, float a);
@ -119,7 +115,7 @@ protected:
GLuint m_uFBO; GLuint m_uFBO;
GLint m_nOldFBO; GLint m_nOldFBO;
CCTexture2D *m_pTexture; CCTexture2D *m_pTexture;
GLubyte *m_pTextureDataBuffer; CCImage *m_pUITextureImage;
GLenum m_ePixelFormat; GLenum m_ePixelFormat;
}; };

View File

@ -42,7 +42,7 @@ CCRenderTexture::CCRenderTexture()
, m_nOldFBO(0) , m_nOldFBO(0)
, m_pTexture(0) , m_pTexture(0)
, m_ePixelFormat(kCCTexture2DPixelFormat_RGBA8888) , m_ePixelFormat(kCCTexture2DPixelFormat_RGBA8888)
, m_pTextureDataBuffer(NULL) , m_pUITextureImage(NULL)
{ {
} }
@ -51,12 +51,7 @@ CCRenderTexture::~CCRenderTexture()
removeAllChildrenWithCleanup(true); removeAllChildrenWithCleanup(true);
ccglDeleteFramebuffers(1, &m_uFBO); ccglDeleteFramebuffers(1, &m_uFBO);
if (NULL != m_pTextureDataBuffer) CC_SAFE_DELETE(m_pUITextureImage);
{
delete []m_pTextureDataBuffer;
m_pTextureDataBuffer = NULL;
}
} }
CCSprite * CCRenderTexture::getSprite() CCSprite * CCRenderTexture::getSprite()
@ -209,44 +204,36 @@ void CCRenderTexture::beginWithClear(float r, float g, float b, float a)
glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]); glClearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
} }
#if CC_ENABLE_CACHE_TEXTTURE_DATA void CCRenderTexture::end(bool bIsTOCacheTexture)
void CCRenderTexture::end(bool bIsTOCasheTexture) {
{ ccglBindFramebuffer(CC_GL_FRAMEBUFFER, m_nOldFBO);
if (bIsTOCasheTexture) // Restore the original matrix and viewport
{ glPopMatrix();
if (NULL != m_pTextureDataBuffer) CCSize size = CCDirector::sharedDirector()->getDisplaySizeInPixels();
{
delete []m_pTextureDataBuffer;
m_pTextureDataBuffer = NULL;
}
// to get the rendered texture data
const CCSize& s = m_pTexture->getContentSizeInPixels();
int tx = (int)s.width;
int ty = (int)s.height;
m_pTextureDataBuffer = new GLubyte[tx * ty * 4];
glReadPixels(0,0,tx,ty,GL_RGBA,GL_UNSIGNED_BYTE, m_pTextureDataBuffer);
VolatileTexture::addDataTexture(m_pTexture, m_pTextureDataBuffer, kTexture2DPixelFormat_RGBA8888, s);
}
ccglBindFramebuffer(CC_GL_FRAMEBUFFER, m_nOldFBO);
// Restore the original matrix and viewport
glPopMatrix();
CCSize size = CCDirector::sharedDirector()->getDisplaySizeInPixels();
// glViewport(0, 0, (GLsizei)size.width, (GLsizei)size.height);
CCDirector::sharedDirector()->getOpenGLView()->setViewPortInPoints(0, 0, size.width, size.height);
}
#else
void CCRenderTexture::end()
{
ccglBindFramebuffer(CC_GL_FRAMEBUFFER, m_nOldFBO);
// Restore the original matrix and viewport
glPopMatrix();
CCSize size = CCDirector::sharedDirector()->getDisplaySizeInPixels();
// glViewport(0, 0, (GLsizei)size.width, (GLsizei)size.height); // glViewport(0, 0, (GLsizei)size.width, (GLsizei)size.height);
CCDirector::sharedDirector()->getOpenGLView()->setViewPortInPoints(0, 0, size.width, size.height); CCDirector::sharedDirector()->getOpenGLView()->setViewPortInPoints(0, 0, size.width, size.height);
}
#endif #if CC_ENABLE_CACHE_TEXTTURE_DATA
if (bIsTOCacheTexture)
{
CC_SAFE_DELETE(m_pUITextureImage);
// to get the rendered texture data
const CCSize& s = m_pTexture->getContentSizeInPixels();
int tx = (int)s.width;
int ty = (int)s.height;
m_pUITextureImage = new CCImage;
if (true == getUIImageFromBuffer(m_pUITextureImage, 0, 0, tx, ty))
{
VolatileTexture::addDataTexture(m_pTexture, m_pUITextureImage->getData(), kTexture2DPixelFormat_RGBA8888, s);
}
else
{
CCLOG("Cache rendertexture failed!");
}
}
#endif
}
void CCRenderTexture::clear(float r, float g, float b, float a) void CCRenderTexture::clear(float r, float g, float b, float a)
{ {
@ -355,8 +342,8 @@ bool CCRenderTexture::getUIImageFromBuffer(CCImage *pImage, int x, int y, int nW
this->begin(); this->begin();
glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(0,0,nReadBufferWidth,nReadBufferHeight,GL_RGBA,GL_UNSIGNED_BYTE, pTempData); glReadPixels(0,0,nReadBufferWidth,nReadBufferHeight,GL_RGBA,GL_UNSIGNED_BYTE, pTempData);
this->end(); this->end(false);
// to get the actual texture data // to get the actual texture data
// #640 the image read from rendertexture is upseted // #640 the image read from rendertexture is upseted
for (int i = 0; i < nSavedBufferHeight; ++i) for (int i = 0; i < nSavedBufferHeight; ++i)

View File

@ -196,11 +196,7 @@ void RenderTextureTest::ccTouchesMoved(CCSet* touches, CCEvent* event)
} }
} }
// finish drawing and return context back to the screen // finish drawing and return context back to the screen
#if CC_ENABLE_CACHE_TEXTTURE_DATA
m_target->end(false); m_target->end(false);
#else
m_target->end();
#endif
} }
void RenderTextureTest::ccTouchesEnded(CCSet* touches, CCEvent* event) void RenderTextureTest::ccTouchesEnded(CCSet* touches, CCEvent* event)