void ParticleEmitter::Cleanup(bool needCleanupLayers) { emitterType = EMITTER_POINT; emissionVector.Set(NULL); emissionVector = RefPtr<PropertyLineValue<Vector3> >(new PropertyLineValue<Vector3>(Vector3(1.0f, 0.0f, 0.0f))); emissionAngle.Set(NULL); emissionAngle = RefPtr<PropertyLineValue<float32> >(new PropertyLineValue<float32>(0.0f)); emissionRange.Set(NULL); emissionRange = RefPtr<PropertyLineValue<float32> >(new PropertyLineValue<float32>(360.0f)); size = RefPtr<PropertyLineValue<Vector3> >(0); colorOverLife = 0; radius = 0; // number = new PropertyLineValue<float>(1.0f); time = 0.0f; repeatCount = 0; lifeTime = 1000000000.0f; emitPointsCount = -1; isPaused = false; angle = 0.f; isAutorestart = true; particlesFollow = false; is3D = false; playbackSpeed = 1.0f; // Also cleanup layers, if needed. if (needCleanupLayers) { CleanupLayers(); } }
ParticleEmitter::~ParticleEmitter() { CleanupLayers(); }
RenderObject * ParticleEmitter3D::Clone(RenderObject *newObject) { if(!newObject) { DVASSERT_MSG(IsPointerToExactClass<ParticleEmitter3D>(this), "Can clone only ParticleEmitter3D"); newObject = new ParticleEmitter3D(); } else { CleanupLayers(); ReleaseFromCache(static_cast<ParticleEmitter *>(newObject)->emitterFileName); } ParticleEmitter* clonedEmitter = static_cast<ParticleEmitter*>(newObject); clonedEmitter->SetConfigPath(this->configPath); clonedEmitter->SetPosition(this->position); clonedEmitter->SetAngle(this->angle); clonedEmitter->SetLifeTime(this->lifeTime); clonedEmitter->SetRepeatCount(this->repeatCount); clonedEmitter->SetTime(this->time); clonedEmitter->SetEmitPointsCount(this->emitPointsCount); clonedEmitter->SetPaused(this->isPaused); clonedEmitter->SetAutoRestart(this->isAutorestart); clonedEmitter->SetParticlesFollow(this->particlesFollow); clonedEmitter->Set3D(this->is3D); clonedEmitter->SetPlaybackSpeed(this->playbackSpeed); clonedEmitter->SetInitialTranslationVector(this->initialTranslationVector); if (this->emissionVector) { clonedEmitter->emissionVector = this->emissionVector->Clone(); clonedEmitter->emissionVector->Release(); } if (this->emissionAngle) { clonedEmitter->emissionAngle = this->emissionAngle->Clone(); clonedEmitter->emissionAngle->Release(); } if (this->emissionRange) { clonedEmitter->emissionRange = this->emissionRange->Clone(); clonedEmitter->emissionRange->Release(); } if (this->radius) { clonedEmitter->radius = this->radius->Clone(); clonedEmitter->radius->Release(); } if (this->colorOverLife) { clonedEmitter->colorOverLife = this->colorOverLife->Clone(); clonedEmitter->colorOverLife->Release(); } if (this->size) { clonedEmitter->size = this->size->Clone(); clonedEmitter->size->Release(); } clonedEmitter->emitterType = this->emitterType; clonedEmitter->currentColor = this->currentColor; clonedEmitter->SetShortEffect(shortEffect); // Now can add Layers. Need to update their parents. for (Vector<ParticleLayer*>::iterator iter = this->layers.begin(); iter != this->layers.end(); iter ++) { ParticleLayer* clonedLayer = (*iter)->Clone(NULL); ParticleLayer3D* clonedLayer3D = dynamic_cast<ParticleLayer3D*>(clonedLayer); if (clonedLayer3D) { clonedLayer3D->SetParent(clonedEmitter); } clonedEmitter->AddLayer(clonedLayer); SafeRelease(clonedLayer); } time = 0.0f; repeatCount = 0; lodLevelLocked = false; currentLodLevel = desiredLodLevel; clonedEmitter->emitterFileName = emitterFileName; RetainInCache(emitterFileName); return newObject; }