BsMaterialParam.cpp 11 KB

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