示例#1
0
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;
}
示例#2
0
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;
}