BsMaterialParam.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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 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) 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 mGPUParams == nullptr;
  47. }
  48. protected:
  49. UINT32 mParamIndex;
  50. UINT32 mArraySize;
  51. SPtr<MaterialParams> mMaterialParams;
  52. SPtr<Vector<TGpuDataParam<T, false>>> mGPUParams;
  53. };
  54. /** @copydoc TMaterialDataParam */
  55. template<class T>
  56. class TMaterialDataParam<T, true>
  57. {
  58. public:
  59. TMaterialDataParam(const SPtr<Vector<TGpuDataParam<T, true>>>& params);
  60. TMaterialDataParam() { }
  61. /** @copydoc TGpuDataParam::set */
  62. void set(const T& value, UINT32 arrayIdx = 0) const;
  63. /** @copydoc TGpuDataParam::get */
  64. T get(UINT32 arrayIdx = 0) const;
  65. /** Checks if param is initialized. */
  66. bool operator==(const nullptr_t& nullval) const
  67. {
  68. return mParams == nullptr;
  69. }
  70. protected:
  71. SPtr<Vector<TGpuDataParam<T, true>>> mParams;
  72. };
  73. /** @copydoc TMaterialDataParam */
  74. template<bool Core>
  75. class BS_CORE_EXPORT TMaterialParamStruct
  76. { };
  77. /** @copydoc TMaterialDataParam */
  78. template<>
  79. class BS_CORE_EXPORT TMaterialParamStruct<false>
  80. {
  81. public:
  82. TMaterialParamStruct(const String& name, const SPtr<MaterialParams>& params,
  83. const SPtr<Vector<TGpuParamStruct<false>>>& gpuParams);
  84. TMaterialParamStruct() { }
  85. /** @copydoc TGpuParamStruct::set */
  86. void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const;
  87. /** @copydoc TGpuParamStruct::get */
  88. void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const;
  89. /** @copydoc TGpuParamStruct::getElementSize */
  90. UINT32 getElementSize() const;
  91. /** Checks if param is initialized. */
  92. bool operator==(const nullptr_t& nullval) const
  93. {
  94. return mGPUParams == nullptr;
  95. }
  96. protected:
  97. UINT32 mParamIndex;
  98. UINT32 mArraySize;
  99. SPtr<MaterialParams> mMaterialParams;
  100. SPtr<Vector<TGpuParamStruct<false>>> mGPUParams;
  101. };
  102. /** @copydoc TMaterialDataParam */
  103. template<>
  104. class BS_CORE_EXPORT TMaterialParamStruct<true>
  105. {
  106. public:
  107. TMaterialParamStruct(const SPtr<Vector<TGpuParamStruct<true>>>& params);
  108. TMaterialParamStruct() { }
  109. /** @copydoc TGpuParamStruct::set */
  110. void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const;
  111. /** @copydoc TGpuParamStruct::get */
  112. void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const;
  113. /** @copydoc TGpuParamStruct::getElementSize */
  114. UINT32 getElementSize() const;
  115. /** Checks if param is initialized. */
  116. bool operator==(const nullptr_t& nullval) const
  117. {
  118. return mParams == nullptr;
  119. }
  120. protected:
  121. SPtr<Vector<TGpuParamStruct<true>>> mParams;
  122. };
  123. /** @copydoc TMaterialDataParam */
  124. template<bool Core>
  125. class BS_CORE_EXPORT TMaterialParamTexture
  126. { };
  127. /** @copydoc TMaterialDataParam */
  128. template<>
  129. class BS_CORE_EXPORT TMaterialParamTexture<false>
  130. {
  131. public:
  132. TMaterialParamTexture(const String& name, const SPtr<MaterialParams>& params,
  133. const SPtr<Vector<TGpuParamTexture<false>>>& gpuParams);
  134. TMaterialParamTexture() { }
  135. /** @copydoc GpuParamTexture::set */
  136. void set(const HTexture& texture) const;
  137. /** @copydoc GpuParamTexture::get */
  138. HTexture get() const;
  139. /** Checks if param is initialized. */
  140. bool operator==(const nullptr_t& nullval) const
  141. {
  142. return mGPUParams == nullptr;
  143. }
  144. protected:
  145. UINT32 mParamIndex;
  146. SPtr<MaterialParams> mMaterialParams;
  147. SPtr<Vector<TGpuParamTexture<false>>> mGPUParams;
  148. };
  149. /** @copydoc TMaterialDataParam */
  150. template<>
  151. class BS_CORE_EXPORT TMaterialParamTexture<true>
  152. {
  153. public:
  154. TMaterialParamTexture(const SPtr<Vector<TGpuParamTexture<true>>>& params);
  155. TMaterialParamTexture() { }
  156. /** @copydoc GpuParamTexture::set */
  157. void set(const SPtr<TextureCore>& texture) const;
  158. /** @copydoc GpuParamTexture::get */
  159. SPtr<TextureCore> get() const;
  160. /** Checks if param is initialized. */
  161. bool operator==(const nullptr_t& nullval) const
  162. {
  163. return mParams == nullptr;
  164. }
  165. protected:
  166. SPtr<Vector<TGpuParamTexture<true>>> mParams;
  167. };
  168. /** @copydoc TMaterialDataParam */
  169. template<bool Core>
  170. class BS_CORE_EXPORT TMaterialParamLoadStoreTexture
  171. { };
  172. /** @copydoc TMaterialDataParam */
  173. template<>
  174. class BS_CORE_EXPORT TMaterialParamLoadStoreTexture<false>
  175. {
  176. public:
  177. TMaterialParamLoadStoreTexture(const String& name, const SPtr<MaterialParams>& params,
  178. const SPtr<Vector<TGpuParamLoadStoreTexture<false>>>& gpuParams);
  179. TMaterialParamLoadStoreTexture() { }
  180. /** @copydoc GpuParamLoadStoreTexture::set */
  181. void set(const HTexture& texture, const TextureSurface& surface) const;
  182. /** @copydoc GpuParamLoadStoreTexture::get */
  183. HTexture get() const;
  184. /** Checks if param is initialized. */
  185. bool operator==(const nullptr_t& nullval) const
  186. {
  187. return mGPUParams == nullptr;
  188. }
  189. protected:
  190. UINT32 mParamIndex;
  191. SPtr<MaterialParams> mMaterialParams;
  192. SPtr<Vector<TGpuParamLoadStoreTexture<false>>> mGPUParams;
  193. };
  194. /** @copydoc TMaterialDataParam */
  195. template<>
  196. class BS_CORE_EXPORT TMaterialParamLoadStoreTexture<true>
  197. {
  198. public:
  199. TMaterialParamLoadStoreTexture(const SPtr<Vector<TGpuParamLoadStoreTexture<true>>>& params);
  200. TMaterialParamLoadStoreTexture() { }
  201. /** @copydoc GpuParamLoadStoreTexture::set */
  202. void set(const SPtr<TextureCore>& texture, const TextureSurface& surface = TextureSurface()) const;
  203. /** @copydoc GpuParamLoadStoreTexture::get */
  204. SPtr<TextureCore> get() const;
  205. /** Checks if param is initialized. */
  206. bool operator==(const nullptr_t& nullval) const
  207. {
  208. return mParams == nullptr;
  209. }
  210. protected:
  211. SPtr<Vector<TGpuParamLoadStoreTexture<true>>> mParams;
  212. };
  213. /** @copydoc TMaterialDataParam */
  214. template<bool Core>
  215. class BS_CORE_EXPORT TMaterialParamBuffer
  216. { };
  217. /** @copydoc TMaterialDataParam */
  218. template<>
  219. class BS_CORE_EXPORT TMaterialParamBuffer<false>
  220. {
  221. public:
  222. TMaterialParamBuffer(const String& name, const SPtr<MaterialParams>& params,
  223. const SPtr<Vector<TGpuParamBuffer<false>>>& gpuParams);
  224. TMaterialParamBuffer() { }
  225. /** @copydoc GpuParamBuffer::set */
  226. void set(const SPtr<GpuBuffer>& buffer) const;
  227. /** @copydoc GpuParamBuffer::get */
  228. SPtr<GpuBuffer> get() const;
  229. /** Checks if param is initialized. */
  230. bool operator==(const nullptr_t& nullval) const
  231. {
  232. return mGPUParams == nullptr;
  233. }
  234. protected:
  235. UINT32 mParamIndex;
  236. SPtr<MaterialParams> mMaterialParams;
  237. SPtr<Vector<TGpuParamBuffer<false>>> mGPUParams;
  238. };
  239. /** @copydoc TMaterialDataParam */
  240. template<>
  241. class BS_CORE_EXPORT TMaterialParamBuffer<true>
  242. {
  243. public:
  244. TMaterialParamBuffer(const SPtr<Vector<TGpuParamBuffer<true>>>& params);
  245. TMaterialParamBuffer() { }
  246. /** @copydoc GpuParamBuffer::set */
  247. void set(const SPtr<GpuBufferCore>& buffer) const;
  248. /** @copydoc GpuParamBuffer::get */
  249. SPtr<GpuBufferCore> get() const;
  250. /** Checks if param is initialized. */
  251. bool operator==(const nullptr_t& nullval) const
  252. {
  253. return mParams == nullptr;
  254. }
  255. protected:
  256. SPtr<Vector<TGpuParamBuffer<true>>> mParams;
  257. };
  258. /** @copydoc TMaterialDataParam */
  259. template<bool Core>
  260. class BS_CORE_EXPORT TMaterialParamSampState
  261. { };
  262. /** @copydoc TMaterialDataParam */
  263. template<>
  264. class BS_CORE_EXPORT TMaterialParamSampState<false>
  265. {
  266. public:
  267. TMaterialParamSampState(const String& name, const SPtr<MaterialParams>& params,
  268. const SPtr<Vector<TGpuParamSampState<false>>>& gpuParams);
  269. TMaterialParamSampState() { }
  270. /** @copydoc GpuParamSampState::set */
  271. void set(const SPtr<SamplerState>& sampState) const;
  272. /** @copydoc GpuParamSampState::get */
  273. SPtr<SamplerState> get() const;
  274. /** Checks if param is initialized. */
  275. bool operator==(const nullptr_t& nullval) const
  276. {
  277. return mGPUParams == nullptr;
  278. }
  279. protected:
  280. UINT32 mParamIndex;
  281. SPtr<MaterialParams> mMaterialParams;
  282. SPtr<Vector<TGpuParamSampState<false>>> mGPUParams;
  283. };
  284. /** @copydoc TMaterialDataParam */
  285. template<>
  286. class BS_CORE_EXPORT TMaterialParamSampState<true>
  287. {
  288. public:
  289. TMaterialParamSampState(const SPtr<Vector<TGpuParamSampState<true>>>& params);
  290. TMaterialParamSampState() { }
  291. /** @copydoc GpuParamSampState::set */
  292. void set(const SPtr<SamplerStateCore>& sampState) const;
  293. /** @copydoc GpuParamSampState::get */
  294. SPtr<SamplerStateCore> get() const;
  295. /** Checks if param is initialized. */
  296. bool operator==(const nullptr_t& nullval) const
  297. {
  298. return mParams == nullptr;
  299. }
  300. protected:
  301. SPtr<Vector<TGpuParamSampState<true>>> mParams;
  302. };
  303. /** @} */
  304. /** @addtogroup Material
  305. * @{
  306. */
  307. typedef TMaterialDataParam<float, false> MaterialParamFloat;
  308. typedef TMaterialDataParam<Vector2, false> MaterialParamVec2;
  309. typedef TMaterialDataParam<Vector3, false> MaterialParamVec3;
  310. typedef TMaterialDataParam<Vector4, false> MaterialParamVec4;
  311. typedef TMaterialDataParam<int, false> MaterialParamInt;
  312. typedef TMaterialDataParam<Vector2I, false> MaterialParamVec2I;
  313. typedef TMaterialDataParam<Vector3I, false> MaterialParamVec3I;
  314. typedef TMaterialDataParam<Vector4I, false> MaterialParamVec4I;
  315. typedef TMaterialDataParam<Matrix3, false> MaterialParamMat3;
  316. typedef TMaterialDataParam<Matrix4, false> MaterialParamMat4;
  317. typedef TMaterialDataParam<Color, false> MaterialParamColor;
  318. typedef TMaterialDataParam<float, true> MaterialParamFloatCore;
  319. typedef TMaterialDataParam<Vector2, true> MaterialParamVec2Core;
  320. typedef TMaterialDataParam<Vector3, true> MaterialParamVec3Core;
  321. typedef TMaterialDataParam<Vector4, true> MaterialParamVec4Core;
  322. typedef TMaterialDataParam<int, true> MaterialParamIntCore;
  323. typedef TMaterialDataParam<Vector2I, true> MaterialParamVec2ICore;
  324. typedef TMaterialDataParam<Vector3I, true> MaterialParamVec3ICore;
  325. typedef TMaterialDataParam<Vector4I, true> MaterialParamVec4ICore;
  326. typedef TMaterialDataParam<Matrix3, true> MaterialParamMat3Core;
  327. typedef TMaterialDataParam<Matrix4, true> MaterialParamMat4Core;
  328. typedef TMaterialDataParam<Color, true> MaterialParamColorCore;
  329. typedef TMaterialParamStruct<false> MaterialParamStruct;
  330. typedef TMaterialParamStruct<true> MaterialParamStructCore;
  331. typedef TMaterialParamTexture<false> MaterialParamTexture;
  332. typedef TMaterialParamTexture<true> MaterialParamTextureCore;
  333. typedef TMaterialParamLoadStoreTexture<false> MaterialParamLoadStoreTexture;
  334. typedef TMaterialParamLoadStoreTexture<true> MaterialParamLoadStoreTextureCore;
  335. typedef TMaterialParamBuffer<false> MaterialParamBuffer;
  336. typedef TMaterialParamBuffer<true> MaterialParamBufferCore;
  337. typedef TMaterialParamSampState<false> MaterialParamSampState;
  338. typedef TMaterialParamSampState<true> MaterialParamSampStateCore;
  339. /** @} */
  340. }