BsMaterialParam.cpp 12 KB

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