#pragma once #include "BsCorePrerequisites.h" #include "BsGpuParam.h" namespace BansheeEngine { /** @addtogroup Implementation * @{ */ class MaterialParams; /** * A handle that allows you to set a Material parameter. Internally keeps a reference to the material parameters so that * possibly expensive lookup of parameter name can be avoided each time the parameter is accessed, and instead the * handle can be cached. * * @note * This is pretty much identical to GPU parameter version (e.g. TGpuDataParam), except that this will get/set parameter * values on all GPU programs attached to the material, while TGpuDataParam works only for single GPU program's * parameters. Also, additional parameters that might be optimized out in the GPU program will still exist here as long * as they're defined in the shader used by the material, which is not the case with TGpuDataParam. * @note * For core-thread version of this class no shader-based caching is done, and instead this represents just a wrapper * for multiple GPU parameters. * * @see Material */ template class BS_CORE_EXPORT TMaterialDataParam { }; /** @copydoc TMaterialDataParam */ template class BS_CORE_EXPORT TMaterialDataParam { public: TMaterialDataParam(const String& name, const SPtr& params, const SPtr>>& gpuParams); TMaterialDataParam() { } /** @copydoc TGpuDataParam::set */ void set(const T& value, UINT32 arrayIdx = 0); /** @copydoc TGpuDataParam::get */ T get(UINT32 arrayIdx = 0); protected: UINT32 mParamIndex; UINT32 mArraySize; SPtr mMaterialParams; SPtr>> mGPUParams; }; /** @copydoc TMaterialDataParam */ template class BS_CORE_EXPORT TMaterialDataParam { public: TMaterialDataParam(const SPtr>>& params); TMaterialDataParam() { } /** @copydoc TGpuDataParam::set */ void set(const T& value, UINT32 arrayIdx = 0); /** @copydoc TGpuDataParam::get */ T get(UINT32 arrayIdx = 0); protected: SPtr>> mParams; }; /** @copydoc TMaterialDataParam */ template class BS_CORE_EXPORT TMaterialParamStruct { }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamStruct { public: TMaterialParamStruct(const String& name, const SPtr& params, const SPtr>>& gpuParams); TMaterialParamStruct() { } /** @copydoc TGpuParamStruct::set */ void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0); /** @copydoc TGpuParamStruct::get */ void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0); /** @copydoc TGpuParamStruct::getElementSize */ UINT32 getElementSize() const; protected: UINT32 mParamIndex; UINT32 mArraySize; SPtr mMaterialParams; SPtr>> mGPUParams; }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamStruct { public: TMaterialParamStruct(const SPtr>>& params); TMaterialParamStruct() { } /** @copydoc TGpuParamStruct::set */ void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0); /** @copydoc TGpuParamStruct::get */ void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0); /** @copydoc TGpuParamStruct::getElementSize */ UINT32 getElementSize() const; protected: SPtr>> mParams; }; /** @copydoc TMaterialDataParam */ template class BS_CORE_EXPORT TMaterialParamTexture { }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamTexture { public: TMaterialParamTexture(const String& name, const SPtr& params, const SPtr>>& gpuParams); TMaterialParamTexture() { } /** @copydoc GpuParamTexture::set */ void set(const HTexture& texture); /** @copydoc GpuParamTexture::get */ HTexture get(); protected: UINT32 mParamIndex; SPtr mMaterialParams; SPtr>> mGPUParams; }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamTexture { public: TMaterialParamTexture(const SPtr>>& params); TMaterialParamTexture() { } /** @copydoc GpuParamTexture::set */ void set(const SPtr& texture); /** @copydoc GpuParamTexture::get */ SPtr get(); protected: SPtr>> mParams; }; /** @copydoc TMaterialDataParam */ template class BS_CORE_EXPORT TMaterialParamLoadStoreTexture { }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamLoadStoreTexture { public: TMaterialParamLoadStoreTexture(const String& name, const SPtr& params, const SPtr>>& gpuParams); TMaterialParamLoadStoreTexture() { } /** @copydoc GpuParamLoadStoreTexture::set */ void set(const HTexture& texture, const TextureSurface& surface); /** @copydoc GpuParamLoadStoreTexture::get */ HTexture get(); protected: UINT32 mParamIndex; SPtr mMaterialParams; SPtr>> mGPUParams; }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamLoadStoreTexture { public: TMaterialParamLoadStoreTexture(const SPtr>>& params); TMaterialParamLoadStoreTexture() { } /** @copydoc GpuParamLoadStoreTexture::set */ void set(const SPtr& texture, const TextureSurface& surface); /** @copydoc GpuParamLoadStoreTexture::get */ SPtr get(); protected: SPtr>> mParams; }; /** @copydoc TMaterialDataParam */ template class BS_CORE_EXPORT TMaterialParamSampState { }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamSampState { public: TMaterialParamSampState(const String& name, const SPtr& params, const SPtr>>& gpuParams); TMaterialParamSampState() { } /** @copydoc GpuParamSampState::set */ void set(const SPtr& sampState); /** @copydoc GpuParamSampState::get */ SPtr get(); protected: UINT32 mParamIndex; SPtr mMaterialParams; SPtr>> mGPUParams; }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamSampState { public: TMaterialParamSampState(const SPtr>>& params); TMaterialParamSampState() { } /** @copydoc GpuParamSampState::set */ void set(const SPtr& sampState); /** @copydoc GpuParamSampState::get */ SPtr get(); protected: SPtr>> mParams; }; /** @} */ /** @addtogroup Material * @{ */ typedef TMaterialDataParam MaterialParamFloat; typedef TMaterialDataParam MaterialParamColor; typedef TMaterialDataParam MaterialParamVec2; typedef TMaterialDataParam MaterialParamVec3; typedef TMaterialDataParam MaterialParamVec4; typedef TMaterialDataParam MaterialParamMat3; typedef TMaterialDataParam MaterialParamMat4; typedef TMaterialDataParam MaterialParamFloatCore; typedef TMaterialDataParam MaterialParamColorCore; typedef TMaterialDataParam MaterialParamVec2Core; typedef TMaterialDataParam MaterialParamVec3Core; typedef TMaterialDataParam MaterialParamVec4Core; typedef TMaterialDataParam MaterialParamMat3Core; typedef TMaterialDataParam MaterialParamMat4Core; typedef TMaterialParamStruct MaterialParamStruct; typedef TMaterialParamStruct MaterialParamStructCore; typedef TMaterialParamTexture MaterialParamTexture; typedef TMaterialParamTexture MaterialParamTextureCore; typedef TMaterialParamLoadStoreTexture MaterialParamLoadStoreTexture; typedef TMaterialParamLoadStoreTexture MaterialParamLoadStoreTextureCore; typedef TMaterialParamSampState MaterialParamSampState; typedef TMaterialParamSampState MaterialParamSampStateCore; /** @} */ }