diff --git a/HelloWorld/proj.android/jni/helloworld/main.cpp b/HelloWorld/proj.android/jni/helloworld/main.cpp index 9cc0fd4e17..3f954d0376 100644 --- a/HelloWorld/proj.android/jni/helloworld/main.cpp +++ b/HelloWorld/proj.android/jni/helloworld/main.cpp @@ -38,9 +38,11 @@ void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thi { ccDrawInit(); ccGLInvalidateStateCache(); - cocos2d::CCDirector::sharedDirector()->setGLDefaultValues(); + CCShaderCache::sharedShaderCache()->reloadDefaultShaders(); cocos2d::CCTextureCache::reloadAllTextures(); + cocos2d::CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND, NULL); + cocos2d::CCDirector::sharedDirector()->setGLDefaultValues(); } } diff --git a/cocos2dx/CCDirector.cpp b/cocos2dx/CCDirector.cpp index a4ee9444bf..26bb183812 100644 --- a/cocos2dx/CCDirector.cpp +++ b/cocos2dx/CCDirector.cpp @@ -585,7 +585,7 @@ void CCDirector::purgeDirector() // cocos2d-x specific data structures CCUserDefault::purgeSharedUserDefault(); - CCNotificationCenter::purgeNotifCenter(); + CCNotificationCenter::purgeNotificationCenter(); ccGLInvalidateStateCache(); diff --git a/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.cpp b/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.cpp index f23826f7d3..3595343eca 100644 --- a/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.cpp +++ b/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.cpp @@ -43,7 +43,7 @@ CCNotificationCenter::~CCNotificationCenter() m_observers->release(); } -CCNotificationCenter *CCNotificationCenter::sharedNotifCenter(void) +CCNotificationCenter *CCNotificationCenter::sharedNotificationCenter(void) { if (!s_sharedNotifCenter) { @@ -52,7 +52,7 @@ CCNotificationCenter *CCNotificationCenter::sharedNotifCenter(void) return s_sharedNotifCenter; } -void CCNotificationCenter::purgeNotifCenter(void) +void CCNotificationCenter::purgeNotificationCenter(void) { CC_SAFE_RELEASE_NULL(s_sharedNotifCenter); } diff --git a/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.h b/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.h index 9bd0ba9cf9..5c9820dc64 100644 --- a/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.h +++ b/cocos2dx/extensions/CCNotificationCenter/CCNotificationCenter.h @@ -37,8 +37,8 @@ public: CCNotificationCenter(); ~CCNotificationCenter(); - static CCNotificationCenter *sharedNotifCenter(void); - static void purgeNotifCenter(void); + static CCNotificationCenter *sharedNotificationCenter(void); + static void purgeNotificationCenter(void); void addObserver(CCObject *target, SEL_CallFuncO selector, diff --git a/cocos2dx/include/CCEventType.h b/cocos2dx/include/CCEventType.h new file mode 100644 index 0000000000..3a9ad5add2 --- /dev/null +++ b/cocos2dx/include/CCEventType.h @@ -0,0 +1,11 @@ + +#ifndef __CCEVENT_TYPE_H__ +#define __CCEVENT_TYPE_H__ + +/** + * This header is used for defining event types using in CCNotificationCenter + */ + +#define EVNET_COME_TO_FOREGROUND "event_come_to_foreground" + +#endif // __CCEVENT_TYPE_H__ diff --git a/cocos2dx/include/CCParticleSystemQuad.h b/cocos2dx/include/CCParticleSystemQuad.h index 24387dbaa1..9e1a2c8b29 100755 --- a/cocos2dx/include/CCParticleSystemQuad.h +++ b/cocos2dx/include/CCParticleSystemQuad.h @@ -92,6 +92,10 @@ public: virtual void draw(); virtual void setBatchNode(CCParticleBatchNode* batchNode); virtual void setTotalParticles(unsigned int tp); + + /** listen the event that coming to foreground on Android + */ + void listenBackToForeground(CCObject *obj); private: #if CC_TEXTURE_ATLAS_USE_VAO void setupVBOandVAO(); diff --git a/cocos2dx/include/CCTextureAtlas.h b/cocos2dx/include/CCTextureAtlas.h index 39fc5285e1..7a0ba81671 100755 --- a/cocos2dx/include/CCTextureAtlas.h +++ b/cocos2dx/include/CCTextureAtlas.h @@ -193,6 +193,9 @@ public: /** draws all the Atlas's Quads */ void drawQuads(); + /** listen the event that coming to foreground on Android + */ + void listenBackToForeground(CCObject *obj); private: void setupIndices(); void mapBuffers(); diff --git a/cocos2dx/include/CCTextureCache.h b/cocos2dx/include/CCTextureCache.h index 63f6f27886..06659175b1 100755 --- a/cocos2dx/include/CCTextureCache.h +++ b/cocos2dx/include/CCTextureCache.h @@ -175,6 +175,7 @@ typedef enum { kImageFile, kImageData, kString, + kImage, }ccCachedImageType; public: @@ -184,6 +185,7 @@ public: static void addImageTexture(CCTexture2D *tt, const char* imageFileName, CCImage::EImageFormat format); static void addStringTexture(CCTexture2D *tt, const char* text, const CCSize& dimensions, CCTextAlignment alignment, const char *fontName, float fontSize); static void addDataTexture(CCTexture2D *tt, void* data, CCTexture2DPixelFormat pixelFormat, const CCSize& contentSize); + static void addCCImage(CCTexture2D *tt, CCImage *image); static void removeTexture(CCTexture2D *t); static void reloadAllTextures(); @@ -191,9 +193,16 @@ public: public: static std::list textures; static bool isReloading; + +private: + // find VolatileTexture by CCTexture2D* + // if not found, create a new one + static VolatileTexture* findVolotileTexture(CCTexture2D *tt); protected: CCTexture2D *texture; + + CCImage *uiImage; ccCachedImageType m_eCashedImageType; diff --git a/cocos2dx/include/ccMacros.h b/cocos2dx/include/ccMacros.h index fc4cf232c9..9784249c31 100644 --- a/cocos2dx/include/ccMacros.h +++ b/cocos2dx/include/ccMacros.h @@ -225,7 +225,7 @@ It should work same as apples CFSwapInt32LittleToHost(..) do { \ GLenum __error = glGetError(); \ if(__error) { \ - CCLog("OpenGL error 0x%04X in %s %d\n", __error, __FUNCTION__, __LINE__); \ + CCLog("OpenGL error 0x%04X in %s %s %d\n", __error, __FILE__, __FUNCTION__, __LINE__); \ } \ } while (false) #endif diff --git a/cocos2dx/particle_nodes/CCParticleSystem.cpp b/cocos2dx/particle_nodes/CCParticleSystem.cpp index ffe4ddbcb1..47e60bb34c 100644 --- a/cocos2dx/particle_nodes/CCParticleSystem.cpp +++ b/cocos2dx/particle_nodes/CCParticleSystem.cpp @@ -269,62 +269,61 @@ bool CCParticleSystem::initWithDictionary(CCDictionary *dictionary) //don't get the internal texture if a batchNode is used if (!m_pBatchNode) { - // texture - // Try to get the texture from the cache - const char* textureName = dictionary->valueForKey("textureFileName")->getCString(); - std::string fullpath = CCFileUtils::fullPathFromRelativeFile(textureName, m_sPlistFile.c_str()); - - CCTexture2D *tex = NULL; - - if (strlen(textureName) > 0) - { - // set not pop-up message box when load image failed - bool bNotify = CCFileUtils::getIsPopupNotify(); - CCFileUtils::setIsPopupNotify(false); - tex = CCTextureCache::sharedTextureCache()->addImage(fullpath.c_str()); - - // reset the value of UIImage notify - CCFileUtils::setIsPopupNotify(bNotify); - } - - if (tex) - { - setTexture(tex); - } - else - { - const char *textureData = dictionary->valueForKey("textureImageData")->getCString(); - CCAssert(textureData, ""); - - int dataLen = strlen(textureData); - if(dataLen != 0) + // texture + // Try to get the texture from the cache + const char* textureName = dictionary->valueForKey("textureFileName")->getCString(); + std::string fullpath = CCFileUtils::fullPathFromRelativeFile(textureName, m_sPlistFile.c_str()); + + CCTexture2D *tex = NULL; + + if (strlen(textureName) > 0) { - // if it fails, try to get it from the base64-gzipped data - int decodeLen = base64Decode((unsigned char*)textureData, (unsigned int)dataLen, &buffer); - CCAssert( buffer != NULL, "CCParticleSystem: error decoding textureImageData"); - CC_BREAK_IF(!buffer); - + // set not pop-up message box when load image failed + bool bNotify = CCFileUtils::getIsPopupNotify(); + CCFileUtils::setIsPopupNotify(false); + tex = CCTextureCache::sharedTextureCache()->addImage(fullpath.c_str()); + + // reset the value of UIImage notify + CCFileUtils::setIsPopupNotify(bNotify); + } + + if (tex) + { + setTexture(tex); + } + else + { + const char *textureData = dictionary->valueForKey("textureImageData")->getCString(); + CCAssert(textureData, ""); + + int dataLen = strlen(textureData); + if(dataLen != 0) + { + // if it fails, try to get it from the base64-gzipped data + int decodeLen = base64Decode((unsigned char*)textureData, (unsigned int)dataLen, &buffer); + CCAssert( buffer != NULL, "CCParticleSystem: error decoding textureImageData"); + CC_BREAK_IF(!buffer); + int deflatedLen = ZipUtils::ccInflateMemory(buffer, decodeLen, &deflated); CCAssert( deflated != NULL, "CCParticleSystem: error ungzipping textureImageData"); CC_BREAK_IF(!deflated); + // don't delete image, VolatileTexture use it in CCTextureCache::sharedTextureCache()->addUIImage() image = new CCImage(); bool isOK = image->initWithImageData(deflated, deflatedLen); CCAssert(isOK, "CCParticleSystem: error init image with Data"); CC_BREAK_IF(!isOK); setTexture(CCTextureCache::sharedTextureCache()->addUIImage(image, fullpath.c_str())); + } } - } - CCAssert( this->m_pTexture != NULL, "CCParticleSystem: error loading the texture"); - + CCAssert( this->m_pTexture != NULL, "CCParticleSystem: error loading the texture"); } bRet = true; } } while (0); CC_SAFE_DELETE_ARRAY(buffer); CC_SAFE_DELETE_ARRAY(deflated); - CC_SAFE_DELETE(image); return bRet; } @@ -470,7 +469,7 @@ void CCParticleSystem::initParticle(tCCParticle* particle) float a = CC_DEGREES_TO_RADIANS( m_fAngle + m_fAngleVar * CCRANDOM_MINUS1_1() ); // Mode Gravity: A - if( m_nEmitterMode == kCCParticleModeGravity ) + if (m_nEmitterMode == kCCParticleModeGravity) { CCPoint v(cosf( a ), sinf( a )); float s = modeA.speed + modeA.speedVar * CCRANDOM_MINUS1_1(); @@ -488,17 +487,22 @@ void CCParticleSystem::initParticle(tCCParticle* particle) } // Mode Radius: B - else { + else + { // Set the default diameter of the particle from the source position float startRadius = modeB.startRadius + modeB.startRadiusVar * CCRANDOM_MINUS1_1(); float endRadius = modeB.endRadius + modeB.endRadiusVar * CCRANDOM_MINUS1_1(); particle->modeB.radius = startRadius; - if( modeB.endRadius == kCCParticleStartRadiusEqualToEndRadius ) + if(modeB.endRadius == kCCParticleStartRadiusEqualToEndRadius) + { particle->modeB.deltaRadius = 0; + } else + { particle->modeB.deltaRadius = (endRadius - startRadius) / particle->timeToLive; + } particle->modeB.angle = a; particle->modeB.degreesPerSecond = CC_DEGREES_TO_RADIANS(modeB.rotatePerSecond + modeB.rotatePerSecondVar * CCRANDOM_MINUS1_1()); @@ -532,7 +536,7 @@ void CCParticleSystem::update(ccTime dt) { CC_PROFILER_START_CATEGORY(kCCProfilerCategoryParticles , "CCParticleSystem - update"); - if( m_bIsActive && m_fEmissionRate ) + if (m_bIsActive && m_fEmissionRate) { float rate = 1.0f / m_fEmissionRate; //issue #1201, prevent bursts of particles, due to too high emitCounter @@ -541,14 +545,14 @@ void CCParticleSystem::update(ccTime dt) m_fEmitCounter += dt; } - while( m_uParticleCount < m_uTotalParticles && m_fEmitCounter > rate ) + while (m_uParticleCount < m_uTotalParticles && m_fEmitCounter > rate) { this->addParticle(); m_fEmitCounter -= rate; } m_fElapsed += dt; - if(m_fDuration != -1 && m_fDuration < m_fElapsed) + if (m_fDuration != -1 && m_fDuration < m_fElapsed) { this->stopSystem(); } @@ -557,35 +561,37 @@ void CCParticleSystem::update(ccTime dt) m_uParticleIdx = 0; CCPoint currentPosition = CCPointZero; - if( m_ePositionType == kCCPositionTypeFree ) + if (m_ePositionType == kCCPositionTypeFree) { currentPosition = this->convertToWorldSpace(CCPointZero); } - else if ( m_ePositionType == kCCPositionTypeRelative ) + else if (m_ePositionType == kCCPositionTypeRelative) { currentPosition = m_tPosition; } if (m_bIsVisible) { - while( m_uParticleIdx < m_uParticleCount ) + while (m_uParticleIdx < m_uParticleCount) { tCCParticle *p = &m_pParticles[m_uParticleIdx]; // life p->timeToLive -= dt; - if( p->timeToLive > 0 ) + if (p->timeToLive > 0) { // Mode A: gravity, direction, tangential accel & radial accel - if( m_nEmitterMode == kCCParticleModeGravity ) + if (m_nEmitterMode == kCCParticleModeGravity) { CCPoint tmp, radial, tangential; radial = CCPointZero; // radial acceleration - if(p->pos.x || p->pos.y) + if (p->pos.x || p->pos.y) + { radial = ccpNormalize(p->pos); + } tangential = radial; radial = ccpMult(radial, p->modeA.radialAccel); @@ -604,7 +610,8 @@ void CCParticleSystem::update(ccTime dt) } // Mode B: radius movement - else { + else + { // Update the angle and radius of the particle. p->modeB.angle += p->modeB.degreesPerSecond * dt; p->modeB.radius += p->modeB.deltaRadius * dt; @@ -632,7 +639,7 @@ void CCParticleSystem::update(ccTime dt) CCPoint newPos; - if( m_ePositionType == kCCPositionTypeFree || m_ePositionType == kCCPositionTypeRelative ) + if (m_ePositionType == kCCPositionTypeFree || m_ePositionType == kCCPositionTypeRelative) { CCPoint diff = ccpSub( currentPosition, p->startPos ); newPos = ccpSub(p->pos, diff); @@ -655,7 +662,6 @@ void CCParticleSystem::update(ccTime dt) // update particle counter ++m_uParticleIdx; - } else { @@ -687,8 +693,10 @@ void CCParticleSystem::update(ccTime dt) } //while m_bTransformSystemDirty = false; } - if (!m_pBatchNode) + if (! m_pBatchNode) + { postStep(); + } CC_PROFILER_STOP_CATEGORY(kCCProfilerCategoryParticles , "CCParticleSystem - update"); } diff --git a/cocos2dx/particle_nodes/CCParticleSystemQuad.cpp b/cocos2dx/particle_nodes/CCParticleSystemQuad.cpp index fab7ecefc6..7b66222164 100644 --- a/cocos2dx/particle_nodes/CCParticleSystemQuad.cpp +++ b/cocos2dx/particle_nodes/CCParticleSystemQuad.cpp @@ -38,6 +38,8 @@ THE SOFTWARE. #include "ccGLStateCache.h" #include "CCGLProgram.h" #include "support/TransformUtils.h" +#include "extensions/CCNotificationCenter/CCNotificationCenter.h" +#include "CCEventType.h" // extern #include "kazmath/GL/matrix.h" @@ -65,6 +67,14 @@ bool CCParticleSystemQuad::initWithTotalParticles(unsigned int numberOfParticles #endif setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor)); + + + // Need to listen the event only when not use batchnode, because it will use VBO + CCNotificationCenter::sharedNotificationCenter()->addObserver(this, + callfuncO_selector(CCParticleSystemQuad::listenBackToForeground), + EVNET_COME_TO_FOREGROUND, + NULL); + return true; } return false; @@ -91,6 +101,8 @@ CCParticleSystemQuad::~CCParticleSystemQuad() glDeleteVertexArrays(1, &m_uVAOname); #endif } + + CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, EVNET_COME_TO_FOREGROUND); } // implementation CCParticleSystemQuad @@ -236,7 +248,7 @@ void CCParticleSystemQuad::updateQuadWithParticle(tCCParticle* particle, const C // vertices GLfloat size_2 = particle->size/2; - if( particle->rotation ) + if (particle->rotation) { GLfloat x1 = -size_2; GLfloat y1 = -size_2; @@ -273,7 +285,9 @@ void CCParticleSystemQuad::updateQuadWithParticle(tCCParticle* particle, const C // top-right vertex: quad->tr.vertices.x = cx; quad->tr.vertices.y = cy; - } else { + } + else + { // bottom-left vertex: quad->bl.vertices.x = newPosition.x - size_2; quad->bl.vertices.y = newPosition.y - size_2; @@ -477,6 +491,15 @@ void CCParticleSystemQuad::setupVBO() #endif +void CCParticleSystemQuad::listenBackToForeground(CCObject *obj) +{ +#if CC_TEXTURE_ATLAS_USE_VAO + setupVBOandVAO(); +#else + setupVBO(); +#endif +} + bool CCParticleSystemQuad::allocMemory() { CCAssert( ( !m_pQuads && !m_pIndices), "Memory already alloced"); diff --git a/cocos2dx/textures/CCTexture2D.cpp b/cocos2dx/textures/CCTexture2D.cpp index 58ffe567aa..8010b45650 100644 --- a/cocos2dx/textures/CCTexture2D.cpp +++ b/cocos2dx/textures/CCTexture2D.cpp @@ -246,34 +246,22 @@ bool CCTexture2D::initWithImage(CCImage *uiImage) bool CCTexture2D::initWithImage(CCImage * uiImage, ccResolutionType resolution) { - unsigned int POTWide, POTHigh; - - if(uiImage == NULL) + if (uiImage == NULL) { CCLOG("cocos2d: CCTexture2D. Can't create Texture. UIImage is nil"); this->release(); return false; } - + + unsigned int imageWidth = uiImage->getWidth(); + unsigned int imageHeight = uiImage->getHeight(); + CCConfiguration *conf = CCConfiguration::sharedConfiguration(); -#if CC_TEXTURE_NPOT_SUPPORT - if( conf->isSupportsNPOT() ) - { - POTWide = uiImage->getWidth(); - POTHigh = uiImage->getHeight(); - } - else -#endif - { - POTWide = ccNextPOT(uiImage->getWidth()); - POTHigh = ccNextPOT(uiImage->getHeight()); - } - unsigned maxTextureSize = conf->getMaxTextureSize(); - if( POTHigh > maxTextureSize || POTWide > maxTextureSize ) + if (imageWidth > maxTextureSize || imageHeight > maxTextureSize) { - CCLOG("cocos2d: WARNING: Image (%u x %u) is bigger than the supported %u x %u", POTWide, POTHigh, maxTextureSize, maxTextureSize); + CCLOG("cocos2d: WARNING: Image (%u x %u) is bigger than the supported %u x %u", imageWidth, imageHeight, maxTextureSize, maxTextureSize); this->release(); return NULL; } @@ -281,7 +269,7 @@ bool CCTexture2D::initWithImage(CCImage * uiImage, ccResolutionType resolution) m_eResolutionType = resolution; // always load premultiplied images - return initPremultipliedATextureWithImage(uiImage, POTWide, POTHigh); + return initPremultipliedATextureWithImage(uiImage, imageWidth, imageHeight); } bool CCTexture2D::initPremultipliedATextureWithImage(CCImage *image, unsigned int POTWide, unsigned int POTHigh) { diff --git a/cocos2dx/textures/CCTextureAtlas.cpp b/cocos2dx/textures/CCTextureAtlas.cpp index f0b5aa609c..3fa61e1bdf 100644 --- a/cocos2dx/textures/CCTextureAtlas.cpp +++ b/cocos2dx/textures/CCTextureAtlas.cpp @@ -30,6 +30,8 @@ THE SOFTWARE. #include "ccMacros.h" #include "CCGLProgram.h" #include "ccGLStateCache.h" +#include "extensions/CCNotificationCenter/CCNotificationCenter.h" +#include "CCEventType.h" // support #include "CCTexture2D.h" #include "CCString.h" @@ -61,6 +63,8 @@ CCTextureAtlas::~CCTextureAtlas() glDeleteVertexArrays(1, &m_uVAOname); #endif CC_SAFE_RELEASE(m_pTexture); + + CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, EVNET_COME_TO_FOREGROUND); } unsigned int CCTextureAtlas::getTotalQuads() @@ -171,6 +175,12 @@ bool CCTextureAtlas::initWithTexture(CCTexture2D *texture, unsigned int capacity memset( m_pQuads, 0, m_uCapacity * sizeof(ccV3F_C4B_T2F_Quad) ); memset( m_pIndices, 0, m_uCapacity * 6 * sizeof(GLushort) ); + + // listen the event when app go to background + CCNotificationCenter::sharedNotificationCenter()->addObserver(this, + callfuncO_selector(CCTextureAtlas::listenBackToForeground), + EVNET_COME_TO_FOREGROUND, + NULL); this->setupIndices(); @@ -185,6 +195,18 @@ bool CCTextureAtlas::initWithTexture(CCTexture2D *texture, unsigned int capacity return true; } +void CCTextureAtlas::listenBackToForeground(CCObject *obj) +{ +#if CC_TEXTURE_ATLAS_USE_VAO + setupVBOandVAO(); +#else + setupVBO(); +#endif + + // set m_bDirty to true to force it rebinding buffer + m_bDirty = true; +} + const char* CCTextureAtlas::description() { return CCString::stringWithFormat("", m_uTotalQuads)->getCString(); @@ -561,8 +583,11 @@ void CCTextureAtlas::drawNumberOfQuads(unsigned int n) void CCTextureAtlas::drawNumberOfQuads(unsigned int n, unsigned int start) { - if (0 == n) return; - ccGLBindTexture2D( m_pTexture->getName() ); + if (0 == n) + { + return; + } + ccGLBindTexture2D(m_pTexture->getName()); #if CC_TEXTURE_ATLAS_USE_VAO @@ -580,7 +605,7 @@ void CCTextureAtlas::drawNumberOfQuads(unsigned int n, unsigned int start) m_bDirty = false; } - glBindVertexArray( m_uVAOname ); + glBindVertexArray(m_uVAOname); #if CC_REBIND_INDICES_BUFFER glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_pBuffersVBO[1]); @@ -608,28 +633,29 @@ void CCTextureAtlas::drawNumberOfQuads(unsigned int n, unsigned int start) glBindBuffer(GL_ARRAY_BUFFER, m_pBuffersVBO[0]); // XXX: update is done in draw... perhaps it should be done in a timer - if (m_bDirty) { + if (m_bDirty) + { glBufferSubData(GL_ARRAY_BUFFER, sizeof(m_pQuads[0])*start, sizeof(m_pQuads[0]) * n , &m_pQuads[start] ); m_bDirty = false; } - ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex ); + ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex); // vertices - glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof( ccV3F_C4B_T2F, vertices)); + glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof(ccV3F_C4B_T2F, vertices)); // colors - glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (GLvoid*) offsetof( ccV3F_C4B_T2F, colors)); + glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (GLvoid*) offsetof(ccV3F_C4B_T2F, colors)); // tex coords - glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof( ccV3F_C4B_T2F, texCoords)); + glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof(ccV3F_C4B_T2F, texCoords)); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_pBuffersVBO[1]); #if CC_TEXTURE_ATLAS_USE_TRIANGLE_STRIP - glDrawElements(GL_TRIANGLE_STRIP, (GLsizei) n*6, GL_UNSIGNED_SHORT, (GLvoid*) (start*6*sizeof(m_pIndices[0])) ); + glDrawElements(GL_TRIANGLE_STRIP, (GLsizei)n*6, GL_UNSIGNED_SHORT, (GLvoid*) (start*6*sizeof(m_pIndices[0]))); #else - glDrawElements(GL_TRIANGLES, (GLsizei) n*6, GL_UNSIGNED_SHORT, (GLvoid*) (start*6*sizeof(m_pIndices[0])) ); + glDrawElements(GL_TRIANGLES, (GLsizei)n*6, GL_UNSIGNED_SHORT, (GLvoid*) (start*6*sizeof(m_pIndices[0]))); #endif // CC_TEXTURE_ATLAS_USE_TRIANGLE_STRIP glBindBuffer(GL_ARRAY_BUFFER, 0); diff --git a/cocos2dx/textures/CCTextureCache.cpp b/cocos2dx/textures/CCTextureCache.cpp index 4ad0766cdc..6b8b34b287 100644 --- a/cocos2dx/textures/CCTextureCache.cpp +++ b/cocos2dx/textures/CCTextureCache.cpp @@ -525,6 +525,10 @@ CCTexture2D* CCTextureCache::addUIImage(CCImage *image, const char *key) } while (0); +#if CC_ENABLE_CACHE_TEXTTURE_DATA + VolatileTexture::addCCImage(texture, image); +#endif + return texture; } @@ -626,6 +630,7 @@ VolatileTexture::VolatileTexture(CCTexture2D *t) , m_alignment(CCTextAlignmentCenter) , m_strFontName("") , m_strText("") +, uiImage(NULL) , m_fFontSize(0.0f) { m_size = CCSizeMake(0, 0); @@ -635,26 +640,17 @@ VolatileTexture::VolatileTexture(CCTexture2D *t) VolatileTexture::~VolatileTexture() { textures.remove(this); + CC_SAFE_FREE(uiImage); } void VolatileTexture::addImageTexture(CCTexture2D *tt, const char* imageFileName, CCImage::EImageFormat format) { if (isReloading) - return; - - VolatileTexture *vt = 0; - std::list::iterator i = textures.begin(); - while( i != textures.end() ) { - VolatileTexture *v = *i++; - if (v->texture == tt) { - vt = v; - break; - } + return; } - if (!vt) - vt = new VolatileTexture(tt); + VolatileTexture *vt = findVolotileTexture(tt); vt->m_eCashedImageType = kImageFile; vt->m_strFileName = imageFileName; @@ -662,24 +658,44 @@ void VolatileTexture::addImageTexture(CCTexture2D *tt, const char* imageFileName vt->m_PixelFormat = tt->getPixelFormat(); } -void VolatileTexture::addDataTexture(CCTexture2D *tt, void* data, CCTexture2DPixelFormat pixelFormat, const CCSize& contentSize) +void VolatileTexture::addCCImage(CCTexture2D *tt, CCImage *image) { - if (isReloading) - return; + VolatileTexture *vt = findVolotileTexture(tt); + + vt->uiImage = image; + vt->m_eCashedImageType = kImage; +} +VolatileTexture* VolatileTexture::findVolotileTexture(CCTexture2D *tt) +{ VolatileTexture *vt = 0; std::list::iterator i = textures.begin(); - while( i != textures.end() ) + while (i != textures.end()) { VolatileTexture *v = *i++; - if (v->texture == tt) { + if (v->texture == tt) + { vt = v; break; } } - - if (!vt) + + if (! vt) + { vt = new VolatileTexture(tt); + } + + return vt; +} + +void VolatileTexture::addDataTexture(CCTexture2D *tt, void* data, CCTexture2DPixelFormat pixelFormat, const CCSize& contentSize) +{ + if (isReloading) + { + return; + } + + VolatileTexture *vt = findVolotileTexture(tt); vt->m_eCashedImageType = kImageData; vt->m_pTextureData = data; @@ -690,21 +706,11 @@ void VolatileTexture::addDataTexture(CCTexture2D *tt, void* data, CCTexture2DPix void VolatileTexture::addStringTexture(CCTexture2D *tt, const char* text, const CCSize& dimensions, CCTextAlignment alignment, const char *fontName, float fontSize) { if (isReloading) - return; - - VolatileTexture *vt = 0; - std::list::iterator i = textures.begin(); - while( i != textures.end() ) { - VolatileTexture *v = *i++; - if (v->texture == tt) { - vt = v; - break; - } + return; } - if (!vt) - vt = new VolatileTexture(tt); + VolatileTexture *vt = findVolotileTexture(tt); vt->m_eCashedImageType = kString; vt->m_size = dimensions; @@ -714,13 +720,15 @@ void VolatileTexture::addStringTexture(CCTexture2D *tt, const char* text, const vt->m_strText = text; } -void VolatileTexture::removeTexture(CCTexture2D *t) { +void VolatileTexture::removeTexture(CCTexture2D *t) +{ std::list::iterator i = textures.begin(); - while( i != textures.end() ) + while (i != textures.end()) { VolatileTexture *vt = *i++; - if (vt->texture == t) { + if (vt->texture == t) + { delete vt; break; } @@ -732,11 +740,11 @@ void VolatileTexture::reloadAllTextures() isReloading = true; CCLOG("reload all texture"); - std::list::iterator i = textures.begin(); + std::list::iterator iter = textures.begin(); - while( i != textures.end() ) + while (iter != textures.end()) { - VolatileTexture *vt = *i++; + VolatileTexture *vt = *iter++; switch (vt->m_eCashedImageType) { @@ -775,10 +783,11 @@ void VolatileTexture::reloadAllTextures() break; case kImageData: { - unsigned int nPOTWide, nPOTHigh; - nPOTWide = ccNextPOT((int)vt->m_TextureSize.width); - nPOTHigh = ccNextPOT((int)vt->m_TextureSize.height); - vt->texture->initWithData(vt->m_pTextureData, vt->m_PixelFormat, nPOTWide, nPOTHigh, vt->m_TextureSize); + vt->texture->initWithData(vt->m_pTextureData, + vt->m_PixelFormat, + vt->m_TextureSize.width, + vt->m_TextureSize.height, + vt->m_TextureSize); } break; case kString: @@ -790,6 +799,12 @@ void VolatileTexture::reloadAllTextures() vt->m_fFontSize); } break; + case kImage: + { + vt->texture->initWithImage(vt->uiImage, + kCCResolutionUnknown); + } + break; default: break; } diff --git a/tests/proj.android/jni/tests/main.cpp b/tests/proj.android/jni/tests/main.cpp index a4570ea0d8..cf7becbae7 100644 --- a/tests/proj.android/jni/tests/main.cpp +++ b/tests/proj.android/jni/tests/main.cpp @@ -1,5 +1,6 @@ #include "AppDelegate.h" #include "cocos2d.h" +#include "CCEventType.h" #include "platform/android/jni/JniHelper.h" #include #include @@ -36,9 +37,11 @@ void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thi { ccDrawInit(); ccGLInvalidateStateCache(); - cocos2d::CCDirector::sharedDirector()->setGLDefaultValues(); + CCShaderCache::sharedShaderCache()->reloadDefaultShaders(); cocos2d::CCTextureCache::reloadAllTextures(); + cocos2d::CCNotificationCenter::sharedNotificationCenter()->postNotification(EVNET_COME_TO_FOREGROUND, NULL); + cocos2d::CCDirector::sharedDirector()->setGLDefaultValues(); } } diff --git a/tests/proj.ios/test.xcodeproj/project.pbxproj.REMOVED.git-id b/tests/proj.ios/test.xcodeproj/project.pbxproj.REMOVED.git-id index 8e06cd3ff6..eb506f856c 100644 --- a/tests/proj.ios/test.xcodeproj/project.pbxproj.REMOVED.git-id +++ b/tests/proj.ios/test.xcodeproj/project.pbxproj.REMOVED.git-id @@ -1 +1 @@ -8b5c548106a7fde2f85a35a0b0ac330b836d21ad \ No newline at end of file +fa64c2ecb635a4bf3fb7d38c3ca86b1a9c81b376 \ No newline at end of file diff --git a/tests/tests/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp b/tests/tests/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp index b6cee35578..d1f26c7468 100644 --- a/tests/tests/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp +++ b/tests/tests/ExtensionsTest/NotificationCenterTest/NotificationCenterTest.cpp @@ -34,7 +34,7 @@ Light::Light() Light::~Light() { - CCNotificationCenter::sharedNotifCenter()->removeObserver(this, MSG_SWITCH_STATE); + CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, MSG_SWITCH_STATE); } Light* Light::lightWithFile(const char* name) @@ -50,11 +50,11 @@ void Light::setIsConnectToSwitch(bool bConnectToSwitch) m_bConnected = bConnectToSwitch; if (m_bConnected) { - CCNotificationCenter::sharedNotifCenter()->addObserver(this, callfuncO_selector(Light::switchStateChanged), MSG_SWITCH_STATE, NULL); + CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(Light::switchStateChanged), MSG_SWITCH_STATE, NULL); } else { - CCNotificationCenter::sharedNotifCenter()->removeObserver(this, MSG_SWITCH_STATE); + CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, MSG_SWITCH_STATE); } updateLightState(); } @@ -128,7 +128,7 @@ NotificationCenterTest::NotificationCenterTest() light->setIsConnectToSwitch(bConnected); } - CCNotificationCenter::sharedNotifCenter()->postNotification(MSG_SWITCH_STATE, (CCObject*)item->getSelectedIndex()); + CCNotificationCenter::sharedNotificationCenter()->postNotification(MSG_SWITCH_STATE, (CCObject*)item->getSelectedIndex()); } void NotificationCenterTest::toExtensionsMainLayer(cocos2d::CCObject* sender) @@ -142,7 +142,7 @@ void NotificationCenterTest::toggleSwitch(CCObject *sender) { CCMenuItemToggle* item = (CCMenuItemToggle*)sender; int index = item->getSelectedIndex(); - CCNotificationCenter::sharedNotifCenter()->postNotification(MSG_SWITCH_STATE, (CCObject*)index); + CCNotificationCenter::sharedNotificationCenter()->postNotification(MSG_SWITCH_STATE, (CCObject*)index); } void NotificationCenterTest::connectToSwitch(CCObject *sender) diff --git a/tests/tests/ParticleTest/ParticleTest.cpp b/tests/tests/ParticleTest/ParticleTest.cpp index e1490aa2a7..2a800fccb0 100644 --- a/tests/tests/ParticleTest/ParticleTest.cpp +++ b/tests/tests/ParticleTest/ParticleTest.cpp @@ -1057,13 +1057,19 @@ CCLayer* restartParticleAction() return pLayer; } - -ParticleDemo::ParticleDemo(void) +ParticleDemo::~ParticleDemo(void) { + CC_SAFE_RELEASE(m_emitter); +} + +void ParticleDemo::onEnter(void) +{ + CCLayer::onEnter(); + initWithColor( ccc4(127,127,127,255) ); - + m_emitter = NULL; - + setIsTouchEnabled( true ); CCSize s = CCDirector::sharedDirector()->getWinSize(); @@ -1071,30 +1077,31 @@ ParticleDemo::ParticleDemo(void) addChild(label, 100, 1000); label->setPosition( CCPointMake(s.width/2, s.height-50) ); - CCLabelTTF *tapScreen = CCLabelTTF::labelWithString("(Tap the Screen)", "Arial", 20); - tapScreen->setPosition( CCPointMake(s.width/2, s.height-80) ); - addChild(tapScreen, 100); + CCLabelTTF *sub = CCLabelTTF::labelWithString(subtitle().c_str(), "Arial", 16); + addChild(sub, 100); + sub->setPosition(CCPointMake(s.width/2, s.height-80)); + CCMenuItemImage* item1 = CCMenuItemImage::itemWithNormalImage(s_pPathB1, s_pPathB2, this, menu_selector(ParticleDemo::backCallback) ); CCMenuItemImage* item2 = CCMenuItemImage::itemWithNormalImage(s_pPathR1, s_pPathR2, this, menu_selector(ParticleDemo::restartCallback) ); CCMenuItemImage* item3 = CCMenuItemImage::itemWithNormalImage(s_pPathF1, s_pPathF2, this, menu_selector(ParticleDemo::nextCallback) ); CCMenuItemToggle* item4 = CCMenuItemToggle::itemWithTarget( this, - menu_selector(ParticleDemo::toggleCallback), - CCMenuItemFont::itemWithString( "Free Movement" ), - CCMenuItemFont::itemWithString( "Relative Movement" ), - CCMenuItemFont::itemWithString( "Grouped Movement" ), - NULL ); + menu_selector(ParticleDemo::toggleCallback), + CCMenuItemFont::itemWithString( "Free Movement" ), + CCMenuItemFont::itemWithString( "Relative Movement" ), + CCMenuItemFont::itemWithString( "Grouped Movement" ), + NULL ); CCMenu *menu = CCMenu::menuWithItems(item1, item2, item3, item4, NULL); - + menu->setPosition( CCPointZero ); item1->setPosition( CCPointMake( s.width/2 - 100,30) ); item2->setPosition( CCPointMake( s.width/2, 30) ); item3->setPosition( CCPointMake( s.width/2 + 100,30) ); item4->setPosition( CCPointMake( 0, 100) ); item4->setAnchorPoint( CCPointMake(0,0) ); - + addChild( menu, 100 ); CCLabelAtlas* labelAtlas = CCLabelAtlas::labelWithString("0000", "fonts/fps_images.png", 16, 24, '.'); @@ -1105,7 +1112,7 @@ ParticleDemo::ParticleDemo(void) m_background = CCSprite::spriteWithFile(s_back3); addChild(m_background, 5); m_background->setPosition( CCPointMake(s.width/2, s.height-180) ); - + CCActionInterval* move = CCMoveBy::actionWithDuration(4, CCPointMake(300,0) ); CCActionInterval* move_back = move->reverse(); CCFiniteTimeAction* seq = CCSequence::actions( move, move_back, NULL); @@ -1113,16 +1120,6 @@ ParticleDemo::ParticleDemo(void) scheduleUpdate(); -} - -ParticleDemo::~ParticleDemo(void) -{ - CC_SAFE_RELEASE(m_emitter); -} - -void ParticleDemo::onEnter(void) -{ - CCLayer::onEnter(); CCLabelTTF* pLabel = (CCLabelTTF*)(this->getChildByTag(1000)); pLabel->setString(title().c_str()); @@ -1133,6 +1130,11 @@ std::string ParticleDemo::title() return "No title"; } +std::string ParticleDemo::subtitle() +{ + return "No titile"; +} + void ParticleDemo::registerWithTouchDispatcher() { CCDirector* pDirector = CCDirector::sharedDirector(); diff --git a/tests/tests/ParticleTest/ParticleTest.h b/tests/tests/ParticleTest/ParticleTest.h index 89c1f4f75b..7965d67aee 100644 --- a/tests/tests/ParticleTest/ParticleTest.h +++ b/tests/tests/ParticleTest/ParticleTest.h @@ -19,12 +19,12 @@ protected: CCSprite* m_background; public: - ParticleDemo(void); ~ParticleDemo(void); virtual void onEnter(void); virtual std::string title(); + virtual std::string subtitle(); void restartCallback(CCObject* pSender); void nextCallback(CCObject* pSender);