void ParticleSystem::initialiseEmittedEmitterPool(void) { if (mEmittedEmitterPoolInitialised) { return; } // Run through mEmitters and add keys to the pool ParticleEmitterList::iterator emitterIterator; ParticleEmitterList::iterator emitterIteratorInner; ParticleEmitter* emitter = 0; ParticleEmitter* emitterInner = 0; for (emitterIterator = mEmitters.begin(); emitterIterator != mEmitters.end(); ++emitterIterator) { // Determine the names of all emitters that are emitted emitter = *emitterIterator ; if (emitter && emitter->getEmittedEmitter() != BLANK) { // This one will be emitted, register its name and leave the vector empty! EmittedEmitterList empty; mEmittedEmitterPool.insert(make_pair(emitter->getEmittedEmitter(), empty)); } // Determine whether the emitter itself will be emitted and set the 'mEmitted' attribute for (emitterIteratorInner = mEmitters.begin(); emitterIteratorInner != mEmitters.end(); ++emitterIteratorInner) { emitterInner = *emitterIteratorInner; if (emitter && emitterInner && emitter->getName() != BLANK && emitter->getName() == emitterInner->getEmittedEmitter()) { emitter->setEmitted(true); break; } else { // Set explicitly to 'false' although the default value is already 'false' emitter->setEmitted(false); } } } mEmittedEmitterPoolInitialised = true; }
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); } } } } }