/* -----------------------------------------------------------------------------
	GSFramework
	Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */


#ifndef	__NTEXTUREPARM__
#define	__NTEXTUREPARM__


		#include "reflection/c_refl.h"
		#include "reflection/nenum_string.h"
		#include "nstring/nstring.h"


namespace GS {
	class Picture;

	namespace NML { class Tag; }
	namespace Render {
		struct Texture;

//
struct	TextureParm
{
		/// Get texture parameter file name from texture name.
static	String		GetParmFileName(const char *);

static	Reflection::Property serializable[];

enum	Filtering
{
	FilterDefault			=	0,
	FilterNearest,
	FilterBilinear,
	FilterTrilinear,

	FilterLast
};
static	Reflection::Enum::Dict filtering_dict[];

enum	Anisotropy
{
	AnisotropyDefault		=	0,
	AnisotropyNone,
	Anisotropy2x,
	Anisotropy4x,
	Anisotropy8x,
	Anisotropy16x,

	AnisotropyLast
};
static	Reflection::Enum::Dict anisotropic_dict[];

enum	Wrap
{
	WrapDefault				=	0,
	WrapRepeat,
	WrapClamp,

	WrapLast
};
static	Reflection::Enum::Dict wrap_dict[];

enum	Swizzle
{
	SwizzleRGBA				=	0,	// identity
	SwizzleBGRA,
	SwizzleARGB,
	SwizzleABGR,
	SwizzleXYZ,						// identity
	SwizzleXZY,
	SwizzleYXZ,
	SwizzleYZX,
	SwizzleZXY,
	SwizzleZYX,

	SwizzleLast
};
static	Reflection::Enum::Dict swizzle_dict[];

static	const char	*GetSwizzleFlags(Swizzle);

		Wrap		wrap_u, wrap_v;
		Filtering	filtering;
		Anisotropy	anisotropy;

		float		lod_bias;

		Swizzle		swizzle;

		bool		invert[4];
		bool		flip[2];

		void		Apply(Picture &) const;
		void		Apply(Texture &) const;

		bool		FromMetaTag(NML::Tag &);
		NML::Tag	*AsMetaTag() const;

		TextureParm()
		{
			wrap_u = wrap_v = WrapDefault;
			filtering = FilterDefault;
			anisotropy = AnisotropyDefault;

			lod_bias = 0.f;

			swizzle = SwizzleRGBA;
			for	(uchar n = 0; n < 4; ++n)
				invert[n] = false;
			flip[0] = flip[1] = false;
		}
};

	} // Render
} // GS


#endif // __NTEXTUREPARM__
