void ParticleSystem::increaseEmittedEmitterPool(size_t size) { // Don't proceed if the pool doesn't contain any keys of emitted emitters if (mEmittedEmitterPool.empty()) { return; } EmittedEmitterPool::iterator emittedEmitterPoolIterator; ParticleEmitterList::iterator emitterIterator; ParticleEmitter* emitter = 0; ParticleEmitter* clonedEmitter = 0; String name = BLANK; EmittedEmitterList* e = 0; size_t maxNumberOfEmitters = size / mEmittedEmitterPool.size(); // equally distribute the number for each emitted emitter list size_t oldSize = 0; // Run through mEmittedEmitterPool and search for every key (=name) its corresponding emitter in mEmitters for (emittedEmitterPoolIterator = mEmittedEmitterPool.begin(); emittedEmitterPoolIterator != mEmittedEmitterPool.end(); ++emittedEmitterPoolIterator) { name = emittedEmitterPoolIterator->first; e = &emittedEmitterPoolIterator->second; // Search the correct emitter in the mEmitters vector emitter = 0; for (emitterIterator = mEmitters.begin(); emitterIterator != mEmitters.end(); ++emitterIterator) { emitter = *emitterIterator; if (emitter && name != "" && name == emitter->getName()) { // Found the right emitter, clone each emitter a number of times oldSize = e->size(); for (size_t t = oldSize; t < maxNumberOfEmitters; ++t) { clonedEmitter = ParticleSystemManager::getSingleton()._createEmitter(emitter->getType(), this); emitter->copyParametersTo(clonedEmitter); clonedEmitter->setEmitted(emitter->isEmitted()); // is always 'true' by the way, but just in case // Initially deactivate the emitted emitter if duration/repeat_delay are set if (clonedEmitter->getDuration() > 0.0f && (clonedEmitter->getRepeatDelay() > 0.0f || clonedEmitter->getMinRepeatDelay() > 0.0f || clonedEmitter->getMinRepeatDelay() > 0.0f)) { clonedEmitter->setEnabled(false); } // Add cloned emitters to the pool e->push_back(clonedEmitter); } } } } }