| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- #pragma once
- #include "BsCorePrerequisites.h"
- #include "BsRTTIType.h"
- #include "BsShader.h"
- #include "BsMaterial.h"
- namespace BansheeEngine
- {
- template<> struct RTTIPlainType<SHADER_DATA_PARAM_DESC>
- {
- enum { id = TID_SHADER_DATA_PARAM_DESC }; enum { hasDynamicSize = 1 };
- static void toMemory(const SHADER_DATA_PARAM_DESC& data, char* memory)
- {
- UINT32 size = getDynamicSize(data);
- UINT32 curSize = sizeof(UINT32);
- memcpy(memory, &size, curSize);
- memory += curSize;
- memory = rttiWriteElem(data.arraySize, memory);
- memory = rttiWriteElem(data.rendererSemantic, memory);
- memory = rttiWriteElem(data.type, memory);
- memory = rttiWriteElem(data.name, memory);
- memory = rttiWriteElem(data.gpuVariableName, memory);
- memory = rttiWriteElem(data.elementSize, memory);
- }
- static UINT32 fromMemory(SHADER_DATA_PARAM_DESC& data, char* memory)
- {
- UINT32 size;
- memcpy(&size, memory, sizeof(UINT32));
- memory += sizeof(UINT32);
- memory = rttiReadElem(data.arraySize, memory);
- memory = rttiReadElem(data.rendererSemantic, memory);
- memory = rttiReadElem(data.type, memory);
- memory = rttiReadElem(data.name, memory);
- memory = rttiReadElem(data.gpuVariableName, memory);
- memory = rttiReadElem(data.elementSize, memory);
- return size;
- }
- static UINT32 getDynamicSize(const SHADER_DATA_PARAM_DESC& data)
- {
- UINT64 dataSize = rttiGetElemSize(data.arraySize) + rttiGetElemSize(data.rendererSemantic) + rttiGetElemSize(data.type) +
- rttiGetElemSize(data.name) + rttiGetElemSize(data.gpuVariableName) + rttiGetElemSize(data.elementSize) + sizeof(UINT32);
- #if BS_DEBUG_MODE
- if(dataSize > std::numeric_limits<UINT32>::max())
- {
- BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
- }
- #endif
- return (UINT32)dataSize;
- }
- };
- template<> struct RTTIPlainType<SHADER_OBJECT_PARAM_DESC>
- {
- enum { id = TID_SHADER_OBJECT_PARAM_DESC }; enum { hasDynamicSize = 1 };
- static void toMemory(const SHADER_OBJECT_PARAM_DESC& data, char* memory)
- {
- UINT32 size = getDynamicSize(data);
- UINT32 curSize = sizeof(UINT32);
- memcpy(memory, &size, curSize);
- memory += curSize;
- memory = rttiWriteElem(data.rendererSemantic, memory);
- memory = rttiWriteElem(data.type, memory);
- memory = rttiWriteElem(data.name, memory);
- memory = rttiWriteElem(data.gpuVariableNames, memory);
- }
- static UINT32 fromMemory(SHADER_OBJECT_PARAM_DESC& data, char* memory)
- {
- UINT32 size;
- memcpy(&size, memory, sizeof(UINT32));
- memory += sizeof(UINT32);
- memory = rttiReadElem(data.rendererSemantic, memory);
- memory = rttiReadElem(data.type, memory);
- memory = rttiReadElem(data.name, memory);
- memory = rttiReadElem(data.gpuVariableNames, memory);
- return size;
- }
- static UINT32 getDynamicSize(const SHADER_OBJECT_PARAM_DESC& data)
- {
- UINT64 dataSize = rttiGetElemSize(data.rendererSemantic) + rttiGetElemSize(data.type) +
- rttiGetElemSize(data.name) + rttiGetElemSize(data.gpuVariableNames) + sizeof(UINT32);
- #if BS_DEBUG_MODE
- if(dataSize > std::numeric_limits<UINT32>::max())
- {
- BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
- }
- #endif
- return (UINT32)dataSize;
- }
- };
- template<> struct RTTIPlainType<SHADER_PARAM_BLOCK_DESC>
- {
- enum { id = TID_SHADER_PARAM_BLOCK_DESC }; enum { hasDynamicSize = 1 };
- static void toMemory(const SHADER_PARAM_BLOCK_DESC& data, char* memory)
- {
- UINT32 size = getDynamicSize(data);
- UINT32 curSize = sizeof(UINT32);
- memcpy(memory, &size, curSize);
- memory += curSize;
- memory = rttiWriteElem(data.shared, memory);
- memory = rttiWriteElem(data.usage, memory);
- memory = rttiWriteElem(data.name, memory);
- memory = rttiWriteElem(data.rendererSemantic, memory);
- }
- static UINT32 fromMemory(SHADER_PARAM_BLOCK_DESC& data, char* memory)
- {
- UINT32 size;
- memcpy(&size, memory, sizeof(UINT32));
- memory += sizeof(UINT32);
- memory = rttiReadElem(data.shared, memory);
- memory = rttiReadElem(data.usage, memory);
- memory = rttiReadElem(data.name, memory);
- memory = rttiReadElem(data.rendererSemantic, memory);
- return size;
- }
- static UINT32 getDynamicSize(const SHADER_PARAM_BLOCK_DESC& data)
- {
- UINT64 dataSize = rttiGetElemSize(data.shared) + rttiGetElemSize(data.usage) +
- rttiGetElemSize(data.name) + rttiGetElemSize(data.rendererSemantic) + sizeof(UINT32);
- #if BS_DEBUG_MODE
- if(dataSize > std::numeric_limits<UINT32>::max())
- {
- BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
- }
- #endif
- return (UINT32)dataSize;
- }
- };
- class BS_CORE_EXPORT ShaderRTTI : public RTTIType<Shader, Resource, ShaderRTTI>
- {
- private:
- TechniquePtr getTechnique(Shader* obj, UINT32 idx) { return obj->mTechniques[idx]; }
- void setTechnique(Shader* obj, UINT32 idx, TechniquePtr val) { obj->mTechniques[idx] = val; }
- UINT32 getTechniqueArraySize(Shader* obj) { return (UINT32)obj->mTechniques.size(); }
- void setTechniqueArraySize(Shader* obj, UINT32 size) { obj->mTechniques.resize(size); }
- String& getName(Shader* obj) { return obj->mName; }
- void setName(Shader* obj, String& name) { obj->mName = name; }
- SHADER_DATA_PARAM_DESC& getDataParam(Shader* obj, UINT32 idx)
- {
- auto iter = obj->mDesc.dataParams.begin();
- for(UINT32 i = 0; i < idx; i++) ++iter;
- return iter->second;
- }
- void setDataParam(Shader* obj, UINT32 idx, SHADER_DATA_PARAM_DESC& val) { obj->mDesc.dataParams[val.name] = val; }
- UINT32 getDataParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.dataParams.size(); }
- void setDataParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
- SHADER_OBJECT_PARAM_DESC& getTextureParam(Shader* obj, UINT32 idx)
- {
- auto iter = obj->mDesc.textureParams.begin();
- for(UINT32 i = 0; i < idx; i++) ++iter;
- return iter->second;
- }
- void setTextureParam(Shader* obj, UINT32 idx, SHADER_OBJECT_PARAM_DESC& val) { obj->mDesc.textureParams[val.name] = val; }
- UINT32 getTextureParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.textureParams.size(); }
- void setTextureParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
- SHADER_OBJECT_PARAM_DESC& getSamplerParam(Shader* obj, UINT32 idx)
- {
- auto iter = obj->mDesc.samplerParams.begin();
- for (UINT32 i = 0; i < idx; i++) ++iter;
- return iter->second;
- }
- void setSamplerParam(Shader* obj, UINT32 idx, SHADER_OBJECT_PARAM_DESC& val) { obj->mDesc.samplerParams[val.name] = val; }
- UINT32 getSamplerParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.samplerParams.size(); }
- void setSamplerParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
- SHADER_OBJECT_PARAM_DESC& getBufferParam(Shader* obj, UINT32 idx)
- {
- auto iter = obj->mDesc.bufferParams.begin();
- for (UINT32 i = 0; i < idx; i++) ++iter;
- return iter->second;
- }
- void setBufferParam(Shader* obj, UINT32 idx, SHADER_OBJECT_PARAM_DESC& val) { obj->mDesc.bufferParams[val.name] = val; }
- UINT32 getBufferParamsArraySize(Shader* obj) { return (UINT32)obj->mDesc.bufferParams.size(); }
- void setBufferParamsArraySize(Shader* obj, UINT32 size) { } // Do nothing
- SHADER_PARAM_BLOCK_DESC& getParamBlock(Shader* obj, UINT32 idx)
- {
- auto iter = obj->mDesc.paramBlocks.begin();
- for (UINT32 i = 0; i < idx; i++) ++iter;
- return iter->second;
- }
- void setParamBlock(Shader* obj, UINT32 idx, SHADER_PARAM_BLOCK_DESC& val) { obj->mDesc.paramBlocks[val.name] = val; }
- UINT32 getParamBlocksArraySize(Shader* obj) { return (UINT32)obj->mDesc.paramBlocks.size(); }
- void setParamBlocksArraySize(Shader* obj, UINT32 size) { } // Do nothing
- UINT32& getQueueSortType(Shader* obj) { return (UINT32&)obj->mDesc.queueSortType; }
- void setQueueSortType(Shader* obj, UINT32& value) { obj->mDesc.queueSortType = (QueueSortType)value; }
- INT32& getQueuePriority(Shader* obj) { return obj->mDesc.queuePriority; }
- void setQueuePriority(Shader* obj, INT32& value) { obj->mDesc.queuePriority = value; }
- bool& getAllowSeparablePasses(Shader* obj) { return obj->mDesc.separablePasses; }
- void setAllowSeparablePasses(Shader* obj, bool& value) { obj->mDesc.separablePasses = value; }
- UINT32& getFlags(Shader* obj) { return obj->mDesc.flags; }
- void setFlags(Shader* obj, UINT32& value) { obj->mDesc.flags = value; }
- Vector<UINT8>& getDataDefaultValues(Shader* obj) { return obj->mDesc.dataDefaultValues; }
- void setDataDefaultValues(Shader* obj, Vector<UINT8>& value) { obj->mDesc.dataDefaultValues = value; }
- HTexture& getDefaultTexture(Shader* obj, UINT32 idx) { return obj->mDesc.textureDefaultValues[idx]; }
- void setDefaultTexture(Shader* obj, UINT32 idx, HTexture& val) { obj->mDesc.textureDefaultValues[idx] = val; }
- UINT32 getDefaultTextureArraySize(Shader* obj) { return (UINT32)obj->mDesc.textureDefaultValues.size(); }
- void setDefaultTextureArraySize(Shader* obj, UINT32 size) { obj->mDesc.textureDefaultValues.resize(size); }
- SamplerStatePtr getDefaultSampler(Shader* obj, UINT32 idx) { return obj->mDesc.samplerDefaultValues[idx]; }
- void setDefaultSampler(Shader* obj, UINT32 idx, SamplerStatePtr val) { obj->mDesc.samplerDefaultValues[idx] = val; }
- UINT32 getDefaultSamplerArraySize(Shader* obj) { return (UINT32)obj->mDesc.samplerDefaultValues.size(); }
- void setDefaultSamplerArraySize(Shader* obj, UINT32 size) { obj->mDesc.samplerDefaultValues.resize(size); }
- public:
- ShaderRTTI()
- {
- addReflectablePtrArrayField("mTechniques", 0, &ShaderRTTI::getTechnique, &ShaderRTTI::getTechniqueArraySize,
- &ShaderRTTI::setTechnique, &ShaderRTTI::setTechniqueArraySize);
- addPlainField("mName", 1, &ShaderRTTI::getName, &ShaderRTTI::setName);
- addPlainArrayField("mDataParams", 2, &ShaderRTTI::getDataParam, &ShaderRTTI::getDataParamsArraySize,
- &ShaderRTTI::setDataParam, &ShaderRTTI::setDataParamsArraySize);
- addPlainArrayField("mTextureParams", 3, &ShaderRTTI::getTextureParam, &ShaderRTTI::getTextureParamsArraySize,
- &ShaderRTTI::setTextureParam, &ShaderRTTI::setTextureParamsArraySize);
- addPlainArrayField("mSamplerParams", 4, &ShaderRTTI::getSamplerParam, &ShaderRTTI::getSamplerParamsArraySize,
- &ShaderRTTI::setSamplerParam, &ShaderRTTI::setSamplerParamsArraySize);
- addPlainArrayField("mBufferParams", 5, &ShaderRTTI::getBufferParam, &ShaderRTTI::getBufferParamsArraySize,
- &ShaderRTTI::setBufferParam, &ShaderRTTI::setBufferParamsArraySize);
- addPlainArrayField("mParamBlocks", 6, &ShaderRTTI::getParamBlock, &ShaderRTTI::getParamBlocksArraySize,
- &ShaderRTTI::setParamBlock, &ShaderRTTI::setParamBlocksArraySize);
- addPlainField("mQueueSortType", 7, &ShaderRTTI::getQueueSortType, &ShaderRTTI::setQueueSortType);
- addPlainField("mQueuePriority", 8, &ShaderRTTI::getQueuePriority, &ShaderRTTI::setQueuePriority);
- addPlainField("mSeparablePasses", 9, &ShaderRTTI::getAllowSeparablePasses, &ShaderRTTI::setAllowSeparablePasses);
- addPlainField("mDataDefaultValues", 10, &ShaderRTTI::getDataDefaultValues, &ShaderRTTI::setDataDefaultValues);
- addReflectableArrayField("mTextureDefaultValues", 11, &ShaderRTTI::getDefaultTexture, &ShaderRTTI::getDefaultTextureArraySize,
- &ShaderRTTI::setDefaultTexture, &ShaderRTTI::setDefaultTextureArraySize);
- addReflectablePtrArrayField("mSamplerDefaultValues", 12, &ShaderRTTI::getDefaultSampler, &ShaderRTTI::getDefaultSamplerArraySize,
- &ShaderRTTI::setDefaultSampler, &ShaderRTTI::setDefaultSamplerArraySize);
- addPlainField("mFlags", 13, &ShaderRTTI::getFlags, &ShaderRTTI::setFlags);
- }
- virtual void onDeserializationEnded(IReflectable* obj) override
- {
- Shader* shader = static_cast<Shader*>(obj);
- shader->initialize();
- }
- virtual const String& getRTTIName() override
- {
- static String name = "Shader";
- return name;
- }
- virtual UINT32 getRTTIId() override
- {
- return TID_Shader;
- }
- virtual std::shared_ptr<IReflectable> newRTTIObject()
- {
- return Shader::createEmpty();
- }
- };
- class BS_CORE_EXPORT ShaderMetaDataRTTI : public RTTIType < ShaderMetaData, ResourceMetaData, ShaderMetaDataRTTI >
- {
- private:
- Vector<String>& getIncludes(ShaderMetaData* obj) { return obj->includes; }
- void setIncludes(ShaderMetaData* obj, Vector<String>& includes) { obj->includes = includes; }
- public:
- ShaderMetaDataRTTI()
- {
- addPlainField("includes", 0, &ShaderMetaDataRTTI::getIncludes, &ShaderMetaDataRTTI::setIncludes);
- }
- virtual const String& getRTTIName()
- {
- static String name = "ShaderMetaData";
- return name;
- }
- virtual UINT32 getRTTIId()
- {
- return TID_ShaderMetaData;
- }
- virtual std::shared_ptr<IReflectable> newRTTIObject()
- {
- return bs_shared_ptr_new<ShaderMetaData>();
- }
- };
- }
|