BsShaderRTTI.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsRTTIType.h"
  6. #include "BsShader.h"
  7. #include "BsMaterial.h"
  8. namespace BansheeEngine
  9. {
  10. /** @cond RTTI */
  11. /** @addtogroup RTTI-Impl-Core
  12. * @{
  13. */
  14. template<> struct RTTIPlainType<SHADER_DATA_PARAM_DESC>
  15. {
  16. enum { id = TID_SHADER_DATA_PARAM_DESC }; enum { hasDynamicSize = 1 };
  17. static void toMemory(const SHADER_DATA_PARAM_DESC& data, char* memory)
  18. {
  19. UINT32 size = getDynamicSize(data);
  20. UINT32 curSize = sizeof(UINT32);
  21. memcpy(memory, &size, curSize);
  22. memory += curSize;
  23. memory = rttiWriteElem(data.arraySize, memory);
  24. memory = rttiWriteElem(data.rendererSemantic, memory);
  25. memory = rttiWriteElem(data.type, memory);
  26. memory = rttiWriteElem(data.name, memory);
  27. memory = rttiWriteElem(data.gpuVariableName, memory);
  28. memory = rttiWriteElem(data.elementSize, memory);
  29. memory = rttiWriteElem(data.defaultValueIdx, memory);
  30. }
  31. static UINT32 fromMemory(SHADER_DATA_PARAM_DESC& data, char* memory)
  32. {
  33. UINT32 size;
  34. memcpy(&size, memory, sizeof(UINT32));
  35. memory += sizeof(UINT32);
  36. memory = rttiReadElem(data.arraySize, memory);
  37. memory = rttiReadElem(data.rendererSemantic, memory);
  38. memory = rttiReadElem(data.type, memory);
  39. memory = rttiReadElem(data.name, memory);
  40. memory = rttiReadElem(data.gpuVariableName, memory);
  41. memory = rttiReadElem(data.elementSize, memory);
  42. memory = rttiReadElem(data.defaultValueIdx, memory);
  43. return size;
  44. }
  45. static UINT32 getDynamicSize(const SHADER_DATA_PARAM_DESC& data)
  46. {
  47. UINT64 dataSize = rttiGetElemSize(data.arraySize) + rttiGetElemSize(data.rendererSemantic) + rttiGetElemSize(data.type) +
  48. rttiGetElemSize(data.name) + rttiGetElemSize(data.gpuVariableName) + rttiGetElemSize(data.elementSize) +
  49. rttiGetElemSize(data.defaultValueIdx) + sizeof(UINT32);
  50. #if BS_DEBUG_MODE
  51. if(dataSize > std::numeric_limits<UINT32>::max())
  52. {
  53. BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
  54. }
  55. #endif
  56. return (UINT32)dataSize;
  57. }
  58. };
  59. template<> struct RTTIPlainType<SHADER_OBJECT_PARAM_DESC>
  60. {
  61. enum { id = TID_SHADER_OBJECT_PARAM_DESC }; enum { hasDynamicSize = 1 };
  62. static void toMemory(const SHADER_OBJECT_PARAM_DESC& data, char* memory)
  63. {
  64. UINT32 size = getDynamicSize(data);
  65. UINT32 curSize = sizeof(UINT32);
  66. memcpy(memory, &size, curSize);
  67. memory += curSize;
  68. memory = rttiWriteElem(data.rendererSemantic, memory);
  69. memory = rttiWriteElem(data.type, memory);
  70. memory = rttiWriteElem(data.name, memory);
  71. memory = rttiWriteElem(data.gpuVariableNames, memory);
  72. memory = rttiWriteElem(data.defaultValueIdx, memory);
  73. }
  74. static UINT32 fromMemory(SHADER_OBJECT_PARAM_DESC& data, char* memory)
  75. {
  76. UINT32 size;
  77. memcpy(&size, memory, sizeof(UINT32));
  78. memory += sizeof(UINT32);
  79. memory = rttiReadElem(data.rendererSemantic, memory);
  80. memory = rttiReadElem(data.type, memory);
  81. memory = rttiReadElem(data.name, memory);
  82. memory = rttiReadElem(data.gpuVariableNames, memory);
  83. memory = rttiReadElem(data.defaultValueIdx, memory);
  84. return size;
  85. }
  86. static UINT32 getDynamicSize(const SHADER_OBJECT_PARAM_DESC& data)
  87. {
  88. UINT64 dataSize = rttiGetElemSize(data.rendererSemantic) + rttiGetElemSize(data.type) +
  89. rttiGetElemSize(data.name) + rttiGetElemSize(data.gpuVariableNames) +
  90. rttiGetElemSize(data.defaultValueIdx) + sizeof(UINT32);
  91. #if BS_DEBUG_MODE
  92. if(dataSize > std::numeric_limits<UINT32>::max())
  93. {
  94. BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
  95. }
  96. #endif
  97. return (UINT32)dataSize;
  98. }
  99. };
  100. template<> struct RTTIPlainType<SHADER_PARAM_BLOCK_DESC>
  101. {
  102. enum { id = TID_SHADER_PARAM_BLOCK_DESC }; enum { hasDynamicSize = 1 };
  103. static void toMemory(const SHADER_PARAM_BLOCK_DESC& data, char* memory)
  104. {
  105. UINT32 size = getDynamicSize(data);
  106. UINT32 curSize = sizeof(UINT32);
  107. memcpy(memory, &size, curSize);
  108. memory += curSize;
  109. memory = rttiWriteElem(data.shared, memory);
  110. memory = rttiWriteElem(data.usage, memory);
  111. memory = rttiWriteElem(data.name, memory);
  112. memory = rttiWriteElem(data.rendererSemantic, memory);
  113. }
  114. static UINT32 fromMemory(SHADER_PARAM_BLOCK_DESC& data, char* memory)
  115. {
  116. UINT32 size;
  117. memcpy(&size, memory, sizeof(UINT32));
  118. memory += sizeof(UINT32);
  119. memory = rttiReadElem(data.shared, memory);
  120. memory = rttiReadElem(data.usage, memory);
  121. memory = rttiReadElem(data.name, memory);
  122. memory = rttiReadElem(data.rendererSemantic, memory);
  123. return size;
  124. }
  125. static UINT32 getDynamicSize(const SHADER_PARAM_BLOCK_DESC& data)
  126. {
  127. UINT64 dataSize = rttiGetElemSize(data.shared) + rttiGetElemSize(data.usage) +
  128. rttiGetElemSize(data.name) + rttiGetElemSize(data.rendererSemantic) + sizeof(UINT32);
  129. #if BS_DEBUG_MODE
  130. if(dataSize > std::numeric_limits<UINT32>::max())
  131. {
  132. BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
  133. }
  134. #endif
  135. return (UINT32)dataSize;
  136. }
  137. };
  138. class BS_CORE_EXPORT ShaderRTTI : public RTTIType<Shader, Resource, ShaderRTTI>
  139. {
  140. private:
  141. SPtr<Technique> getTechnique(Shader* obj, UINT32 idx) { return obj->mTechniques[idx]; }
  142. void setTechnique(Shader* obj, UINT32 idx, SPtr<Technique> val) { obj->mTechniques[idx] = val; }
  143. UINT32 getTechniqueArraySize(Shader* obj) { return (UINT32)obj->mTechniques.size(); }
  144. void setTechniqueArraySize(Shader* obj, UINT32 size) { obj->mTechniques.resize(size); }
  145. String& getName(Shader* obj) { return obj->mName; }
  146. void setName(Shader* obj, String& name) { obj->mName = name; }
  147. SHADER_DATA_PARAM_DESC& getDataParam(Shader* obj, UINT32 idx)
  148. {
  149. auto iter = obj->mDesc.dataParams.begin();
  150. for(UINT32 i = 0; i < idx; i++) ++iter;
  151. return iter->second;
  152. }
  153. void setDataParam(Shader* obj, UINT32 idx, SHADER_DATA_PARAM_DESC& val) { obj->mDesc.dataParams[val.name] = val; }
  154. UINT32 getDataParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.dataParams.size(); }
  155. void setDataParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
  156. SHADER_OBJECT_PARAM_DESC& getTextureParam(Shader* obj, UINT32 idx)
  157. {
  158. auto iter = obj->mDesc.textureParams.begin();
  159. for(UINT32 i = 0; i < idx; i++) ++iter;
  160. return iter->second;
  161. }
  162. void setTextureParam(Shader* obj, UINT32 idx, SHADER_OBJECT_PARAM_DESC& val) { obj->mDesc.textureParams[val.name] = val; }
  163. UINT32 getTextureParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.textureParams.size(); }
  164. void setTextureParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
  165. SHADER_OBJECT_PARAM_DESC& getSamplerParam(Shader* obj, UINT32 idx)
  166. {
  167. auto iter = obj->mDesc.samplerParams.begin();
  168. for (UINT32 i = 0; i < idx; i++) ++iter;
  169. return iter->second;
  170. }
  171. void setSamplerParam(Shader* obj, UINT32 idx, SHADER_OBJECT_PARAM_DESC& val) { obj->mDesc.samplerParams[val.name] = val; }
  172. UINT32 getSamplerParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.samplerParams.size(); }
  173. void setSamplerParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
  174. SHADER_OBJECT_PARAM_DESC& getBufferParam(Shader* obj, UINT32 idx)
  175. {
  176. auto iter = obj->mDesc.bufferParams.begin();
  177. for (UINT32 i = 0; i < idx; i++) ++iter;
  178. return iter->second;
  179. }
  180. void setBufferParam(Shader* obj, UINT32 idx, SHADER_OBJECT_PARAM_DESC& val) { obj->mDesc.bufferParams[val.name] = val; }
  181. UINT32 getBufferParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.bufferParams.size(); }
  182. void setBufferParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
  183. SHADER_PARAM_BLOCK_DESC& getParamBlock(Shader* obj, UINT32 idx)
  184. {
  185. auto iter = obj->mDesc.paramBlocks.begin();
  186. for (UINT32 i = 0; i < idx; i++) ++iter;
  187. return iter->second;
  188. }
  189. void setParamBlock(Shader* obj, UINT32 idx, SHADER_PARAM_BLOCK_DESC& val) { obj->mDesc.paramBlocks[val.name] = val; }
  190. UINT32 getParamBlocksArraySize(Shader* obj) { return (UINT32)obj->mDesc.paramBlocks.size(); }
  191. void setParamBlocksArraySize(Shader* obj, UINT32 size) { } // Do nothing
  192. UINT32& getQueueSortType(Shader* obj) { return (UINT32&)obj->mDesc.queueSortType; }
  193. void setQueueSortType(Shader* obj, UINT32& value) { obj->mDesc.queueSortType = (QueueSortType)value; }
  194. INT32& getQueuePriority(Shader* obj) { return obj->mDesc.queuePriority; }
  195. void setQueuePriority(Shader* obj, INT32& value) { obj->mDesc.queuePriority = value; }
  196. bool& getAllowSeparablePasses(Shader* obj) { return obj->mDesc.separablePasses; }
  197. void setAllowSeparablePasses(Shader* obj, bool& value) { obj->mDesc.separablePasses = value; }
  198. UINT32& getFlags(Shader* obj) { return obj->mDesc.flags; }
  199. void setFlags(Shader* obj, UINT32& value) { obj->mDesc.flags = value; }
  200. Vector<UINT8>& getDataDefaultValues(Shader* obj) { return obj->mDesc.dataDefaultValues; }
  201. void setDataDefaultValues(Shader* obj, Vector<UINT8>& value) { obj->mDesc.dataDefaultValues = value; }
  202. HTexture& getDefaultTexture(Shader* obj, UINT32 idx) { return obj->mDesc.textureDefaultValues[idx]; }
  203. void setDefaultTexture(Shader* obj, UINT32 idx, HTexture& val) { obj->mDesc.textureDefaultValues[idx] = val; }
  204. UINT32 getDefaultTextureArraySize(Shader* obj) { return (UINT32)obj->mDesc.textureDefaultValues.size(); }
  205. void setDefaultTextureArraySize(Shader* obj, UINT32 size) { obj->mDesc.textureDefaultValues.resize(size); }
  206. SPtr<SamplerState> getDefaultSampler(Shader* obj, UINT32 idx) { return obj->mDesc.samplerDefaultValues[idx]; }
  207. void setDefaultSampler(Shader* obj, UINT32 idx, SPtr<SamplerState> val) { obj->mDesc.samplerDefaultValues[idx] = val; }
  208. UINT32 getDefaultSamplerArraySize(Shader* obj) { return (UINT32)obj->mDesc.samplerDefaultValues.size(); }
  209. void setDefaultSamplerArraySize(Shader* obj, UINT32 size) { obj->mDesc.samplerDefaultValues.resize(size); }
  210. public:
  211. ShaderRTTI()
  212. {
  213. addReflectablePtrArrayField("mTechniques", 0, &ShaderRTTI::getTechnique, &ShaderRTTI::getTechniqueArraySize,
  214. &ShaderRTTI::setTechnique, &ShaderRTTI::setTechniqueArraySize);
  215. addPlainField("mName", 1, &ShaderRTTI::getName, &ShaderRTTI::setName);
  216. addPlainArrayField("mDataParams", 2, &ShaderRTTI::getDataParam, &ShaderRTTI::getDataParamsArraySize,
  217. &ShaderRTTI::setDataParam, &ShaderRTTI::setDataParamsArraySize);
  218. addPlainArrayField("mTextureParams", 3, &ShaderRTTI::getTextureParam, &ShaderRTTI::getTextureParamsArraySize,
  219. &ShaderRTTI::setTextureParam, &ShaderRTTI::setTextureParamsArraySize);
  220. addPlainArrayField("mSamplerParams", 4, &ShaderRTTI::getSamplerParam, &ShaderRTTI::getSamplerParamsArraySize,
  221. &ShaderRTTI::setSamplerParam, &ShaderRTTI::setSamplerParamsArraySize);
  222. addPlainArrayField("mBufferParams", 5, &ShaderRTTI::getBufferParam, &ShaderRTTI::getBufferParamsArraySize,
  223. &ShaderRTTI::setBufferParam, &ShaderRTTI::setBufferParamsArraySize);
  224. addPlainArrayField("mParamBlocks", 6, &ShaderRTTI::getParamBlock, &ShaderRTTI::getParamBlocksArraySize,
  225. &ShaderRTTI::setParamBlock, &ShaderRTTI::setParamBlocksArraySize);
  226. addPlainField("mQueueSortType", 7, &ShaderRTTI::getQueueSortType, &ShaderRTTI::setQueueSortType);
  227. addPlainField("mQueuePriority", 8, &ShaderRTTI::getQueuePriority, &ShaderRTTI::setQueuePriority);
  228. addPlainField("mSeparablePasses", 9, &ShaderRTTI::getAllowSeparablePasses, &ShaderRTTI::setAllowSeparablePasses);
  229. addPlainField("mDataDefaultValues", 10, &ShaderRTTI::getDataDefaultValues, &ShaderRTTI::setDataDefaultValues);
  230. addReflectableArrayField("mTextureDefaultValues", 11, &ShaderRTTI::getDefaultTexture, &ShaderRTTI::getDefaultTextureArraySize,
  231. &ShaderRTTI::setDefaultTexture, &ShaderRTTI::setDefaultTextureArraySize);
  232. addReflectablePtrArrayField("mSamplerDefaultValues", 12, &ShaderRTTI::getDefaultSampler, &ShaderRTTI::getDefaultSamplerArraySize,
  233. &ShaderRTTI::setDefaultSampler, &ShaderRTTI::setDefaultSamplerArraySize);
  234. addPlainField("mFlags", 13, &ShaderRTTI::getFlags, &ShaderRTTI::setFlags);
  235. }
  236. void onDeserializationEnded(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  237. {
  238. Shader* shader = static_cast<Shader*>(obj);
  239. shader->initialize();
  240. }
  241. const String& getRTTIName() override
  242. {
  243. static String name = "Shader";
  244. return name;
  245. }
  246. UINT32 getRTTIId() override
  247. {
  248. return TID_Shader;
  249. }
  250. SPtr<IReflectable> newRTTIObject() override
  251. {
  252. return Shader::createEmpty();
  253. }
  254. };
  255. class BS_CORE_EXPORT ShaderMetaDataRTTI : public RTTIType < ShaderMetaData, ResourceMetaData, ShaderMetaDataRTTI >
  256. {
  257. private:
  258. Vector<String>& getIncludes(ShaderMetaData* obj) { return obj->includes; }
  259. void setIncludes(ShaderMetaData* obj, Vector<String>& includes) { obj->includes = includes; }
  260. public:
  261. ShaderMetaDataRTTI()
  262. {
  263. addPlainField("includes", 0, &ShaderMetaDataRTTI::getIncludes, &ShaderMetaDataRTTI::setIncludes);
  264. }
  265. const String& getRTTIName() override
  266. {
  267. static String name = "ShaderMetaData";
  268. return name;
  269. }
  270. UINT32 getRTTIId() override
  271. {
  272. return TID_ShaderMetaData;
  273. }
  274. SPtr<IReflectable> newRTTIObject() override
  275. {
  276. return bs_shared_ptr_new<ShaderMetaData>();
  277. }
  278. };
  279. /** @} */
  280. /** @endcond */
  281. }