BsMaterialParam.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. #include "BsMaterialParam.h"
  2. #include "BsVector2I.h"
  3. #include "BsVectorNI.h"
  4. #include "BsMaterialParams.h"
  5. namespace BansheeEngine
  6. {
  7. template<class T>
  8. TMaterialDataParam<T, false>::TMaterialDataParam(const String& name, const SPtr<__MaterialParams>& params,
  9. const SPtr<Vector<TGpuDataParam<T, false>>>& gpuParams)
  10. :mParamIndex(0), mArraySize(0), mMaterialParams(nullptr), mGPUParams(gpuParams)
  11. {
  12. if(params != nullptr)
  13. {
  14. const __MaterialParams::ParamData* data = params->getParamData(name, __MaterialParams::ParamType::Data,
  15. __MaterialParams::getDataType(T()), 0);
  16. if(data != nullptr)
  17. {
  18. mMaterialParams = params;
  19. mParamIndex = data->index;
  20. mArraySize = data->arraySize;
  21. }
  22. }
  23. }
  24. template<class T>
  25. void TMaterialDataParam<T, false>::set(const T& value, UINT32 arrayIdx)
  26. {
  27. if (mMaterialParams == nullptr)
  28. return;
  29. if(arrayIdx >= mArraySize)
  30. {
  31. LOGWRN("Array index out of range. Provided index was " + toString(arrayIdx) +
  32. " but array length is " + toString(mArraySize));
  33. return;
  34. }
  35. mMaterialParams->setDataParam(mParamIndex, arrayIdx, value);
  36. if (mGPUParams != nullptr)
  37. {
  38. for (auto& param : *mGPUParams)
  39. param.set(value, arrayIdx);
  40. }
  41. }
  42. template<class T>
  43. T TMaterialDataParam<T, false>::get(UINT32 arrayIdx)
  44. {
  45. T output = T();
  46. if (mMaterialParams == nullptr || arrayIdx >= mArraySize)
  47. return output;
  48. mMaterialParams->getDataParam(mParamIndex, arrayIdx, output);
  49. return output;
  50. }
  51. template<class T>
  52. TMaterialDataParam<T, true>::TMaterialDataParam(const SPtr<Vector<TGpuDataParam<T, true>>>& params)
  53. :mParams(params)
  54. { }
  55. template<class T>
  56. void TMaterialDataParam<T, true>::set(const T& value, UINT32 arrayIdx)
  57. {
  58. if (mParams == nullptr)
  59. return;
  60. for (auto& param : *mParams)
  61. param.set(value, arrayIdx);
  62. }
  63. template<class T>
  64. T TMaterialDataParam<T, true>::get(UINT32 arrayIdx)
  65. {
  66. if (mParams == nullptr || mParams->size() == 0)
  67. return T();
  68. return (*mParams)[0].get(arrayIdx); // They should all have the same value
  69. }
  70. TMaterialParamStruct<false>::TMaterialParamStruct(const String& name, const SPtr<__MaterialParams>& params,
  71. const SPtr<Vector<TGpuParamStruct<false>>>& gpuParams)
  72. :mParamIndex(0), mArraySize(0), mMaterialParams(nullptr), mGPUParams(gpuParams)
  73. {
  74. if (params != nullptr)
  75. {
  76. const __MaterialParams::ParamData* data = params->getParamData(name, __MaterialParams::ParamType::Data,
  77. GPDT_STRUCT, 0);
  78. if (data != nullptr)
  79. {
  80. mMaterialParams = params;
  81. mParamIndex = data->index;
  82. mArraySize = data->arraySize;
  83. }
  84. }
  85. }
  86. void TMaterialParamStruct<false>::set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx)
  87. {
  88. if (mMaterialParams == nullptr)
  89. return;
  90. if (arrayIdx >= mArraySize)
  91. {
  92. LOGWRN("Array index out of range. Provided index was " + toString(arrayIdx) +
  93. " but array length is " + toString(mArraySize));
  94. return;
  95. }
  96. mMaterialParams->setStructData(mParamIndex + arrayIdx, value, sizeBytes);
  97. if (mGPUParams != nullptr)
  98. {
  99. for (auto& param : *mGPUParams)
  100. param.set(value, sizeBytes, arrayIdx);
  101. }
  102. }
  103. void TMaterialParamStruct<false>::get(void* value, UINT32 sizeBytes, UINT32 arrayIdx)
  104. {
  105. if (mMaterialParams == nullptr || arrayIdx >= mArraySize)
  106. return;
  107. mMaterialParams->getStructData(mParamIndex + arrayIdx, value, sizeBytes);
  108. }
  109. UINT32 TMaterialParamStruct<false>::getElementSize() const
  110. {
  111. return mMaterialParams->getStructSize(mParamIndex);
  112. }
  113. TMaterialParamStruct<true>::TMaterialParamStruct(const SPtr<Vector<TGpuParamStruct<true>>>& params)
  114. :mParams(params)
  115. { }
  116. void TMaterialParamStruct<true>::set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx)
  117. {
  118. if (mParams == nullptr)
  119. return;
  120. for (auto& param : *mParams)
  121. param.set(value, sizeBytes, arrayIdx);
  122. }
  123. void TMaterialParamStruct<true>::get(void* value, UINT32 sizeBytes, UINT32 arrayIdx)
  124. {
  125. if (mParams == nullptr || mParams->size() == 0)
  126. {
  127. value = nullptr;
  128. return;
  129. }
  130. return (*mParams)[0].get(value, sizeBytes, arrayIdx); // They should all have the same value
  131. }
  132. UINT32 TMaterialParamStruct<true>::getElementSize() const
  133. {
  134. if (mParams == nullptr || mParams->size() == 0)
  135. return 0;
  136. return (*mParams)[0].getElementSize();
  137. }
  138. TMaterialParamTexture<false>::TMaterialParamTexture(const String& name, const SPtr<__MaterialParams>& params,
  139. const SPtr<Vector<TGpuParamTexture<false>>>& gpuParams)
  140. :mParamIndex(0), mMaterialParams(nullptr), mGPUParams(gpuParams)
  141. {
  142. if (params != nullptr)
  143. {
  144. const __MaterialParams::ParamData* data = params->getParamData(name, __MaterialParams::ParamType::Texture,
  145. GPDT_UNKNOWN, 0);
  146. if (data != nullptr)
  147. {
  148. mMaterialParams = params;
  149. mParamIndex = data->index;
  150. }
  151. }
  152. }
  153. void TMaterialParamTexture<false>::set(const HTexture& texture)
  154. {
  155. if (mMaterialParams == nullptr)
  156. return;
  157. mMaterialParams->setTexture(mParamIndex, texture);
  158. if (mGPUParams != nullptr)
  159. {
  160. for (auto& param : *mGPUParams)
  161. param.set(texture);
  162. }
  163. }
  164. HTexture TMaterialParamTexture<false>::get()
  165. {
  166. HTexture texture;
  167. if (mMaterialParams == nullptr)
  168. return texture;
  169. mMaterialParams->getTexture(mParamIndex, texture);
  170. return texture;
  171. }
  172. TMaterialParamTexture<true>::TMaterialParamTexture(const SPtr<Vector<TGpuParamTexture<true>>>& params)
  173. :mParams(params)
  174. { }
  175. void TMaterialParamTexture<true>::set(const SPtr<TextureCore>& texture)
  176. {
  177. if (mParams == nullptr)
  178. return;
  179. for (auto& param : *mParams)
  180. param.set(texture);
  181. }
  182. SPtr<TextureCore> TMaterialParamTexture<true>::get()
  183. {
  184. if (mParams == nullptr || mParams->size() == 0)
  185. return SPtr<TextureCore>();
  186. return (*mParams)[0].get(); // They should all have the same value
  187. }
  188. TMaterialParamLoadStoreTexture<false>::TMaterialParamLoadStoreTexture(const String& name, const SPtr<__MaterialParams>& params,
  189. const SPtr<Vector<TGpuParamLoadStoreTexture<false>>>& gpuParams)
  190. :mParamIndex(0), mMaterialParams(nullptr), mGPUParams(gpuParams)
  191. {
  192. if (params != nullptr)
  193. {
  194. const __MaterialParams::ParamData* data = params->getParamData(name, __MaterialParams::ParamType::Texture,
  195. GPDT_UNKNOWN, 0);
  196. if (data != nullptr)
  197. {
  198. mMaterialParams = params;
  199. mParamIndex = data->index;
  200. }
  201. }
  202. }
  203. void TMaterialParamLoadStoreTexture<false>::set(const HTexture& texture, const TextureSurface& surface)
  204. {
  205. if (mMaterialParams == nullptr)
  206. return;
  207. mMaterialParams->setLoadStoreTexture(mParamIndex, texture, surface);
  208. if (mGPUParams != nullptr)
  209. {
  210. for (auto& param : *mGPUParams)
  211. param.set(texture, surface);
  212. }
  213. }
  214. HTexture TMaterialParamLoadStoreTexture<false>::get()
  215. {
  216. HTexture texture;
  217. if (mMaterialParams == nullptr)
  218. return texture;
  219. TextureSurface surface;
  220. mMaterialParams->getLoadStoreTexture(mParamIndex, texture, surface);
  221. return texture;
  222. }
  223. TMaterialParamLoadStoreTexture<true>::TMaterialParamLoadStoreTexture(const SPtr<Vector<TGpuParamLoadStoreTexture<true>>>& params)
  224. :mParams(params)
  225. { }
  226. void TMaterialParamLoadStoreTexture<true>::set(const SPtr<TextureCore>& texture, const TextureSurface& surface)
  227. {
  228. if (mParams == nullptr)
  229. return;
  230. for (auto& param : *mParams)
  231. param.set(texture, surface);
  232. }
  233. SPtr<TextureCore> TMaterialParamLoadStoreTexture<true>::get()
  234. {
  235. if (mParams == nullptr || mParams->size() == 0)
  236. return SPtr<TextureCore>();
  237. return (*mParams)[0].get(); // They should all have the same value
  238. }
  239. TMaterialParamSampState<false>::TMaterialParamSampState(const String& name, const SPtr<__MaterialParams>& params,
  240. const SPtr<Vector<TGpuParamSampState<false>>>& gpuParams)
  241. :mParamIndex(0), mMaterialParams(nullptr), mGPUParams(gpuParams)
  242. {
  243. if (params != nullptr)
  244. {
  245. const __MaterialParams::ParamData* data = params->getParamData(name, __MaterialParams::ParamType::Sampler,
  246. GPDT_UNKNOWN, 0);
  247. if (data != nullptr)
  248. {
  249. mMaterialParams = params;
  250. mParamIndex = data->index;
  251. }
  252. }
  253. }
  254. void TMaterialParamSampState<false>::set(const SPtr<SamplerState>& sampState)
  255. {
  256. if (mMaterialParams == nullptr)
  257. return;
  258. mMaterialParams->setSamplerState(mParamIndex, sampState);
  259. if (mGPUParams != nullptr)
  260. {
  261. for (auto& param : *mGPUParams)
  262. param.set(sampState);
  263. }
  264. }
  265. SPtr<SamplerState> TMaterialParamSampState<false>::get()
  266. {
  267. SPtr<SamplerState> samplerState;
  268. if (mMaterialParams == nullptr)
  269. return samplerState;
  270. mMaterialParams->getSamplerState(mParamIndex, samplerState);
  271. return samplerState;
  272. }
  273. TMaterialParamSampState<true>::TMaterialParamSampState(const SPtr<Vector<TGpuParamSampState<true>>>& params)
  274. :mParams(params)
  275. { }
  276. void TMaterialParamSampState<true>::set(const SPtr<SamplerStateCore>& sampState)
  277. {
  278. if (mParams == nullptr)
  279. return;
  280. for (auto& param : *mParams)
  281. param.set(sampState);
  282. }
  283. SPtr<SamplerStateCore> TMaterialParamSampState<true>::get()
  284. {
  285. if (mParams == nullptr || mParams->size() == 0)
  286. return SPtr<SamplerStateCore>();
  287. return (*mParams)[0].get(); // They should all have the same value
  288. }
  289. template class TMaterialDataParam<float, false>;
  290. template class TMaterialDataParam<int, false>;
  291. template class TMaterialDataParam<Color, false>;
  292. template class TMaterialDataParam<Vector2, false>;
  293. template class TMaterialDataParam<Vector3, false>;
  294. template class TMaterialDataParam<Vector4, false>;
  295. template class TMaterialDataParam<Vector2I, false>;
  296. template class TMaterialDataParam<Vector3I, false>;
  297. template class TMaterialDataParam<Vector4I, false>;
  298. template class TMaterialDataParam<Matrix2, false>;
  299. template class TMaterialDataParam<Matrix2x3, false>;
  300. template class TMaterialDataParam<Matrix2x4, false>;
  301. template class TMaterialDataParam<Matrix3, false>;
  302. template class TMaterialDataParam<Matrix3x2, false>;
  303. template class TMaterialDataParam<Matrix3x4, false>;
  304. template class TMaterialDataParam<Matrix4, false>;
  305. template class TMaterialDataParam<Matrix4x2, false>;
  306. template class TMaterialDataParam<Matrix4x3, false>;
  307. template class TMaterialDataParam<float, true>;
  308. template class TMaterialDataParam<int, true>;
  309. template class TMaterialDataParam<Color, true>;
  310. template class TMaterialDataParam<Vector2, true>;
  311. template class TMaterialDataParam<Vector3, true>;
  312. template class TMaterialDataParam<Vector4, true>;
  313. template class TMaterialDataParam<Vector2I, true>;
  314. template class TMaterialDataParam<Vector3I, true>;
  315. template class TMaterialDataParam<Vector4I, true>;
  316. template class TMaterialDataParam<Matrix2, true>;
  317. template class TMaterialDataParam<Matrix2x3, true>;
  318. template class TMaterialDataParam<Matrix2x4, true>;
  319. template class TMaterialDataParam<Matrix3, true>;
  320. template class TMaterialDataParam<Matrix3x2, true>;
  321. template class TMaterialDataParam<Matrix3x4, true>;
  322. template class TMaterialDataParam<Matrix4, true>;
  323. template class TMaterialDataParam<Matrix4x2, true>;
  324. template class TMaterialDataParam<Matrix4x3, true>;
  325. template class TMaterialParamStruct<false>;
  326. template class TMaterialParamStruct<true>;
  327. template class TMaterialParamTexture<false>;
  328. template class TMaterialParamTexture<true>;
  329. template class TMaterialParamLoadStoreTexture<false>;
  330. template class TMaterialParamLoadStoreTexture<true>;
  331. template class TMaterialParamSampState<false>;
  332. template class TMaterialParamSampState<true>;
  333. }