PUParticleSystem3D* PUParticleSystem3D::clone() { auto ps = PUParticleSystem3D::create(); copyAttributesTo(ps); for (auto &iter : _children){ PUParticleSystem3D *child = dynamic_cast<PUParticleSystem3D *>(iter); if (child) ps->addChild(child->clone()); } return ps; }
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()); }