BsMaterialParam.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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. /**
  13. * A handle that allows you to set a Material parameter. Internally keeps a reference to the material parameters so that
  14. * possibly expensive lookup of parameter name can be avoided each time the parameter is accessed, and instead the
  15. * handle can be cached.
  16. *
  17. * @note
  18. * This is pretty much identical to GPU parameter version (for example TGpuDataParam), except that this will get/set
  19. * parameter values on all GPU programs attached to the material, while TGpuDataParam works only for single GPU
  20. * program's parameters. Also, additional parameters that might be optimized out in the GPU program will still exist
  21. * here as long as they're defined in the shader used by the material, which is not the case with TGpuDataParam.
  22. * @note
  23. * For core-thread version of this class no shader-based caching is done, and instead this represents just a wrapper
  24. * for multiple GPU parameters.
  25. *
  26. * @see Material
  27. */
  28. template<class T, bool Core>
  29. class BS_CORE_EXPORT TMaterialDataParam
  30. { };
  31. /** @copydoc TMaterialDataParam */
  32. template<class T>
  33. class BS_CORE_EXPORT TMaterialDataParam<T, false>
  34. {
  35. public:
  36. TMaterialDataParam(const String& name, const SPtr<MaterialParams>& params,
  37. const SPtr<Vector<TGpuDataParam<T, false>>>& gpuParams);
  38. TMaterialDataParam() { }
  39. /** @copydoc TGpuDataParam::set */
  40. void set(const T& value, UINT32 arrayIdx = 0);
  41. /** @copydoc TGpuDataParam::get */
  42. T get(UINT32 arrayIdx = 0);
  43. protected:
  44. UINT32 mParamIndex;
  45. UINT32 mArraySize;
  46. SPtr<MaterialParams> mMaterialParams;
  47. SPtr<Vector<TGpuDataParam<T, false>>> mGPUParams;
  48. };
  49. /** @copydoc TMaterialDataParam */
  50. template<class T>
  51. class BS_CORE_EXPORT TMaterialDataParam<T, true>
  52. {
  53. public:
  54. TMaterialDataParam(const SPtr<Vector<TGpuDataParam<T, true>>>& params);
  55. TMaterialDataParam() { }
  56. /** @copydoc TGpuDataParam::set */
  57. void set(const T& value, UINT32 arrayIdx = 0);
  58. /** @copydoc TGpuDataParam::get */
  59. T get(UINT32 arrayIdx = 0);
  60. protected:
  61. SPtr<Vector<TGpuDataParam<T, true>>> mParams;
  62. };
  63. /** @copydoc TMaterialDataParam */
  64. template<bool Core>
  65. class BS_CORE_EXPORT TMaterialParamStruct
  66. { };
  67. /** @copydoc TMaterialDataParam */
  68. template<>
  69. class BS_CORE_EXPORT TMaterialParamStruct<false>
  70. {
  71. public:
  72. TMaterialParamStruct(const String& name, const SPtr<MaterialParams>& params,
  73. const SPtr<Vector<TGpuParamStruct<false>>>& gpuParams);
  74. TMaterialParamStruct() { }
  75. /** @copydoc TGpuParamStruct::set */
  76. void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0);
  77. /** @copydoc TGpuParamStruct::get */
  78. void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0);
  79. /** @copydoc TGpuParamStruct::getElementSize */
  80. UINT32 getElementSize() const;
  81. protected:
  82. UINT32 mParamIndex;
  83. UINT32 mArraySize;
  84. SPtr<MaterialParams> mMaterialParams;
  85. SPtr<Vector<TGpuParamStruct<false>>> mGPUParams;
  86. };
  87. /** @copydoc TMaterialDataParam */
  88. template<>
  89. class BS_CORE_EXPORT TMaterialParamStruct<true>
  90. {
  91. public:
  92. TMaterialParamStruct(const SPtr<Vector<TGpuParamStruct<true>>>& params);
  93. TMaterialParamStruct() { }
  94. /** @copydoc TGpuParamStruct::set */
  95. void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0);
  96. /** @copydoc TGpuParamStruct::get */
  97. void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0);
  98. /** @copydoc TGpuParamStruct::getElementSize */
  99. UINT32 getElementSize() const;
  100. protected:
  101. SPtr<Vector<TGpuParamStruct<true>>> mParams;
  102. };
  103. /** @copydoc TMaterialDataParam */
  104. template<bool Core>
  105. class BS_CORE_EXPORT TMaterialParamTexture
  106. { };
  107. /** @copydoc TMaterialDataParam */
  108. template<>
  109. class BS_CORE_EXPORT TMaterialParamTexture<false>
  110. {
  111. public:
  112. TMaterialParamTexture(const String& name, const SPtr<MaterialParams>& params,
  113. const SPtr<Vector<TGpuParamTexture<false>>>& gpuParams);
  114. TMaterialParamTexture() { }
  115. /** @copydoc GpuParamTexture::set */
  116. void set(const HTexture& texture);
  117. /** @copydoc GpuParamTexture::get */
  118. HTexture get();
  119. protected:
  120. UINT32 mParamIndex;
  121. SPtr<MaterialParams> mMaterialParams;
  122. SPtr<Vector<TGpuParamTexture<false>>> mGPUParams;
  123. };
  124. /** @copydoc TMaterialDataParam */
  125. template<>
  126. class BS_CORE_EXPORT TMaterialParamTexture<true>
  127. {
  128. public:
  129. TMaterialParamTexture(const SPtr<Vector<TGpuParamTexture<true>>>& params);
  130. TMaterialParamTexture() { }
  131. /** @copydoc GpuParamTexture::set */
  132. void set(const SPtr<TextureCore>& texture);
  133. /** @copydoc GpuParamTexture::get */
  134. SPtr<TextureCore> get();
  135. protected:
  136. SPtr<Vector<TGpuParamTexture<true>>> mParams;
  137. };
  138. /** @copydoc TMaterialDataParam */
  139. template<bool Core>
  140. class BS_CORE_EXPORT TMaterialParamLoadStoreTexture
  141. { };
  142. /** @copydoc TMaterialDataParam */
  143. template<>
  144. class BS_CORE_EXPORT TMaterialParamLoadStoreTexture<false>
  145. {
  146. public:
  147. TMaterialParamLoadStoreTexture(const String& name, const SPtr<MaterialParams>& params,
  148. const SPtr<Vector<TGpuParamLoadStoreTexture<false>>>& gpuParams);
  149. TMaterialParamLoadStoreTexture() { }
  150. /** @copydoc GpuParamLoadStoreTexture::set */
  151. void set(const HTexture& texture, const TextureSurface& surface);
  152. /** @copydoc GpuParamLoadStoreTexture::get */
  153. HTexture get();
  154. protected:
  155. UINT32 mParamIndex;
  156. SPtr<MaterialParams> mMaterialParams;
  157. SPtr<Vector<TGpuParamLoadStoreTexture<false>>> mGPUParams;
  158. };
  159. /** @copydoc TMaterialDataParam */
  160. template<>
  161. class BS_CORE_EXPORT TMaterialParamLoadStoreTexture<true>
  162. {
  163. public:
  164. TMaterialParamLoadStoreTexture(const SPtr<Vector<TGpuParamLoadStoreTexture<true>>>& params);
  165. TMaterialParamLoadStoreTexture() { }
  166. /** @copydoc GpuParamLoadStoreTexture::set */
  167. void set(const SPtr<TextureCore>& texture, const TextureSurface& surface);
  168. /** @copydoc GpuParamLoadStoreTexture::get */
  169. SPtr<TextureCore> get();
  170. protected:
  171. SPtr<Vector<TGpuParamLoadStoreTexture<true>>> mParams;
  172. };
  173. /** @copydoc TMaterialDataParam */
  174. template<bool Core>
  175. class BS_CORE_EXPORT TMaterialParamSampState
  176. { };
  177. /** @copydoc TMaterialDataParam */
  178. template<>
  179. class BS_CORE_EXPORT TMaterialParamSampState<false>
  180. {
  181. public:
  182. TMaterialParamSampState(const String& name, const SPtr<MaterialParams>& params,
  183. const SPtr<Vector<TGpuParamSampState<false>>>& gpuParams);
  184. TMaterialParamSampState() { }
  185. /** @copydoc GpuParamSampState::set */
  186. void set(const SPtr<SamplerState>& sampState);
  187. /** @copydoc GpuParamSampState::get */
  188. SPtr<SamplerState> get();
  189. protected:
  190. UINT32 mParamIndex;
  191. SPtr<MaterialParams> mMaterialParams;
  192. SPtr<Vector<TGpuParamSampState<false>>> mGPUParams;
  193. };
  194. /** @copydoc TMaterialDataParam */
  195. template<>
  196. class BS_CORE_EXPORT TMaterialParamSampState<true>
  197. {
  198. public:
  199. TMaterialParamSampState(const SPtr<Vector<TGpuParamSampState<true>>>& params);
  200. TMaterialParamSampState() { }
  201. /** @copydoc GpuParamSampState::set */
  202. void set(const SPtr<SamplerStateCore>& sampState);
  203. /** @copydoc GpuParamSampState::get */
  204. SPtr<SamplerStateCore> get();
  205. protected:
  206. SPtr<Vector<TGpuParamSampState<true>>> mParams;
  207. };
  208. /** @} */
  209. /** @addtogroup Material
  210. * @{
  211. */
  212. typedef TMaterialDataParam<float, false> MaterialParamFloat;
  213. typedef TMaterialDataParam<Vector2, false> MaterialParamVec2;
  214. typedef TMaterialDataParam<Vector3, false> MaterialParamVec3;
  215. typedef TMaterialDataParam<Vector4, false> MaterialParamVec4;
  216. typedef TMaterialDataParam<int, false> MaterialParamInt;
  217. typedef TMaterialDataParam<Vector2I, false> MaterialParamVec2I;
  218. typedef TMaterialDataParam<Vector3I, false> MaterialParamVec3I;
  219. typedef TMaterialDataParam<Vector4I, false> MaterialParamVec4I;
  220. typedef TMaterialDataParam<Matrix3, false> MaterialParamMat3;
  221. typedef TMaterialDataParam<Matrix4, false> MaterialParamMat4;
  222. typedef TMaterialDataParam<Color, false> MaterialParamColor;
  223. typedef TMaterialDataParam<float, true> MaterialParamFloatCore;
  224. typedef TMaterialDataParam<Vector2, true> MaterialParamVec2Core;
  225. typedef TMaterialDataParam<Vector3, true> MaterialParamVec3Core;
  226. typedef TMaterialDataParam<Vector4, true> MaterialParamVec4Core;
  227. typedef TMaterialDataParam<int, true> MaterialParamIntCore;
  228. typedef TMaterialDataParam<Vector2I, true> MaterialParamVec2ICore;
  229. typedef TMaterialDataParam<Vector3I, true> MaterialParamVec3ICore;
  230. typedef TMaterialDataParam<Vector4I, true> MaterialParamVec4ICore;
  231. typedef TMaterialDataParam<Matrix3, true> MaterialParamMat3Core;
  232. typedef TMaterialDataParam<Matrix4, true> MaterialParamMat4Core;
  233. typedef TMaterialDataParam<Color, true> MaterialParamColorCore;
  234. typedef TMaterialParamStruct<false> MaterialParamStruct;
  235. typedef TMaterialParamStruct<true> MaterialParamStructCore;
  236. typedef TMaterialParamTexture<false> MaterialParamTexture;
  237. typedef TMaterialParamTexture<true> MaterialParamTextureCore;
  238. typedef TMaterialParamLoadStoreTexture<false> MaterialParamLoadStoreTexture;
  239. typedef TMaterialParamLoadStoreTexture<true> MaterialParamLoadStoreTextureCore;
  240. typedef TMaterialParamSampState<false> MaterialParamSampState;
  241. typedef TMaterialParamSampState<true> MaterialParamSampStateCore;
  242. /** @} */
  243. }