BsShaderRTTI.h 13 KB

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