bool ParticlesEditorController::MoveEmitter(EmitterParticleEditorNode* movedItemEmitterNode, EffectParticleEditorNode* newEffectParentNode) { if (!movedItemEmitterNode || !newEffectParentNode) { return false; } if (movedItemEmitterNode->GetParentNode() == newEffectParentNode) { // No sence in moving Emitter to the same parent it currently belongs. return false; } // Move the Emitter to the new Effect inside the Particles Editor hierarchy... BaseParticleEditorNode* oldEffectParentNode = movedItemEmitterNode->GetParentNode(); oldEffectParentNode->RemoveChildNode(movedItemEmitterNode, false); newEffectParentNode->AddChildNode(movedItemEmitterNode); // and inside the SceneGraph. Entity* movedNode = movedItemEmitterNode->GetEmitterNode(); Entity* newParentNode = newEffectParentNode->GetRootNode(); Entity* oldParentNode = oldEffectParentNode->GetRootNode(); SafeRetain(movedNode); oldParentNode->RemoveNode(movedNode); newParentNode->AddNode(movedNode); SafeRelease(movedNode); return true; }
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); } }
Entity* ParticlesEditorSceneModelHelper::PreprocessSceneNode(Entity* rawNode) { // There is one and only preprocessing case - if the "raw" node is "orphaned" Particles Emitter // (without the ParticlesEffectNode parent), we'll create the new Particles Effect node and // move the raw Emitter node to it. ParticleEmitter * emitter = GetEmitter(rawNode); if (!emitter) { return rawNode; } //ParticleEmitterNode* emitterNode = static_cast<ParticleEmitterNode*>(rawNode); //emitterNode->SetEmitter(emitterComponent->GetParticleEmitter()); Entity* curParentNode = rawNode->GetParent(); ParticleEffectComponent * effectComponent = cast_if_equal<ParticleEffectComponent*>(curParentNode->GetComponent(Component::PARTICLE_EFFECT_COMPONENT)); // If the Emitter Node has parent, but its parent is not ParticleEffectNode, we need to // "adopt" this node by creating ParticleEffect node and attaching. if (curParentNode && (effectComponent == NULL)) { Entity* newParentNodeParticleEffect = CreateParticleEffectNode(); curParentNode->AddNode(newParentNodeParticleEffect); // Add the emitter node to the new Effect (this will also remove it from the scene). newParentNodeParticleEffect->AddNode(rawNode); // Register the Particle Editor structure for the new node. EffectParticleEditorNode* effectEditorNode = ParticlesEditorController::Instance()->RegisterParticleEffectNode(newParentNodeParticleEffect); EmitterParticleEditorNode* emitterEditorNode = new EmitterParticleEditorNode(newParentNodeParticleEffect, rawNode, QString::fromStdString(rawNode->GetName())); effectEditorNode->AddNode(emitterEditorNode); return newParentNodeParticleEffect; } // No preprocessing needed. return rawNode; }