Example #1
0
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);
		}
	    }
	}
    }
}
Example #2
0
ParticleSystem& ParticleSystem::operator=(const ParticleSystem& rhs)
{
    // Blank this system's emitters & affectors
    removeAllEmitters();
    removeAllEmittedEmitters();
    removeAllAffectors();

    // Copy emitters
    for (unsigned short i = 0; i < rhs.getNumEmitters(); ++i)
    {
        ParticleEmitter* rhsEm = rhs.getEmitter(i);
        ParticleEmitter* newEm = addEmitter(rhsEm->getType());
        rhsEm->copyParametersTo(newEm);
    }

    // Copy affectors
    /*for(unsigned short i = 0; i < rhs.getNumAffectors(); ++i)
    {
        ParticleAffector* rhsAf = rhs.getAffector(i);
        ParticleAffector* newAf = addAffector(rhsAf->getType());
        //rhsAf->copyParametersTo(newAf);
    }*/

    setParticleQuota(rhs.getParticleQuota());
    setEmittedEmitterQuota(rhs.getEmittedEmitterQuota());
    setDefaultDimensions(rhs.mDefaultWidth, rhs.mDefaultHeight);
    mCullIndividual = rhs.mCullIndividual;
    mSorted = rhs.mSorted;
    mLocalSpace = rhs.mLocalSpace;
    mIterationInterval = rhs.mIterationInterval;
    mIterationIntervalSet = rhs.mIterationIntervalSet;
    mNonvisibleTimeout = rhs.mNonvisibleTimeout;
    mNonvisibleTimeoutSet = rhs.mNonvisibleTimeoutSet;
    // last frame visible and time since last visible should be left default

    setRenderer(rhs.getRendererName());
    // Copy settings
    /*if (mRenderer && rhs.getRenderer())
    {
        //rhs.getRenderer()->copyParametersTo(mRenderer);
    }*/

    return *this;
}