BsMaterialParam.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsGpuParam.h"
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup Implementation
  9. * @{
  10. */
  11. class MaterialParams;
  12. class MaterialParamsCore;
  13. template<bool Core> struct TMaterialParamsType { };
  14. template<> struct TMaterialParamsType<false> { typedef MaterialParams Type; };
  15. template<> struct TMaterialParamsType<true> { typedef MaterialParamsCore Type; };
  16. /**
  17. * A handle that allows you to set a Material parameter. Internally keeps a reference to the material parameters so that
  18. * possibly expensive lookup of parameter name can be avoided each time the parameter is accessed, and instead the
  19. * handle can be cached.
  20. *
  21. * @note
  22. * This is pretty much identical to GPU parameter version (for example TGpuDataParam), except that this will get/set
  23. * parameter values on all GPU programs attached to the material, while TGpuDataParam works only for single GPU
  24. * program's parameters. Also, additional parameters that might be optimized out in the GPU program will still exist
  25. * here as long as they're defined in the shader used by the material, which is not the case with TGpuDataParam.
  26. * @note
  27. * For core-thread version of this class no shader-based caching is done, and instead this represents just a wrapper
  28. * for multiple GPU parameters.
  29. *
  30. * @see Material
  31. */
  32. template<class T, bool Core>
  33. class BS_CORE_EXPORT TMaterialDataParam
  34. {
  35. typedef typename TMaterialParamsType<Core>::Type MaterialParamsType;
  36. public:
  37. TMaterialDataParam(const String& name, const SPtr<MaterialParamsType>& params);
  38. TMaterialDataParam() { }
  39. /** @copydoc TGpuDataParam::set */
  40. void set(const T& value, UINT32 arrayIdx = 0) const;
  41. /** @copydoc TGpuDataParam::get */
  42. T get(UINT32 arrayIdx = 0) const;
  43. /** Checks if param is initialized. */
  44. bool operator==(const nullptr_t& nullval) const
  45. {
  46. return mMaterialParams == nullptr;
  47. }
  48. protected:
  49. UINT32 mParamIndex;
  50. UINT32 mArraySize;
  51. SPtr<MaterialParamsType> mMaterialParams;
  52. };
  53. /** @copydoc TMaterialDataParam */
  54. template<bool Core>
  55. class BS_CORE_EXPORT TMaterialParamStruct
  56. {
  57. typedef typename TMaterialParamsType<Core>::Type MaterialParamsType;
  58. public:
  59. TMaterialParamStruct(const String& name, const SPtr<MaterialParamsType>& params);
  60. TMaterialParamStruct() { }
  61. /** @copydoc TGpuParamStruct::set */
  62. void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const;
  63. /** @copydoc TGpuParamStruct::get */
  64. void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const;
  65. /** @copydoc TGpuParamStruct::getElementSize */
  66. UINT32 getElementSize() const;
  67. /** Checks if param is initialized. */
  68. bool operator==(const nullptr_t& nullval) const
  69. {
  70. return mMaterialParams == nullptr;
  71. }
  72. protected:
  73. UINT32 mParamIndex;
  74. UINT32 mArraySize;
  75. SPtr<MaterialParamsType> mMaterialParams;
  76. };
  77. /** @copydoc TMaterialDataParam */
  78. template<bool Core>
  79. class BS_CORE_EXPORT TMaterialParamTexture
  80. {
  81. typedef typename TMaterialParamsType<Core>::Type MaterialParamsType;
  82. typedef typename TGpuParamTextureType<Core>::Type TextureType;
  83. public:
  84. TMaterialParamTexture(const String& name, const SPtr<MaterialParamsType>& params);
  85. TMaterialParamTexture() { }
  86. /** @copydoc GpuParamTexture::set */
  87. void set(const TextureType& texture) const;
  88. /** @copydoc GpuParamTexture::get */
  89. TextureType get() const;
  90. /** Checks if param is initialized. */
  91. bool operator==(const nullptr_t& nullval) const
  92. {
  93. return mMaterialParams == nullptr;
  94. }
  95. protected:
  96. UINT32 mParamIndex;
  97. SPtr<MaterialParamsType> mMaterialParams;
  98. };
  99. /** @copydoc TMaterialDataParam */
  100. template<bool Core>
  101. class BS_CORE_EXPORT TMaterialParamLoadStoreTexture
  102. {
  103. typedef typename TMaterialParamsType<Core>::Type MaterialParamsType;
  104. typedef typename TGpuParamTextureType<Core>::Type TextureType;
  105. public:
  106. TMaterialParamLoadStoreTexture(const String& name, const SPtr<MaterialParamsType>& params);
  107. TMaterialParamLoadStoreTexture() { }
  108. /** @copydoc GpuParamLoadStoreTexture::set */
  109. void set(const TextureType& texture, const TextureSurface& surface = TextureSurface()) const;
  110. /** @copydoc GpuParamLoadStoreTexture::get */
  111. TextureType get() const;
  112. /** Checks if param is initialized. */
  113. bool operator==(const nullptr_t& nullval) const
  114. {
  115. return mMaterialParams == nullptr;
  116. }
  117. protected:
  118. UINT32 mParamIndex;
  119. SPtr<MaterialParamsType> mMaterialParams;
  120. };
  121. /** @copydoc TMaterialDataParam */
  122. template<bool Core>
  123. class BS_CORE_EXPORT TMaterialParamBuffer
  124. {
  125. typedef typename TMaterialParamsType<Core>::Type MaterialParamsType;
  126. typedef typename TGpuBufferType<Core>::Type BufferType;
  127. public:
  128. TMaterialParamBuffer(const String& name, const SPtr<MaterialParamsType>& params);
  129. TMaterialParamBuffer() { }
  130. /** @copydoc GpuParamBuffer::set */
  131. void set(const BufferType& buffer) const;
  132. /** @copydoc GpuParamBuffer::get */
  133. BufferType get() const;
  134. /** Checks if param is initialized. */
  135. bool operator==(const nullptr_t& nullval) const
  136. {
  137. return mMaterialParams == nullptr;
  138. }
  139. protected:
  140. UINT32 mParamIndex;
  141. SPtr<MaterialParamsType> mMaterialParams;
  142. };
  143. /** @copydoc TMaterialDataParam */
  144. template<bool Core>
  145. class BS_CORE_EXPORT TMaterialParamSampState
  146. {
  147. typedef typename TMaterialParamsType<Core>::Type MaterialParamsType;
  148. typedef typename TGpuParamSamplerStateType<Core>::Type SamplerStateType;
  149. public:
  150. TMaterialParamSampState(const String& name, const SPtr<MaterialParamsType>& params);
  151. TMaterialParamSampState() { }
  152. /** @copydoc GpuParamSampState::set */
  153. void set(const SamplerStateType& sampState) const;
  154. /** @copydoc GpuParamSampState::get */
  155. SamplerStateType get() const;
  156. /** Checks if param is initialized. */
  157. bool operator==(const nullptr_t& nullval) const
  158. {
  159. return mMaterialParams == nullptr;
  160. }
  161. protected:
  162. UINT32 mParamIndex;
  163. SPtr<MaterialParamsType> mMaterialParams;
  164. };
  165. /** @} */
  166. /** @addtogroup Material
  167. * @{
  168. */
  169. typedef TMaterialDataParam<float, false> MaterialParamFloat;
  170. typedef TMaterialDataParam<Vector2, false> MaterialParamVec2;
  171. typedef TMaterialDataParam<Vector3, false> MaterialParamVec3;
  172. typedef TMaterialDataParam<Vector4, false> MaterialParamVec4;
  173. typedef TMaterialDataParam<int, false> MaterialParamInt;
  174. typedef TMaterialDataParam<Vector2I, false> MaterialParamVec2I;
  175. typedef TMaterialDataParam<Vector3I, false> MaterialParamVec3I;
  176. typedef TMaterialDataParam<Vector4I, false> MaterialParamVec4I;
  177. typedef TMaterialDataParam<Matrix3, false> MaterialParamMat3;
  178. typedef TMaterialDataParam<Matrix4, false> MaterialParamMat4;
  179. typedef TMaterialDataParam<Color, false> MaterialParamColor;
  180. typedef TMaterialDataParam<float, true> MaterialParamFloatCore;
  181. typedef TMaterialDataParam<Vector2, true> MaterialParamVec2Core;
  182. typedef TMaterialDataParam<Vector3, true> MaterialParamVec3Core;
  183. typedef TMaterialDataParam<Vector4, true> MaterialParamVec4Core;
  184. typedef TMaterialDataParam<int, true> MaterialParamIntCore;
  185. typedef TMaterialDataParam<Vector2I, true> MaterialParamVec2ICore;
  186. typedef TMaterialDataParam<Vector3I, true> MaterialParamVec3ICore;
  187. typedef TMaterialDataParam<Vector4I, true> MaterialParamVec4ICore;
  188. typedef TMaterialDataParam<Matrix3, true> MaterialParamMat3Core;
  189. typedef TMaterialDataParam<Matrix4, true> MaterialParamMat4Core;
  190. typedef TMaterialDataParam<Color, true> MaterialParamColorCore;
  191. typedef TMaterialParamStruct<false> MaterialParamStruct;
  192. typedef TMaterialParamStruct<true> MaterialParamStructCore;
  193. typedef TMaterialParamTexture<false> MaterialParamTexture;
  194. typedef TMaterialParamTexture<true> MaterialParamTextureCore;
  195. typedef TMaterialParamLoadStoreTexture<false> MaterialParamLoadStoreTexture;
  196. typedef TMaterialParamLoadStoreTexture<true> MaterialParamLoadStoreTextureCore;
  197. typedef TMaterialParamBuffer<false> MaterialParamBuffer;
  198. typedef TMaterialParamBuffer<true> MaterialParamBufferCore;
  199. typedef TMaterialParamSampState<false> MaterialParamSampState;
  200. typedef TMaterialParamSampState<true> MaterialParamSampStateCore;
  201. /** @} */
  202. }