using System.Collections.Generic;
using ANX.Framework.Graphics;
using ANX.Framework.NonXNA;
using OpenTK.Graphics.OpenGL;

// 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 OpenGL implementation of an effect technique.
	/// </summary>
	public class EffectTechniqueGL3 : INativeEffectTechnique
	{
		#region Private
		/// <summary>
		/// The native shader handle.
		/// </summary>
		internal int programHandle;

		/// <summary>
		/// The active attributes of this technique.
		/// </summary>
		internal ShaderAttributeGL3[] activeAttributes;

		/// <summary>
		/// We currently have only one pass per technique.
		/// </summary>
		private EffectPass pass;

		private Effect parentEffect;
		#endregion

		#region Public
		/// <summary>
		/// The name of the effect technique.
		/// </summary>
		public string Name
		{
			get;
			private set;
		}

		/// <summary>
		/// The passes of the technique.
		/// </summary>
		public IEnumerable<EffectPass> Passes
		{
			get
			{
				yield return pass;
			}
		}
		#endregion

		#region Constructor
		/// <summary>
		/// Create a ne effect technique object.
		/// </summary>
		internal EffectTechniqueGL3(Effect setParentEffect, string setName, int setProgramHandle)
		{
			parentEffect = setParentEffect;
			Name = setName;
			programHandle = setProgramHandle;

			GetAttributes();

			pass = new EffectPass(parentEffect);
		}
		#endregion

		#region GetAttributes
		private void GetAttributes()
		{
			int attributeCount;
			GL.GetProgram(programHandle, ProgramParameter.ActiveAttributes,
				out attributeCount);
			activeAttributes = new ShaderAttributeGL3[attributeCount];
			for (int index = 0; index < attributeCount; index++)
			{
				activeAttributes[index] = new ShaderAttributeGL3(programHandle, index);
			}
		}
		#endregion
	}
}