BsShaderRTTI.h 12 KB

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