using System;
using System.Runtime.InteropServices;
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.Framework.Graphics
{
	[PercentageComplete(100)]
	[TestState(TestStateAttribute.TestState.Untested)]
    [Developer("Glatzemann")]
	public sealed class EffectParameter
	{
	    private readonly INativeEffectParameter nativeParameter;

		#region Public
        public EffectAnnotationCollection Annotations
        {
            get { return nativeParameter.Annotations; }
        }

        public EffectParameterCollection Elements
        {
            get { return nativeParameter.Elements; }
        }

        public EffectParameterCollection StructureMembers
        {
            get { return nativeParameter.StructureMembers; }
        }

		public int ColumnCount
		{
            get { return nativeParameter.ColumnCount; }
		}

	    public string Name
	    {
            get { return nativeParameter.Name; }
	    }

	    public EffectParameterClass ParameterClass
	    {
            get { return nativeParameter.ParameterClass; }
	    }

	    public EffectParameterType ParameterType
	    {
            get { return nativeParameter.ParameterType; }
	    }

	    public int RowCount
	    {
            get { return nativeParameter.RowCount; }
	    }

	    public string Semantic
	    {
            get { return nativeParameter.Semantic; }
	    }
		#endregion

        internal EffectParameter(INativeEffectParameter nativeParameter)
        {
            this.nativeParameter = nativeParameter;
        }

		#region GetValue
		public bool GetValueBoolean()
		{
			return nativeParameter.GetValueBoolean();
		}

		public bool[] GetValueBooleanArray(int count)
		{
			return nativeParameter.GetValueBooleanArray(count);
		}

		public int GetValueInt32()
		{
			return nativeParameter.GetValueInt32();
		}

		public Int32[] GetValueInt32Array(int count)
		{
			return nativeParameter.GetValueInt32Array(count);
		}

		public Matrix GetValueMatrix()
		{
			return nativeParameter.GetValueMatrix();
		}

		public Matrix[] GetValueMatrixArray(int count)
		{
			return nativeParameter.GetValueMatrixArray(count);
		}

		public Matrix GetValueMatrixTranspose()
		{
			return nativeParameter.GetValueMatrixTranspose();
		}

		public Matrix[] GetValueMatrixTransposeArray(int count)
		{
			return nativeParameter.GetValueMatrixTransposeArray(count);
		}

		public Quaternion GetValueQuaternion()
		{
			return nativeParameter.GetValueQuaternion();
		}

		public Quaternion[] GetValueQuaternionArray(int count)
		{
			return nativeParameter.GetValueQuaternionArray(count);
		}

		public float GetValueSingle()
		{
			return nativeParameter.GetValueSingle();
		}

		public float[] GetValueSingleArray(int count)
		{
			return nativeParameter.GetValueSingleArray(count);
		}

		public string GetValueString()
		{
			return nativeParameter.GetValueString();
		}

		public Texture2D GetValueTexture2D()
		{
			return nativeParameter.GetValueTexture2D();
		}

		public Texture3D GetValueTexture3D()
		{
			return nativeParameter.GetValueTexture3D();
		}

		public TextureCube GetValueTextureCube()
		{
			return nativeParameter.GetValueTextureCube();
		}

		public Vector2 GetValueVector2()
		{
			return nativeParameter.GetValueVector2();
		}

		public Vector2[] GetValueVector2Array(int count)
		{
			return nativeParameter.GetValueVector2Array(count);
		}

		public Vector3 GetValueVector3()
		{
			return nativeParameter.GetValueVector3();
		}

		public Vector3[] GetValueVector3Array(int count)
		{
			return nativeParameter.GetValueVector3Array(count);
		}

		public Vector4 GetValueVector4()
		{
			return nativeParameter.GetValueVector4();
		}

		public Vector4[] GetValueVector4Array(int count)
		{
			return nativeParameter.GetValueVector4Array(count);
		}
		#endregion

		#region SetValue
		public void SetValue([MarshalAs(UnmanagedType.U1)] bool value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(bool[] value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(int value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(int[] value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Matrix value)
		{
			nativeParameter.SetValue(value, false);
		}

		public void SetValue(Matrix[] value)
		{
			nativeParameter.SetValue(value, false);
		}

		public void SetValue(Quaternion value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Quaternion[] value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(float value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(float[] value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(string value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Texture value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Vector2 value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Vector2[] value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Vector3 value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Vector3[] value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Vector4 value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValue(Vector4[] value)
		{
			nativeParameter.SetValue(value);
		}

		public void SetValueTranspose(Matrix value)
		{
			nativeParameter.SetValue(value, true);
		}

		public void SetValueTranspose(Matrix[] value)
		{
			nativeParameter.SetValue(value, true);
		}
		#endregion
	}
}