void ParticlesEditorController::AddParticleEmitterNodeToScene(Entity* emitterSceneNode) { // We are adding new Emitter to the Particle Effect node just selected. Entity* effectNode = NULL; BaseParticleEditorNode* selectedNode = GetSelectedNode(); if (selectedNode) { effectNode = selectedNode->GetRootNode(); } EffectParticleEditorNode* effectEditorNode = GetRootForParticleEffectNode(effectNode); if (effectNode && effectEditorNode) { EmitterParticleEditorNode* emitterEditorNode = new EmitterParticleEditorNode(effectNode, emitterSceneNode, QString::fromStdString(emitterSceneNode->GetName())); ParticleEmitter * emitter = GetEmitter(emitterSceneNode); if (!emitter) { return; } emitter->SetLifeTime(LIFETIME_FOR_NEW_PARTICLE_EMITTER); effectNode->AddNode(emitterSceneNode); effectEditorNode->AddChildNode(emitterEditorNode); } }
void ParticleEffectComponent::UpdateDurationForChildNodes(float32 newEmitterLifeTime) { int32 childrenCount = entity->GetChildrenCount(); for (int32 i = 0; i < childrenCount; i ++) { RenderComponent * component = static_cast<RenderComponent*>(entity->GetChild(i)->GetComponent(Component::RENDER_COMPONENT)); if(component && component->GetRenderObject() && component->GetRenderObject()->GetType() == RenderObject::TYPE_PARTICLE_EMTITTER) { ParticleEmitter * emitter = static_cast<ParticleEmitter*>(component->GetRenderObject()); emitter->SetLifeTime(newEmitterLifeTime); } } }
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; }