Shader.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System;
  4. using System.Runtime.CompilerServices;
  5. namespace BansheeEngine
  6. {
  7. /// <summary>
  8. /// Type of parameters that can be defined in a shader.
  9. /// </summary>
  10. public enum ShaderParameterType // Note: Must match C++ ShaderParameterType enum
  11. {
  12. Float, Vector2, Vector3, Vector4, Color,
  13. Matrix3, Matrix4, Texture2D,
  14. Texture3D, TextureCube, Sampler
  15. }
  16. /// <summary>
  17. /// Contains information about a shader parameter.
  18. /// </summary>
  19. public struct ShaderParameter
  20. {
  21. /// <summary>
  22. /// Returns the name of the parameter variable.
  23. /// </summary>
  24. public string Name { get { return name; } }
  25. /// <summary>
  26. /// Returns the data type of the parameter.
  27. /// </summary>
  28. public ShaderParameterType Type { get { return type; } }
  29. /// <summary>
  30. /// Determines is parameter managed internally be the renderer, or is it expected to be set by the user.
  31. /// </summary>
  32. public bool Internal { get { return isInternal; } }
  33. private string name;
  34. private ShaderParameterType type;
  35. private bool isInternal;
  36. /// <summary>
  37. /// Creates a new shader parameter.
  38. /// </summary>
  39. /// <param name="name">Name of the parameter variable.</param>
  40. /// <param name="type">Data type of the parameter.</param>
  41. /// <param name="isInternal">Determines is parameter managed internally be the renderer, or is expected to be set
  42. /// by the user.</param>
  43. internal ShaderParameter(string name, ShaderParameterType type, bool isInternal)
  44. {
  45. this.name = name;
  46. this.type = type;
  47. this.isInternal = isInternal;
  48. }
  49. }
  50. /// <summary>
  51. /// Contains definitions of GPU programs used for rendering, as well as a set of global parameters to control those
  52. /// programs.
  53. /// </summary>
  54. public class Shader : Resource
  55. {
  56. /// <summary>
  57. /// Constuctor for internal runtime use only.
  58. /// </summary>
  59. private Shader()
  60. { }
  61. /// <summary>
  62. /// Returns data about all parameters available in the shader.
  63. /// </summary>
  64. public ShaderParameter[] Parameters
  65. {
  66. get
  67. {
  68. string[] names;
  69. ShaderParameterType[] types;
  70. bool[] visibility;
  71. Internal_GetShaderParameters(mCachedPtr, out names, out types, out visibility);
  72. ShaderParameter[] parameters = new ShaderParameter[names.Length];
  73. for (int i = 0; i < names.Length; i++)
  74. {
  75. parameters[i] = new ShaderParameter(names[i], types[i], visibility[i]);
  76. }
  77. return parameters;
  78. }
  79. }
  80. [MethodImpl(MethodImplOptions.InternalCall)]
  81. private static extern void Internal_GetShaderParameters(IntPtr nativeInstance, out string[] names,
  82. out ShaderParameterType[] types, out bool[] visibility);
  83. }
  84. }