BsMaterialParam.h 8.7 KB

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