// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
#include "nel/3d/u_scene.h"
#include "nel/3d/u_instance_group.h"
#include "entity_fx.h"
#include "ig_client.h"
// map of Fx entities
TMapEntityFx EntityFx;
using namespace std;
using namespace NLMISC;
using namespace NL3D;
////////////
// GLOBAL //
////////////
// Hierarchical timer
H_AUTO_DECL ( RZ_Client_FX_Entities )
extern UScene *Scene;
/*
* Constructor
*/
CEntityFx::CEntityFx( const std::string& FxName, const std::string& InstanceName, const CVector& Position, const CQuat& Rotation )
{
_FxName = FxName;
_InstanceName = InstanceName;
_InstanceName = _InstanceName + ".ps";
_Position = Position;
_Rotation = Rotation;
_StatusFx = SStatusFx();
}
CEntityFx::~CEntityFx()
{
deleteInstance();
}
// startFx
void CEntityFx::startFx( void )
{
UInstance instance = Scene->createInstance( _InstanceName );
if(!instance.empty())
{
instance.setTransformMode( UTransformable::RotQuat );
instance.setPos( _Position );
instance.setRotQuat( _Rotation );
instance.setClusterSystem(NULL);
_FxInstance.cast (instance);
if (_FxInstance.empty())
{
deleteInstance();
}
}
}
/// isTerminated return true if fx is finish
bool CEntityFx::isTerminated( void )
{
if(!_FxInstance.empty())
{
if( _FxInstance.isSystemPresent() )
{
return (! _FxInstance.isValid() );
}
}
return false;
}
/// deleteInstance
void CEntityFx::deleteInstance( void)
{
if(!_FxInstance.empty())
{
if(Scene)
Scene->deleteInstance( _FxInstance );
_FxInstance = NULL;
}
}
// create new Fx entity
void newFx(const string& FxName, const string& InstanceName, const CVector& Position, const CQuat& Rotation )
{
if ( EntityFx.find( FxName ) != EntityFx.end() )
{
nlerror( "Fx %s already exist", FxName.c_str() );
}
else
{
CEntityFx *pEntityFx = new CEntityFx( FxName, InstanceName, Position, Rotation );
EntityFx.insert( make_pair( FxName, pEntityFx) );
}
}
// delete Fx entity
void deleteFx(const std::string& FxName)
{
TMapEntityFx::iterator it = EntityFx.find( FxName );
if( it != EntityFx.end() )
{
delete (*it).second;
EntityFx.erase( it );
}
}
// Start Fx entity
void startFx(const std::string& FxName)
{
TMapEntityFx::iterator it = EntityFx.find( FxName );
if( it != EntityFx.end() )
{
(*it).second->startFx();
}
}
// managed Fx entities
void manageFxEntities(void)
{
H_AUTO_USE ( RZ_Client_FX_Entities )
for( TMapEntityFx::iterator it = EntityFx.begin(); it != EntityFx.end(); ++it )
{
if( (*it).second->isTerminated() )
{
(*it).second->deleteInstance();
}
}
}