Example #1
0
void PUEmitter::prepare()
{
    if (!_emitsEntity){
        if (_emitsType == PUParticle3D::PT_EMITTER){
            auto emitter = static_cast<PUParticleSystem3D *>(_particleSystem)->getEmitter(_emitsName);
            if (emitter){
                emitter->setMarkedForEmission(true);
                _emitsEntity = emitter;
            }
        }
        else if (_emitsType == PUParticle3D::PT_TECHNIQUE){
            PUParticleSystem3D *system = static_cast<PUParticleSystem3D *>(_particleSystem)->getParentParticleSystem();
            if (system){
                auto children = system->getChildren();
                for (auto it : children){
                    if (it->getName() == _emitsName)
                    {
                        static_cast<PUParticleSystem3D *>(it)->setMarkedForEmission(true);
                        _emitsEntity = it;
                        break;
                    }
                }
            }
        }
    }

    _latestPosition = getDerivedPosition(); // V1.3.1
}
//-----------------------------------------------------------------------
void PUDoPlacementParticleEventHandler::handle (PUParticleSystem3D* particleSystem, PUParticle3D* particle, float timeElapsed)
{
    if (!particle)
        return;

    if (!_found)
    {
        auto system = particleSystem;
        auto emitter = system->getEmitter(_forceEmitterName);
        //ParticleTechnique* technique = particleTechnique;
        //ParticleEmitter* emitter = particleTechnique->getEmitter(_forceEmitterName);
        if (!emitter)
        {
            // Search all techniques in this ParticleSystem for an emitter with the correct name
            PUParticleSystem3D* parentSystem = particleSystem->getParentParticleSystem();
            if (parentSystem){
                auto children = parentSystem->getChildren();
                for(auto iter : children)		
                {
                    PUParticleSystem3D *child  = dynamic_cast<PUParticleSystem3D *>(iter);
                    if (child){
                        system = child;
                        emitter = system->getEmitter(_forceEmitterName);
                        if (emitter)
                        {
                            break;
                        }
                    }
                }
            }
        }
        if (emitter)
        {
            _system = system;
            _emitter = emitter;
            if (_system)
            {
                _system->addListener(this);
            }
            _found = true;
        }
        else
        {
            return;
        }
    }

    // Emit 1 or more particles
    if (_system)
    {
        _baseParticle = particle;
        _system->forceEmission(_emitter, _numberOfParticles);
    }

    _baseParticle = 0;
}
//-----------------------------------------------------------------------
void PUDoAffectorEventHandler::handle (PUParticleSystem3D* particleSystem, PUParticle3D* particle, float timeElapsed)
{
    /** Search for the affector.
    */
    PUParticleSystem3D* technique = 0;
    PUAffector* affector = particleSystem->getAffector(_affectorName);
    if (!affector)
    {
        // Search all techniques in this ParticleSystem for an affector with the correct name
        PUParticleSystem3D* system = particleSystem->getParentParticleSystem();
        auto children = system->getChildren();
        for(auto iter : children)
        {
            technique = dynamic_cast<PUParticleSystem3D *>(iter);
            if (technique){
                affector = technique->getAffector(_affectorName);
                if (affector)
                {
                    break;
                }
            }
        }
    }

    if (affector)
    {
        // Call the affector even if it has enabled set to 'false'.
        if (_prePost)
        {
            affector->preUpdateAffector(timeElapsed);
            affector->updatePUAffector(particle, timeElapsed);
            affector->postUpdateAffector(timeElapsed);
        }
        else
        {
            affector->updatePUAffector(particle, timeElapsed);
        }
    }
}
//-----------------------------------------------------------------------
void PUDoEnableComponentEventHandler::handle (PUParticleSystem3D* particleSystem, PUParticle3D* /*particle*/, float /*timeElapsed*/)
{
    /** Search for the component.
    */
    //ParticleTechnique* technique = 0;
    switch (_componentType)
    {
        case CT_EMITTER:
        {
            PUEmitter* emitter = particleSystem->getEmitter(_componentName);
            if (!emitter)
            {
                // Search all techniques in this ParticleSystem for an emitter with the correct name
                PUParticleSystem3D* system = particleSystem->getParentParticleSystem();
                if (system){
                    auto children = system->getChildren();
                    for(auto iter : children)		
                    {
                        PUParticleSystem3D *child  = dynamic_cast<PUParticleSystem3D *>(iter);
                        if (child){
                            emitter = child->getEmitter(_componentName);
                            if (emitter)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            if (emitter)
            {
                emitter->setEnabled(_componentEnabled);
            }
        }
        break;

        case CT_AFFECTOR:
        {
            PUAffector* affector = particleSystem->getAffector(_componentName);
            if (!affector)
            {
                // Search all techniques in this ParticleSystem for an emitter with the correct name
                PUParticleSystem3D* system = particleSystem->getParentParticleSystem();
                if (system){
                    auto children = system->getChildren();
                    for(auto iter : children)		
                    {
                        PUParticleSystem3D *child  = dynamic_cast<PUParticleSystem3D *>(iter);
                        if (child){
                            affector = child->getAffector(_componentName);
                            if (affector)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            if (affector)
            {
                affector->setEnabled(_componentEnabled);
            }
        }
        break;

        case CT_OBSERVER:
        {
            PUObserver* observer = particleSystem->getObserver(_componentName);
            if (!observer)
            {
                // Search all techniques in this ParticleSystem for an emitter with the correct name
                PUParticleSystem3D* system = particleSystem->getParentParticleSystem();
                if (system){
                    auto children = system->getChildren();
                    for(auto iter : children)		
                    {
                        PUParticleSystem3D *child  = dynamic_cast<PUParticleSystem3D *>(iter);
                        if (child){
                            observer = child->getObserver(_componentName);
                            if (observer)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            if (observer)
            {
                observer->setEnabled(_componentEnabled);
            }
        }
        break;

        case CT_TECHNIQUE:
        {
            // Search in this ParticleSystem for a technique with the correct name
            PUParticleSystem3D* system = particleSystem->getParentParticleSystem();
            if (system){
                auto children = system->getChildren();
                for (auto iter : children){
                    PUParticleSystem3D *child = dynamic_cast<PUParticleSystem3D *>(iter);
                    if (child && child->getName() == _componentName){
                        child->setEnabled(_componentEnabled);
                        break;
                    }
                }
            }
        }
        break;
        default:
            break;
    }
}