void PUParticleSystem3D::prepared() { if (!_prepared){ //if (_emitter && _emitter->isEnabled()) //{ // auto emitter = static_cast<PUEmitter*>(_emitter); // emitter->prepare(); //} if (_render) static_cast<PURender *>(_render)->prepare(); for (auto it : _behaviourTemplates) { it->prepare(); } for (auto it : _emitters) { //if (it->isEnabled()) (static_cast<PUEmitter*>(it))->prepare(); } for (auto it : _affectors) { //if (it->isEnabled()) (static_cast<PUAffector*>(it))->prepare(); } if (!_poolPrepared){ for (auto it : _emitters) { //if (it->isEnabled()) PUEmitter *emitter = static_cast<PUEmitter*>(it); if (emitter->getEmitsType() == PUParticle3D::PT_EMITTER){ PUEmitter *emitted = static_cast<PUEmitter*>(emitter->getEmitsEntityPtr()); for (unsigned int i = 0; i < _emittedEmitterQuota; ++i){ auto p = new (std::nothrow) PUParticle3D(); p->particleType = PUParticle3D::PT_EMITTER; p->particleEntityPtr = emitted->clone(); p->particleEntityPtr->retain(); p->copyBehaviours(_behaviourTemplates); _emittedEmitterParticlePool[emitted->getName()].addData(p); } } else if (emitter->getEmitsType() == PUParticle3D::PT_TECHNIQUE){ PUParticleSystem3D *emitted = static_cast<PUParticleSystem3D*>(emitter->getEmitsEntityPtr()); for (unsigned int i = 0; i < _emittedSystemQuota; ++i){ PUParticleSystem3D *clonePS = emitted->clone(); auto p = new (std::nothrow) PUParticle3D(); p->particleType = PUParticle3D::PT_TECHNIQUE; p->particleEntityPtr = clonePS; p->particleEntityPtr->retain(); p->copyBehaviours(_behaviourTemplates); _emittedSystemParticlePool[emitted->getName()].addData(p); clonePS->prepared(); } //emitted->stopParticle(); } } for (unsigned int i = 0; i < _particleQuota; ++i){ auto p = new (std::nothrow) PUParticle3D(); p->copyBehaviours(_behaviourTemplates); _particlePool.addData(p); } _poolPrepared = true; } _prepared = true; _timeElapsedSinceStart = 0.0f; if (_parentParticleSystem){ _particleSystemScaleVelocity = _parentParticleSystem->getParticleSystemScaleVelocity(); } } notifyRescaled(getDerivedScale()); }
//----------------------------------------------------------------------- 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; } }