NS_CC_BEGIN #define kQuadSize sizeof(m_pQuads[0].bl) //implementation CCParticleSystemQuad // overriding the init method bool CCParticleSystemQuad::initWithTotalParticles(unsigned int numberOfParticles) { // base initialization if( CCParticleSystem::initWithTotalParticles(numberOfParticles) ) { // allocating data space if( ! this->allocMemory() ) { this->release(); return false; } setupIndices(); #if CC_TEXTURE_ATLAS_USE_VAO setupVBOandVAO(); #else setupVBO(); #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; }
NS_CC_BEGIN //implementation ParticleSystemQuad // overriding the init method bool ParticleSystemQuad::initWithTotalParticles(unsigned int numberOfParticles) { // base initialization if( ParticleSystem::initWithTotalParticles(numberOfParticles) ) { // allocating data space if( ! this->allocMemory() ) { this->release(); return false; } initIndices(); #if CC_TEXTURE_ATLAS_USE_VAO setupVBOandVAO(); #else setupVBO(); #endif setShaderProgram(ShaderCache::getInstance()->programForKey(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR)); #if CC_ENABLE_CACHE_TEXTURE_DATA // Need to listen the event only when not use batchnode, because it will use VBO NotificationCenter::getInstance()->addObserver(this, callfuncO_selector(ParticleSystemQuad::listenBackToForeground), EVNET_COME_TO_FOREGROUND, NULL); #endif return true; } return false; }
void CCParticleSystemQuad::setTotalParticles(unsigned int tp) { // If we are setting the total number of particles to a number higher // than what is allocated, we need to allocate new arrays if( tp > m_uAllocatedParticles ) { // Allocate new memory size_t particlesSize = tp * sizeof(tCCParticle); size_t quadsSize = sizeof(m_pQuads[0]) * tp * 1; size_t indicesSize = sizeof(m_pIndices[0]) * tp * 6 * 1; tCCParticle* particlesNew = (tCCParticle*)realloc(m_pParticles, particlesSize); ccV3F_C4B_T2F_Quad* quadsNew = (ccV3F_C4B_T2F_Quad*)realloc(m_pQuads, quadsSize); GLushort* indicesNew = (GLushort*)realloc(m_pIndices, indicesSize); if (particlesNew && quadsNew && indicesNew) { // Assign pointers m_pParticles = particlesNew; m_pQuads = quadsNew; m_pIndices = indicesNew; // Clear the memory // XXX: Bug? If the quads are cleared, then drawing doesn't work... WHY??? XXX memset(m_pParticles, 0, particlesSize); memset(m_pQuads, 0, quadsSize); memset(m_pIndices, 0, indicesSize); m_uAllocatedParticles = tp; } else { // Out of memory, failed to resize some array if (particlesNew) m_pParticles = particlesNew; if (quadsNew) m_pQuads = quadsNew; if (indicesNew) m_pIndices = indicesNew; CCLOG("Particle system: out of memory"); return; } m_uTotalParticles = tp; // Init particles if (m_pBatchNode) { for (unsigned int i = 0; i < m_uTotalParticles; i++) { m_pParticles[i].atlasIndex=i; } } initIndices(); #if CC_TEXTURE_ATLAS_USE_VAO setupVBOandVAO(); #else setupVBO(); #endif } else { m_uTotalParticles = tp; } resetSystem(); }
void ParticleSystemQuad::setTotalParticles(int tp) { // If we are setting the total number of particles to a number higher // than what is allocated, we need to allocate new arrays if( tp > _allocatedParticles ) { // Allocate new memory size_t quadsSize = sizeof(_quads[0]) * tp * 1; size_t indicesSize = sizeof(_indices[0]) * tp * 6 * 1; _particleData.release(); if (!_particleData.init(tp)) { CCLOG("Particle system: not enough memory"); return; } V3F_C4B_T2F_Quad* quadsNew = (V3F_C4B_T2F_Quad*)realloc(_quads, quadsSize); GLushort* indicesNew = (GLushort*)realloc(_indices, indicesSize); if (quadsNew && indicesNew) { // Assign pointers _quads = quadsNew; _indices = indicesNew; // Clear the memory memset(_quads, 0, quadsSize); memset(_indices, 0, indicesSize); _allocatedParticles = tp; } else { // Out of memory, failed to resize some array if (quadsNew) _quads = quadsNew; if (indicesNew) _indices = indicesNew; CCLOG("Particle system: out of memory"); return; } _totalParticles = tp; // Init particles if (_batchNode) { for (int i = 0; i < _totalParticles; i++) { _particleData.atlasIndex[i] = i; } } initIndices(); if (Configuration::getInstance()->supportsShareableVAO()) { setupVBOandVAO(); } else { setupVBO(); } // fixed http://www.cocos2d-x.org/issues/3990 // Updates texture coords. updateTexCoords(); } else { _totalParticles = tp; } // fixed issue #5762 // reset the emission rate setEmissionRate(_totalParticles / _life); resetSystem(); }
bool BillboardParticleSystem::initWithTotalParticles(int numberOfParticles) { _totalParticles = numberOfParticles; CC_SAFE_FREE(_particles); _particles = (sBillboardParticle*)calloc(_totalParticles, sizeof(sBillboardParticle)); if( ! _particles ) { CCLOG("Particle system: not enough memory"); this->release(); return false; } _allocatedParticles = numberOfParticles; // default, active _isActive = true; // default blend function _blendFunc = BlendFunc::ALPHA_PREMULTIPLIED; // default movement type; _positionType = PositionType::FREE; // by default be in mode A: _emitterMode = Mode::GRAVITY; // default: modulate // XXX: not used // colorModulate = YES; _isAutoRemoveOnFinish = false; // Optimization: compile updateParticle method //updateParticleSel = @selector(updateQuadWithParticle:newPosition:); //updateParticleImp = (CC_UPDATE_PARTICLE_IMP) [self methodForSelector:updateParticleSel]; //for batchNode _transformSystemDirty = false; // allocating data space if( ! this->allocMemory() ) { this->release(); return false; } initIndices(); if (Configuration::getInstance()->supportsShareableVAO()) { setupVBOandVAO(); } else { setupVBO(); } setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP)); #if CC_ENABLE_CACHE_TEXTURE_DATA // Need to listen the event only when not use batchnode, because it will use VBO auto listener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, CC_CALLBACK_1(ParticleSystemQuad::listenRendererRecreated, this)); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); #endif return true; }
void BillboardParticleSystem::setTotalParticles(int tp) { // If we are setting the total number of particles to a number higher // than what is allocated, we need to allocate new arrays if( tp > _allocatedParticles ) { // Allocate new memory size_t particlesSize = tp * sizeof(tParticle); size_t quadsSize = sizeof(_quads[0]) * tp * 1; size_t indicesSize = sizeof(_indices[0]) * tp * 6 * 1; sBillboardParticle* particlesNew = (sBillboardParticle*)realloc(_particles, particlesSize); V3F_C4B_T2F_Quad* quadsNew = (V3F_C4B_T2F_Quad*)realloc(_quads, quadsSize); GLushort* indicesNew = (GLushort*)realloc(_indices, indicesSize); if (particlesNew && quadsNew && indicesNew) { // Assign pointers _particles = particlesNew; _quads = quadsNew; _indices = indicesNew; // Clear the memory memset(_particles, 0, particlesSize); memset(_quads, 0, quadsSize); memset(_indices, 0, indicesSize); _allocatedParticles = tp; } else { // Out of memory, failed to resize some array if (particlesNew) _particles = particlesNew; if (quadsNew) _quads = quadsNew; if (indicesNew) _indices = indicesNew; CCLOG("Particle system: out of memory"); return; } _totalParticles = tp; initIndices(); if (Configuration::getInstance()->supportsShareableVAO()) { setupVBOandVAO(); } else { setupVBO(); } // fixed http://www.cocos2d-x.org/issues/3990 // Updates texture coords. updateTexCoords(); } else { _totalParticles = tp; } // fixed issue #5762 // reset the emission rate setEmissionRate(_totalParticles / _life); resetSystem(); }