// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// 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 <http://www.gnu.org/licenses/>.

#ifndef NL_PS_INITIAL_POS
#define NL_PS_INITIAL_POS

namespace NL3D
{
	class CParticleSystem;
	class CPSLocated;
	class CPSLocatedBindable;
	struct IPSMover;
}


/** this class helps to copy the position of initial instances in a particle
 *  system. This enable a system to run, and have its parameter modified.
 *  When the user press stop, he will find the system at t = 0, with the new parameters
 */
class CPSInitialPos
{
public:
	CPSInitialPos() : _PS(NULL) {}
	// construct this by copying the datas of the system
	void copySystemInitialPos(NL3D::CParticleSystem *ps);
	/** reinitialize the system with its initial instances positions
	  * Works only once per copySystemInitialPos() call
	  */	  
	void restoreSystem();
	/// send back true when bbox display is enabled
	bool isBBoxDisplayEnabled();
	/// update data when a located in a particle system has been removed	
	void removeLocated(NL3D::CPSLocated *loc);
	/// update data when a located bindable in a particle system has been removed	
	void removeLocatedBindable(NL3D::CPSLocatedBindable *lb);		
	// initial position and speed of a located instance in a particle system
	struct CInitPSInstanceInfo
	{	
		uint32 Index;
		NL3D::CPSLocated *Loc;
		NLMISC::CVector Speed;
		NLMISC::CVector Pos;		
	};
	// rotation and scale of an element
	struct CRotScaleInfo
	{	
		uint32 Index;
		NL3D::CPSLocated *Loc;
		NL3D::CPSLocatedBindable *LB;
		NL3D::IPSMover *Psm;
		NLMISC::CMatrix Rot;
		NLMISC::CVector Scale;
	};
	NL3D::CParticleSystem *getPS() { return _PS; }
	const NL3D::CParticleSystem *getPS() const { return _PS; }
	bool isStateMemorized() const { return _PS != NULL; }
private:
	typedef std::vector<CInitPSInstanceInfo> TInitInfoVect;
	typedef std::vector<CRotScaleInfo> TRotScaleInfoVect;
	typedef std::vector< std::pair<NL3D::CPSLocated *, uint32> > TInitialLocatedSizeVect;
	TInitInfoVect _InitInfoVect;
	TRotScaleInfoVect _RotScaleInfoVect;
	// initial number of instances for each located
	TInitialLocatedSizeVect  _InitialSizeVect;
	NL3D::CParticleSystem *_PS;	
	// reset all initial infos
	void reset();	
};





#endif