using ANX.Framework.Graphics;
using ANX.Framework.NonXNA;
using ANX.Framework.NonXNA.Development;

// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license

namespace ANX.RenderSystem.GL3
{
	/// <summary>
	/// Native Sampler State object for OpenGL.
	/// <para />
	/// Basically this is a wrapper class for setting the different values all
	/// at once, because OpenGL has no State objects like DirectX.
	/// <para />
	/// Info for OpenGL filter states:
	/// http://gregs-blog.com/2008/01/17/opengl-texture-filter-parameters-explained/
	/// 
	/// Info for OGL 3.3 sampler objects (sadly not implemented in OpenTK yet):
	/// http://www.sinanc.org/blog/?p=215
	/// </summary>
	[PercentageComplete(10)]
	[TestState(TestStateAttribute.TestState.Untested)]
	public class SamplerStateGL3 : INativeSamplerState
	{
		#region Public
		#region IsBound
		/// <summary>
		/// Flag if the state object is bound to the device.
		/// </summary>
		public bool IsBound
		{
			get;
			private set;
		}
		#endregion

		#region AddressU
		public TextureAddressMode AddressU
		{
			set;
			private get;
		}
		#endregion
		
		#region AddressV
		public TextureAddressMode AddressV
		{
			set;
			private get;
		}
		#endregion
		
		#region AddressW
		public TextureAddressMode AddressW
		{
			set;
			private get;
		}
		#endregion
		
		#region Filter
		public TextureFilter Filter
		{
			set;
			private get;
		}
		#endregion
		
		#region MaxAnisotropy
		public int MaxAnisotropy
		{
			set;
			private get;
		}
		#endregion
		
		#region MaxMipLevel
		public int MaxMipLevel
		{
			set;
			private get;
		}
		#endregion
		
		#region MipMapLevelOfDetailBias
		public float MipMapLevelOfDetailBias
		{
			set;
			private get;
		}
		#endregion
		#endregion

		#region Constructor
		/// <summary>
		/// Create a new sampler state object.
		/// </summary>
		internal SamplerStateGL3()
		{
			IsBound = false;
		}
		#endregion

		#region Apply
		/// <summary>
		/// Apply the sampler state.
		/// </summary>
		/// <param name="graphicsDevice">Graphics device.</param>
		/// <param name="index">The index of which sampler should be modified.</param>
		public void Apply(GraphicsDevice graphicsDevice, int index)
		{
			IsBound = true;

			// TODO: set stuff
		}
		#endregion

		#region Release
		/// <summary>
		/// Release the sampler state.
		/// </summary>
		public void Release()
		{
			IsBound = false;
		}
		#endregion

		#region Dispose
		/// <summary>
		/// Dispose the sampler state object.
		/// </summary>
		public void Dispose()
		{
		}
		#endregion
	}
}