// 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 _PS_WRAPPER_H
#define _PS_WRAPPER_H




#include "nel/misc/rgba.h"
#include "nel/misc/vector.h"
//
#include "nel/3d/ps_attrib_maker.h"
#include "nel/3d/texture.h"
//
#include "particle_workspace.h"


// wrapper to read/write a value of type T
template <class T> class IPSWrapper
{
public:
	CParticleWorkspace::CNode *OwnerNode; // Owner node of the property. When the property is modified, then the node will be marked as 'modified'
public:
	IPSWrapper() : OwnerNode(NULL)
	{
	}
	// for derivers : get a value
	virtual T get(void) const = 0;
	void setAndUpdateModifiedFlag(const T &value)
	{
		if (OwnerNode)
		{
			OwnerNode->setModified(true);
		}
		set(value);
	}
protected:
	// for derivers : set a value
	virtual void set(const T &) = 0;
};


// wrapper to read/write a scheme of type T
template <class T> class IPSSchemeWrapper
{
public:
	CParticleWorkspace::CNode *OwnerNode; // Owner node of the property. When the property is modified, then the node will be marked as 'modified'
public:
	IPSSchemeWrapper() : OwnerNode(NULL) {}
	typedef NL3D::CPSAttribMaker<T> scheme_type;
	virtual scheme_type *getScheme(void) const = 0;
	void setSchemeAndUpdateModifiedFlag(scheme_type *s)	
	{
		if (OwnerNode)
		{
			OwnerNode->setModified(true);
		}
		setScheme(s);
	}
protected:
	virtual void setScheme(scheme_type *s) = 0;
};



// RGBA wrapper
typedef IPSWrapper<NLMISC::CRGBA> IPSWrapperRGBA;
typedef IPSSchemeWrapper<NLMISC::CRGBA> IPSSchemeWrapperRGBA;

// float wrapper
typedef IPSWrapper<float> IPSWrapperFloat;
typedef IPSSchemeWrapper<float> IPSSchemeWrapperFloat;

// uint wrapper
typedef IPSWrapper<uint32> IPSWrapperUInt;
typedef IPSSchemeWrapper<uint32> IPSSchemeWrapperUInt;


// texture
class IPSWrapperTexture
{
public:
	CParticleWorkspace::CNode *OwnerNode;
public:
	// ctor
	IPSWrapperTexture() : OwnerNode(NULL) {}
	virtual NL3D::ITexture *get(void) = 0;
	virtual void setAndUpdateModifiedFlag(NL3D::ITexture *tex)
	{
		if (OwnerNode) OwnerNode->setModified(true);
		set(tex);
	}
protected:
	virtual void set(NL3D::ITexture *) = 0;
};

#endif