using System;
using System.Runtime.CompilerServices;
namespace BansheeEngine
{
///
/// Type of parameters that can be defined in a shader.
///
public enum ShaderParameterType // Note: Must match C++ ShaderParameterType enum
{
Float, Vector2, Vector3, Vector4, Color,
Matrix3, Matrix4, Texture2D,
Texture3D, TextureCube, Sampler
}
///
/// Contains information about a shader parameter.
///
public struct ShaderParameter
{
///
/// Returns the name of the parameter variable.
///
public string Name { get { return name; } }
///
/// Returns the data type of the parameter.
///
public ShaderParameterType Type { get { return type; } }
///
/// Determines is parameter managed internally be the renderer, or is it expected to be set by the user.
///
public bool Internal { get { return isInternal; } }
private string name;
private ShaderParameterType type;
private bool isInternal;
///
/// Creates a new shader parameter.
///
/// Name of the parameter variable.
/// Data type of the parameter.
/// Determines is parameter managed internally be the renderer, or is expected to be set
/// by the user.
internal ShaderParameter(string name, ShaderParameterType type, bool isInternal)
{
this.name = name;
this.type = type;
this.isInternal = isInternal;
}
}
///
/// Contains definitions of GPU programs used for rendering, as well as a set of global parameters to control those
/// programs.
///
public class Shader : Resource
{
///
/// Constuctor for internal runtime use only.
///
private Shader()
{ }
///
/// Returns data about all parameters available in the shader.
///
public ShaderParameter[] Parameters
{
get
{
string[] names;
ShaderParameterType[] types;
bool[] visibility;
Internal_GetShaderParameters(mCachedPtr, out names, out types, out visibility);
ShaderParameter[] parameters = new ShaderParameter[names.Length];
for (int i = 0; i < names.Length; i++)
{
parameters[i] = new ShaderParameter(names[i], types[i], visibility[i]);
}
return parameters;
}
}
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void Internal_GetShaderParameters(IntPtr nativeInstance, out string[] names,
out ShaderParameterType[] types, out bool[] visibility);
}
}