BsMaterialRTTI.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsVector2.h"
  5. #include "BsVector3.h"
  6. #include "BsVector4.h"
  7. #include "BsMatrix3.h"
  8. #include "BsMatrix4.h"
  9. #include "BsMaterial.h"
  10. #include "BsGpuParams.h"
  11. #include "BsShader.h"
  12. #include "BsDebug.h"
  13. #include "BsException.h"
  14. namespace BansheeEngine
  15. {
  16. /************************************************************************/
  17. /* HELPER STRUCTS TO HELP SERIALIZING */
  18. /************************************************************************/
  19. class BS_CORE_EXPORT MaterialFloatParam : public IReflectable
  20. {
  21. public:
  22. String name;
  23. float value;
  24. UINT32 arrayIdx;
  25. friend class MaterialFloatParamRTTI;
  26. static RTTITypeBase* getRTTIStatic();
  27. virtual RTTITypeBase* getRTTI() const;
  28. };
  29. class BS_CORE_EXPORT MaterialVec2Param : public IReflectable
  30. {
  31. public:
  32. String name;
  33. Vector2 value;
  34. UINT32 arrayIdx;
  35. friend class MaterialVec2ParamRTTI;
  36. static RTTITypeBase* getRTTIStatic();
  37. virtual RTTITypeBase* getRTTI() const;
  38. };
  39. class BS_CORE_EXPORT MaterialVec3Param : public IReflectable
  40. {
  41. public:
  42. String name;
  43. Vector3 value;
  44. UINT32 arrayIdx;
  45. friend class MaterialVec3ParamRTTI;
  46. static RTTITypeBase* getRTTIStatic();
  47. virtual RTTITypeBase* getRTTI() const;
  48. };
  49. class BS_CORE_EXPORT MaterialVec4Param : public IReflectable
  50. {
  51. public:
  52. String name;
  53. Vector4 value;
  54. UINT32 arrayIdx;
  55. friend class MaterialVec4ParamRTTI;
  56. static RTTITypeBase* getRTTIStatic();
  57. virtual RTTITypeBase* getRTTI() const;
  58. };
  59. class BS_CORE_EXPORT MaterialMat3Param : public IReflectable
  60. {
  61. public:
  62. String name;
  63. Matrix3 value;
  64. UINT32 arrayIdx;
  65. friend class MaterialMat3ParamRTTI;
  66. static RTTITypeBase* getRTTIStatic();
  67. virtual RTTITypeBase* getRTTI() const;
  68. };
  69. class BS_CORE_EXPORT MaterialMat4Param : public IReflectable
  70. {
  71. public:
  72. String name;
  73. Matrix4 value;
  74. UINT32 arrayIdx;
  75. friend class MaterialMat4ParamRTTI;
  76. static RTTITypeBase* getRTTIStatic();
  77. virtual RTTITypeBase* getRTTI() const;
  78. };
  79. class BS_CORE_EXPORT MaterialStructParam : public IReflectable
  80. {
  81. public:
  82. String name;
  83. Material::StructData value;
  84. UINT32 arrayIdx;
  85. UINT32 elementSize;
  86. friend class MaterialStructParamRTTI;
  87. static RTTITypeBase* getRTTIStatic();
  88. virtual RTTITypeBase* getRTTI() const;
  89. };
  90. class BS_CORE_EXPORT MaterialTextureParam : public IReflectable
  91. {
  92. public:
  93. String name;
  94. HTexture value;
  95. friend class MaterialTextureParamRTTI;
  96. static RTTITypeBase* getRTTIStatic();
  97. virtual RTTITypeBase* getRTTI() const;
  98. };
  99. class BS_CORE_EXPORT MaterialSamplerStateParam : public IReflectable
  100. {
  101. public:
  102. String name;
  103. HSamplerState value;
  104. friend class MaterialSamplerStateParamRTTI;
  105. static RTTITypeBase* getRTTIStatic();
  106. virtual RTTITypeBase* getRTTI() const;
  107. };
  108. class BS_CORE_EXPORT MaterialParams : public IReflectable
  109. {
  110. public:
  111. Vector<MaterialFloatParam> floatParams;
  112. Vector<MaterialVec2Param> vec2Params;
  113. Vector<MaterialVec3Param> vec3Params;
  114. Vector<MaterialVec4Param> vec4Params;
  115. Vector<MaterialMat3Param> mat3Params;
  116. Vector<MaterialMat4Param> mat4Params;
  117. Vector<MaterialStructParam> structParams;
  118. Vector<MaterialTextureParam> textureParams;
  119. Vector<MaterialSamplerStateParam> samplerStateParams;
  120. friend class MaterialParamsRTTI;
  121. static RTTITypeBase* getRTTIStatic();
  122. virtual RTTITypeBase* getRTTI() const;
  123. };
  124. /************************************************************************/
  125. /* RTTI FOR HELPER STRUCTS TO HELP SERIALIZING */
  126. /************************************************************************/
  127. class BS_CORE_EXPORT MaterialFloatParamRTTI : public RTTIType<MaterialFloatParam, IReflectable, MaterialFloatParamRTTI>
  128. {
  129. public:
  130. String& getName(MaterialFloatParam* obj) { return obj->name; }
  131. void setName(MaterialFloatParam* obj, String& name) { obj->name = name; }
  132. float& getValue(MaterialFloatParam* obj) { return obj->value; }
  133. void setValue(MaterialFloatParam* obj, float& value) { obj->value = value; }
  134. UINT32& getArrayIdx(MaterialFloatParam* obj) { return obj->arrayIdx; }
  135. void setArrayIdx(MaterialFloatParam* obj, UINT32& value) { obj->arrayIdx = value; }
  136. MaterialFloatParamRTTI()
  137. {
  138. addPlainField("name", 0, &MaterialFloatParamRTTI::getName, &MaterialFloatParamRTTI::setName);
  139. addPlainField("value", 1, &MaterialFloatParamRTTI::getValue, &MaterialFloatParamRTTI::setValue);
  140. addPlainField("arrayIdx", 2, &MaterialFloatParamRTTI::getArrayIdx, &MaterialFloatParamRTTI::setArrayIdx);
  141. }
  142. virtual const String& getRTTIName()
  143. {
  144. static String name = "MaterialFloatParam";
  145. return name;
  146. }
  147. virtual UINT32 getRTTIId() { return TID_MaterialParamFloat; }
  148. virtual std::shared_ptr<IReflectable> newRTTIObject()
  149. {
  150. return bs_shared_ptr<MaterialFloatParam, ScratchAlloc>();
  151. }
  152. };
  153. class BS_CORE_EXPORT MaterialVec2ParamRTTI : public RTTIType<MaterialVec2Param, IReflectable, MaterialVec2ParamRTTI>
  154. {
  155. public:
  156. String& getName(MaterialVec2Param* obj) { return obj->name; }
  157. void setName(MaterialVec2Param* obj, String& name) { obj->name = name; }
  158. Vector2& getValue(MaterialVec2Param* obj) { return obj->value; }
  159. void setValue(MaterialVec2Param* obj, Vector2& value) { obj->value = value; }
  160. UINT32& getArrayIdx(MaterialVec2Param* obj) { return obj->arrayIdx; }
  161. void setArrayIdx(MaterialVec2Param* obj, UINT32& value) { obj->arrayIdx = value; }
  162. MaterialVec2ParamRTTI()
  163. {
  164. addPlainField("name", 0, &MaterialVec2ParamRTTI::getName, &MaterialVec2ParamRTTI::setName);
  165. addPlainField("value", 1, &MaterialVec2ParamRTTI::getValue, &MaterialVec2ParamRTTI::setValue);
  166. addPlainField("arrayIdx", 2, &MaterialVec2ParamRTTI::getArrayIdx, &MaterialVec2ParamRTTI::setArrayIdx);
  167. }
  168. virtual const String& getRTTIName()
  169. {
  170. static String name = "MaterialVec2Param";
  171. return name;
  172. }
  173. virtual UINT32 getRTTIId() { return TID_MaterialParamVec2; }
  174. virtual std::shared_ptr<IReflectable> newRTTIObject()
  175. {
  176. return bs_shared_ptr<MaterialVec2Param, ScratchAlloc>();
  177. }
  178. };
  179. class BS_CORE_EXPORT MaterialVec3ParamRTTI : public RTTIType<MaterialVec3Param, IReflectable, MaterialVec3ParamRTTI>
  180. {
  181. public:
  182. String& getName(MaterialVec3Param* obj) { return obj->name; }
  183. void setName(MaterialVec3Param* obj, String& name) { obj->name = name; }
  184. Vector3& getValue(MaterialVec3Param* obj) { return obj->value; }
  185. void setValue(MaterialVec3Param* obj, Vector3& value) { obj->value = value; }
  186. UINT32& getArrayIdx(MaterialVec3Param* obj) { return obj->arrayIdx; }
  187. void setArrayIdx(MaterialVec3Param* obj, UINT32& value) { obj->arrayIdx = value; }
  188. MaterialVec3ParamRTTI()
  189. {
  190. addPlainField("name", 0, &MaterialVec3ParamRTTI::getName, &MaterialVec3ParamRTTI::setName);
  191. addPlainField("value", 1, &MaterialVec3ParamRTTI::getValue, &MaterialVec3ParamRTTI::setValue);
  192. addPlainField("arrayIdx", 2, &MaterialVec3ParamRTTI::getArrayIdx, &MaterialVec3ParamRTTI::setArrayIdx);
  193. }
  194. virtual const String& getRTTIName()
  195. {
  196. static String name = "MaterialVec3Param";
  197. return name;
  198. }
  199. virtual UINT32 getRTTIId() { return TID_MaterialParamVec3; }
  200. virtual std::shared_ptr<IReflectable> newRTTIObject()
  201. {
  202. return bs_shared_ptr<MaterialVec3Param, ScratchAlloc>();
  203. }
  204. };
  205. class BS_CORE_EXPORT MaterialVec4ParamRTTI : public RTTIType<MaterialVec4Param, IReflectable, MaterialVec4ParamRTTI>
  206. {
  207. public:
  208. String& getName(MaterialVec4Param* obj) { return obj->name; }
  209. void setName(MaterialVec4Param* obj, String& name) { obj->name = name; }
  210. Vector4& getValue(MaterialVec4Param* obj) { return obj->value; }
  211. void setValue(MaterialVec4Param* obj, Vector4& value) { obj->value = value; }
  212. UINT32& getArrayIdx(MaterialVec4Param* obj) { return obj->arrayIdx; }
  213. void setArrayIdx(MaterialVec4Param* obj, UINT32& value) { obj->arrayIdx = value; }
  214. MaterialVec4ParamRTTI()
  215. {
  216. addPlainField("name", 0, &MaterialVec4ParamRTTI::getName, &MaterialVec4ParamRTTI::setName);
  217. addPlainField("value", 1, &MaterialVec4ParamRTTI::getValue, &MaterialVec4ParamRTTI::setValue);
  218. addPlainField("arrayIdx", 2, &MaterialVec4ParamRTTI::getArrayIdx, &MaterialVec4ParamRTTI::setArrayIdx);
  219. }
  220. virtual const String& getRTTIName()
  221. {
  222. static String name = "MaterialVec4Param";
  223. return name;
  224. }
  225. virtual UINT32 getRTTIId() { return TID_MaterialParamVec4; }
  226. virtual std::shared_ptr<IReflectable> newRTTIObject()
  227. {
  228. return bs_shared_ptr<MaterialVec4Param, ScratchAlloc>();
  229. }
  230. };
  231. class BS_CORE_EXPORT MaterialMat3ParamRTTI : public RTTIType<MaterialMat3Param, IReflectable, MaterialMat3ParamRTTI>
  232. {
  233. public:
  234. String& getName(MaterialMat3Param* obj) { return obj->name; }
  235. void setName(MaterialMat3Param* obj, String& name) { obj->name = name; }
  236. Matrix3& getValue(MaterialMat3Param* obj) { return obj->value; }
  237. void setValue(MaterialMat3Param* obj, Matrix3& value) { obj->value = value; }
  238. UINT32& getArrayIdx(MaterialMat3Param* obj) { return obj->arrayIdx; }
  239. void setArrayIdx(MaterialMat3Param* obj, UINT32& value) { obj->arrayIdx = value; }
  240. MaterialMat3ParamRTTI()
  241. {
  242. addPlainField("name", 0, &MaterialMat3ParamRTTI::getName, &MaterialMat3ParamRTTI::setName);
  243. addPlainField("value", 1, &MaterialMat3ParamRTTI::getValue, &MaterialMat3ParamRTTI::setValue);
  244. addPlainField("arrayIdx", 2, &MaterialMat3ParamRTTI::getArrayIdx, &MaterialMat3ParamRTTI::setArrayIdx);
  245. }
  246. virtual const String& getRTTIName()
  247. {
  248. static String name = "MaterialMat3Param";
  249. return name;
  250. }
  251. virtual UINT32 getRTTIId() { return TID_MaterialParamMat3; }
  252. virtual std::shared_ptr<IReflectable> newRTTIObject()
  253. {
  254. return bs_shared_ptr<MaterialMat3Param, ScratchAlloc>();
  255. }
  256. };
  257. class BS_CORE_EXPORT MaterialMat4ParamRTTI : public RTTIType<MaterialMat4Param, IReflectable, MaterialMat4ParamRTTI>
  258. {
  259. public:
  260. String& getName(MaterialMat4Param* obj) { return obj->name; }
  261. void setName(MaterialMat4Param* obj, String& name) { obj->name = name; }
  262. Matrix4& getValue(MaterialMat4Param* obj) { return obj->value; }
  263. void setValue(MaterialMat4Param* obj, Matrix4& value) { obj->value = value; }
  264. UINT32& getArrayIdx(MaterialMat4Param* obj) { return obj->arrayIdx; }
  265. void setArrayIdx(MaterialMat4Param* obj, UINT32& value) { obj->arrayIdx = value; }
  266. MaterialMat4ParamRTTI()
  267. {
  268. addPlainField("name", 0, &MaterialMat4ParamRTTI::getName, &MaterialMat4ParamRTTI::setName);
  269. addPlainField("value", 1, &MaterialMat4ParamRTTI::getValue, &MaterialMat4ParamRTTI::setValue);
  270. addPlainField("arrayIdx", 2, &MaterialMat4ParamRTTI::getArrayIdx, &MaterialMat4ParamRTTI::setArrayIdx);
  271. }
  272. virtual const String& getRTTIName()
  273. {
  274. static String name = "MaterialMat4Param";
  275. return name;
  276. }
  277. virtual UINT32 getRTTIId() { return TID_MaterialParamMat4; }
  278. virtual std::shared_ptr<IReflectable> newRTTIObject()
  279. {
  280. return bs_shared_ptr<MaterialMat4Param, ScratchAlloc>();
  281. }
  282. };
  283. class BS_CORE_EXPORT MaterialStructParamRTTI : public RTTIType<MaterialStructParam, IReflectable, MaterialStructParamRTTI>
  284. {
  285. public:
  286. String& getName(MaterialStructParam* obj) { return obj->name; }
  287. void setName(MaterialStructParam* obj, String& name) { obj->name = name; }
  288. ManagedDataBlock getValue(MaterialStructParam* obj)
  289. {
  290. ManagedDataBlock returnValue(obj->value.size);
  291. UINT8* data = returnValue.getData();
  292. memcpy(data, obj->value.data.get(), obj->value.size);
  293. return returnValue;
  294. }
  295. void setValue(MaterialStructParam* obj, ManagedDataBlock value)
  296. {
  297. obj->value = Material::StructData(value.getSize());
  298. obj->value.write(value.getData());
  299. }
  300. UINT32& getArrayIdx(MaterialStructParam* obj) { return obj->arrayIdx; }
  301. void setArrayIdx(MaterialStructParam* obj, UINT32& value) { obj->arrayIdx = value; }
  302. UINT32& getElementSize(MaterialStructParam* obj) { return obj->elementSize; }
  303. void setElementSize(MaterialStructParam* obj, UINT32& value) { obj->elementSize = value; }
  304. MaterialStructParamRTTI()
  305. {
  306. addPlainField("name", 0, &MaterialStructParamRTTI::getName, &MaterialStructParamRTTI::setName);
  307. addDataBlockField("value", 1, &MaterialStructParamRTTI::getValue, &MaterialStructParamRTTI::setValue);
  308. addPlainField("arrayIdx", 2, &MaterialStructParamRTTI::getArrayIdx, &MaterialStructParamRTTI::setArrayIdx);
  309. addPlainField("elementSize", 3, &MaterialStructParamRTTI::getElementSize, &MaterialStructParamRTTI::setElementSize);
  310. }
  311. virtual const String& getRTTIName()
  312. {
  313. static String name = "MaterialStructParam";
  314. return name;
  315. }
  316. virtual UINT32 getRTTIId() { return TID_MaterialParamStruct; }
  317. virtual std::shared_ptr<IReflectable> newRTTIObject()
  318. {
  319. return bs_shared_ptr<MaterialStructParam, ScratchAlloc>();
  320. }
  321. };
  322. class BS_CORE_EXPORT MaterialTextureParamRTTI : public RTTIType<MaterialTextureParam, IReflectable, MaterialTextureParamRTTI>
  323. {
  324. public:
  325. String& getName(MaterialTextureParam* obj) { return obj->name; }
  326. void setName(MaterialTextureParam* obj, String& name) { obj->name = name; }
  327. HTexture& getValue(MaterialTextureParam* obj) { return obj->value; }
  328. void setValue(MaterialTextureParam* obj, HTexture& value) { obj->value = value; }
  329. MaterialTextureParamRTTI()
  330. {
  331. addPlainField("name", 0, &MaterialTextureParamRTTI::getName, &MaterialTextureParamRTTI::setName);
  332. addReflectableField("value", 1, &MaterialTextureParamRTTI::getValue, &MaterialTextureParamRTTI::setValue);
  333. }
  334. virtual const String& getRTTIName()
  335. {
  336. static String name = "MaterialTextureParam";
  337. return name;
  338. }
  339. virtual UINT32 getRTTIId() { return TID_MaterialParamTexture; }
  340. virtual std::shared_ptr<IReflectable> newRTTIObject()
  341. {
  342. return bs_shared_ptr<MaterialTextureParam, ScratchAlloc>();
  343. }
  344. };
  345. class BS_CORE_EXPORT MaterialSamplerStateParamRTTI : public RTTIType<MaterialSamplerStateParam, IReflectable, MaterialSamplerStateParamRTTI>
  346. {
  347. public:
  348. String& getName(MaterialSamplerStateParam* obj) { return obj->name; }
  349. void setName(MaterialSamplerStateParam* obj, String& name) { obj->name = name; }
  350. HSamplerState& getValue(MaterialSamplerStateParam* obj) { return obj->value; }
  351. void setValue(MaterialSamplerStateParam* obj, HSamplerState& value) { obj->value = value; }
  352. MaterialSamplerStateParamRTTI()
  353. {
  354. addPlainField("name", 0, &MaterialSamplerStateParamRTTI::getName, &MaterialSamplerStateParamRTTI::setName);
  355. addReflectableField("value", 1, &MaterialSamplerStateParamRTTI::getValue, &MaterialSamplerStateParamRTTI::setValue);
  356. }
  357. virtual const String& getRTTIName()
  358. {
  359. static String name = "MaterialSamplerStateParam";
  360. return name;
  361. }
  362. virtual UINT32 getRTTIId() { return TID_MaterialParamSamplerState; }
  363. virtual std::shared_ptr<IReflectable> newRTTIObject()
  364. {
  365. return bs_shared_ptr<MaterialSamplerStateParam, ScratchAlloc>();
  366. }
  367. };
  368. class BS_CORE_EXPORT MaterialParamsRTTI : public RTTIType<MaterialParams, IReflectable, MaterialParamsRTTI>
  369. {
  370. public:
  371. MaterialFloatParam& getFloatParam(MaterialParams* obj, UINT32 idx) { return obj->floatParams[idx]; }
  372. void setFloatParam(MaterialParams* obj, UINT32 idx, MaterialFloatParam& param) { obj->floatParams[idx] = param; }
  373. UINT32 getFloatArraySize(MaterialParams* obj) { return (UINT32)obj->floatParams.size(); }
  374. void setFloatArraySize(MaterialParams* obj, UINT32 size) { obj->floatParams.resize(size); }
  375. MaterialVec2Param& getVec2Param(MaterialParams* obj, UINT32 idx) { return obj->vec2Params[idx]; }
  376. void setVec2Param(MaterialParams* obj, UINT32 idx, MaterialVec2Param& param) { obj->vec2Params[idx] = param; }
  377. UINT32 getVec2ArraySize(MaterialParams* obj) { return (UINT32)obj->vec2Params.size(); }
  378. void setVec2ArraySize(MaterialParams* obj, UINT32 size) { obj->vec2Params.resize(size); }
  379. MaterialVec3Param& getVec3Param(MaterialParams* obj, UINT32 idx) { return obj->vec3Params[idx]; }
  380. void setVec3Param(MaterialParams* obj, UINT32 idx, MaterialVec3Param& param) { obj->vec3Params[idx] = param; }
  381. UINT32 getVec3ArraySize(MaterialParams* obj) { return (UINT32)obj->vec3Params.size(); }
  382. void setVec3ArraySize(MaterialParams* obj, UINT32 size) { obj->vec3Params.resize(size); }
  383. MaterialVec4Param& getVec4Param(MaterialParams* obj, UINT32 idx) { return obj->vec4Params[idx]; }
  384. void setVec4Param(MaterialParams* obj, UINT32 idx, MaterialVec4Param& param) { obj->vec4Params[idx] = param; }
  385. UINT32 getVec4ArraySize(MaterialParams* obj) { return (UINT32)obj->vec4Params.size(); }
  386. void setVec4ArraySize(MaterialParams* obj, UINT32 size) { obj->vec4Params.resize(size); }
  387. MaterialMat3Param& getMat3Param(MaterialParams* obj, UINT32 idx) { return obj->mat3Params[idx]; }
  388. void setMat3Param(MaterialParams* obj, UINT32 idx, MaterialMat3Param& param) { obj->mat3Params[idx] = param; }
  389. UINT32 getMat3ArraySize(MaterialParams* obj) { return (UINT32)obj->mat3Params.size(); }
  390. void setMat3ArraySize(MaterialParams* obj, UINT32 size) { obj->mat3Params.resize(size); }
  391. MaterialMat4Param& getMat4Param(MaterialParams* obj, UINT32 idx) { return obj->mat4Params[idx]; }
  392. void setMat4Param(MaterialParams* obj, UINT32 idx, MaterialMat4Param& param) { obj->mat4Params[idx] = param; }
  393. UINT32 getMat4ArraySize(MaterialParams* obj) { return (UINT32)obj->mat4Params.size(); }
  394. void setMat4ArraySize(MaterialParams* obj, UINT32 size) { obj->mat4Params.resize(size); }
  395. MaterialStructParam& getStructParam(MaterialParams* obj, UINT32 idx) { return obj->structParams[idx]; }
  396. void setStructParam(MaterialParams* obj, UINT32 idx, MaterialStructParam& param) { obj->structParams[idx] = param; }
  397. UINT32 getStructArraySize(MaterialParams* obj) { return (UINT32)obj->structParams.size(); }
  398. void setStructArraySize(MaterialParams* obj, UINT32 size) { obj->structParams.resize(size); }
  399. MaterialTextureParam& getTextureParam(MaterialParams* obj, UINT32 idx) { return obj->textureParams[idx]; }
  400. void setTextureParam(MaterialParams* obj, UINT32 idx, MaterialTextureParam& param) { obj->textureParams[idx] = param; }
  401. UINT32 getTextureArraySize(MaterialParams* obj) { return (UINT32)obj->textureParams.size(); }
  402. void setTextureArraySize(MaterialParams* obj, UINT32 size) { obj->textureParams.resize(size); }
  403. MaterialSamplerStateParam& getSamplerStateParam(MaterialParams* obj, UINT32 idx) { return obj->samplerStateParams[idx]; }
  404. void setSamplerStateParam(MaterialParams* obj, UINT32 idx, MaterialSamplerStateParam& param) { obj->samplerStateParams[idx] = param; }
  405. UINT32 getSamplerStateArraySize(MaterialParams* obj) { return (UINT32)obj->samplerStateParams.size(); }
  406. void setSamplerStateArraySize(MaterialParams* obj, UINT32 size) { obj->samplerStateParams.resize(size); }
  407. MaterialParamsRTTI()
  408. {
  409. addReflectableArrayField("floatParams", 0, &MaterialParamsRTTI::getFloatParam,
  410. &MaterialParamsRTTI::getFloatArraySize, &MaterialParamsRTTI::setFloatParam, &MaterialParamsRTTI::setFloatArraySize);
  411. addReflectableArrayField("vec2Params", 1, &MaterialParamsRTTI::getVec2Param,
  412. &MaterialParamsRTTI::getVec2ArraySize, &MaterialParamsRTTI::setVec2Param, &MaterialParamsRTTI::setVec2ArraySize);
  413. addReflectableArrayField("vec3Params", 2, &MaterialParamsRTTI::getVec3Param,
  414. &MaterialParamsRTTI::getVec3ArraySize, &MaterialParamsRTTI::setVec3Param, &MaterialParamsRTTI::setVec3ArraySize);
  415. addReflectableArrayField("vec4Params", 3, &MaterialParamsRTTI::getVec4Param,
  416. &MaterialParamsRTTI::getVec4ArraySize, &MaterialParamsRTTI::setVec4Param, &MaterialParamsRTTI::setVec4ArraySize);
  417. addReflectableArrayField("mat3Params", 4, &MaterialParamsRTTI::getMat3Param,
  418. &MaterialParamsRTTI::getMat3ArraySize, &MaterialParamsRTTI::setMat3Param, &MaterialParamsRTTI::setMat3ArraySize);
  419. addReflectableArrayField("mat4Params", 5, &MaterialParamsRTTI::getMat4Param,
  420. &MaterialParamsRTTI::getMat4ArraySize, &MaterialParamsRTTI::setMat4Param, &MaterialParamsRTTI::setMat4ArraySize);
  421. addReflectableArrayField("structParams", 6, &MaterialParamsRTTI::getStructParam,
  422. &MaterialParamsRTTI::getStructArraySize, &MaterialParamsRTTI::setStructParam, &MaterialParamsRTTI::setStructArraySize);
  423. addReflectableArrayField("textureParams", 7, &MaterialParamsRTTI::getTextureParam,
  424. &MaterialParamsRTTI::getTextureArraySize, &MaterialParamsRTTI::setTextureParam, &MaterialParamsRTTI::setTextureArraySize);
  425. addReflectableArrayField("samplerStateParams", 8, &MaterialParamsRTTI::getSamplerStateParam,
  426. &MaterialParamsRTTI::getSamplerStateArraySize, &MaterialParamsRTTI::setSamplerStateParam, &MaterialParamsRTTI::setSamplerStateArraySize);
  427. }
  428. virtual const String& getRTTIName()
  429. {
  430. static String name = "MaterialParams";
  431. return name;
  432. }
  433. virtual UINT32 getRTTIId() { return TID_MaterialParams; }
  434. virtual std::shared_ptr<IReflectable> newRTTIObject()
  435. {
  436. return bs_shared_ptr<MaterialParams, ScratchAlloc>();
  437. }
  438. };
  439. class BS_CORE_EXPORT MaterialRTTI : public RTTIType<Material, Resource, MaterialRTTI>
  440. {
  441. private:
  442. ShaderPtr getShader(Material* obj)
  443. {
  444. return obj->mShader;
  445. }
  446. void setShader(Material* obj, ShaderPtr val)
  447. {
  448. obj->mShader = val;
  449. }
  450. std::shared_ptr<MaterialParams> getMaterialParams(Material* obj)
  451. {
  452. if(obj->mRTTIData.empty())
  453. return nullptr;
  454. return any_cast<std::shared_ptr<MaterialParams>>(obj->mRTTIData);
  455. }
  456. void setMaterialParams(Material* obj, std::shared_ptr<MaterialParams> value)
  457. {
  458. obj->mRTTIData = value;
  459. }
  460. public:
  461. MaterialRTTI()
  462. {
  463. addReflectablePtrField("mShader", 0, &MaterialRTTI::getShader, &MaterialRTTI::setShader);
  464. addReflectablePtrField("mMaterialParams", 1, &MaterialRTTI::getMaterialParams, &MaterialRTTI::setMaterialParams);
  465. }
  466. virtual void onSerializationStarted(IReflectable* obj);
  467. virtual void onSerializationEnded(IReflectable* obj);
  468. virtual void onDeserializationStarted(IReflectable* obj);
  469. virtual void onDeserializationEnded(IReflectable* obj);
  470. virtual const String& getRTTIName()
  471. {
  472. static String name = "Material";
  473. return name;
  474. }
  475. virtual UINT32 getRTTIId()
  476. {
  477. return TID_Material;
  478. }
  479. virtual std::shared_ptr<IReflectable> newRTTIObject();
  480. };
  481. }