//********************************** Banshee Engine (www.banshee3d.com) **************************************************// //**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************// #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 (for example 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 TMaterialDataParam { public: TMaterialDataParam(const String& name, const SPtr& params, const SPtr>>& gpuParams); TMaterialDataParam() { } /** @copydoc TGpuDataParam::set */ void set(const T& value, UINT32 arrayIdx = 0) const; /** @copydoc TGpuDataParam::get */ T get(UINT32 arrayIdx = 0) const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mGPUParams == nullptr; } protected: UINT32 mParamIndex; UINT32 mArraySize; SPtr mMaterialParams; SPtr>> mGPUParams; }; /** @copydoc TMaterialDataParam */ template class TMaterialDataParam { public: TMaterialDataParam(const SPtr>>& params); TMaterialDataParam() { } /** @copydoc TGpuDataParam::set */ void set(const T& value, UINT32 arrayIdx = 0) const; /** @copydoc TGpuDataParam::get */ T get(UINT32 arrayIdx = 0) const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mParams == nullptr; } 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) const; /** @copydoc TGpuParamStruct::get */ void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const; /** @copydoc TGpuParamStruct::getElementSize */ UINT32 getElementSize() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mGPUParams == nullptr; } 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) const; /** @copydoc TGpuParamStruct::get */ void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0) const; /** @copydoc TGpuParamStruct::getElementSize */ UINT32 getElementSize() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mParams == nullptr; } 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) const; /** @copydoc GpuParamTexture::get */ HTexture get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mGPUParams == nullptr; } 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) const; /** @copydoc GpuParamTexture::get */ SPtr get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mParams == nullptr; } 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) const; /** @copydoc GpuParamLoadStoreTexture::get */ HTexture get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mGPUParams == nullptr; } 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 = TextureSurface()) const; /** @copydoc GpuParamLoadStoreTexture::get */ SPtr get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mParams == nullptr; } protected: SPtr>> mParams; }; /** @copydoc TMaterialDataParam */ template class BS_CORE_EXPORT TMaterialParamBuffer { }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamBuffer { public: TMaterialParamBuffer(const String& name, const SPtr& params, const SPtr>>& gpuParams); TMaterialParamBuffer() { } /** @copydoc GpuParamBuffer::set */ void set(const SPtr& buffer) const; /** @copydoc GpuParamBuffer::get */ SPtr get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mGPUParams == nullptr; } protected: UINT32 mParamIndex; SPtr mMaterialParams; SPtr>> mGPUParams; }; /** @copydoc TMaterialDataParam */ template<> class BS_CORE_EXPORT TMaterialParamBuffer { public: TMaterialParamBuffer(const SPtr>>& params); TMaterialParamBuffer() { } /** @copydoc GpuParamBuffer::set */ void set(const SPtr& buffer) const; /** @copydoc GpuParamBuffer::get */ SPtr get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mParams == nullptr; } 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) const; /** @copydoc GpuParamSampState::get */ SPtr get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mGPUParams == nullptr; } 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) const; /** @copydoc GpuParamSampState::get */ SPtr get() const; /** Checks if param is initialized. */ bool operator==(const nullptr_t& nullval) const { return mParams == nullptr; } protected: SPtr>> mParams; }; /** @} */ /** @addtogroup Material * @{ */ typedef TMaterialDataParam MaterialParamFloat; typedef TMaterialDataParam MaterialParamVec2; typedef TMaterialDataParam MaterialParamVec3; typedef TMaterialDataParam MaterialParamVec4; typedef TMaterialDataParam MaterialParamInt; typedef TMaterialDataParam MaterialParamVec2I; typedef TMaterialDataParam MaterialParamVec3I; typedef TMaterialDataParam MaterialParamVec4I; typedef TMaterialDataParam MaterialParamMat3; typedef TMaterialDataParam MaterialParamMat4; typedef TMaterialDataParam MaterialParamColor; typedef TMaterialDataParam MaterialParamFloatCore; typedef TMaterialDataParam MaterialParamVec2Core; typedef TMaterialDataParam MaterialParamVec3Core; typedef TMaterialDataParam MaterialParamVec4Core; typedef TMaterialDataParam MaterialParamIntCore; typedef TMaterialDataParam MaterialParamVec2ICore; typedef TMaterialDataParam MaterialParamVec3ICore; typedef TMaterialDataParam MaterialParamVec4ICore; typedef TMaterialDataParam MaterialParamMat3Core; typedef TMaterialDataParam MaterialParamMat4Core; typedef TMaterialDataParam MaterialParamColorCore; typedef TMaterialParamStruct MaterialParamStruct; typedef TMaterialParamStruct MaterialParamStructCore; typedef TMaterialParamTexture MaterialParamTexture; typedef TMaterialParamTexture MaterialParamTextureCore; typedef TMaterialParamLoadStoreTexture MaterialParamLoadStoreTexture; typedef TMaterialParamLoadStoreTexture MaterialParamLoadStoreTextureCore; typedef TMaterialParamBuffer MaterialParamBuffer; typedef TMaterialParamBuffer MaterialParamBufferCore; typedef TMaterialParamSampState MaterialParamSampState; typedef TMaterialParamSampState MaterialParamSampStateCore; /** @} */ }