#pragma once class BaseMaterial { public: BaseMaterial() = default; virtual ~BaseMaterial(); BaseMaterial(const BaseMaterial& other) = delete; BaseMaterial(BaseMaterial&& other) noexcept = delete; BaseMaterial& operator=(const BaseMaterial& other) = delete; BaseMaterial& operator=(BaseMaterial&& other) noexcept = delete; virtual void Initialize(const D3D11Context& d3d11Context, UINT materialId) = 0; virtual TextureData* GetOpacityTexture() { return nullptr; } // added bool HasTransparency() const { return m_HasTransparency; } // added void SetTransparencyShadows(bool hasTransparency) { m_HasTransparency = hasTransparency; } // added const MaterialTechniqueContext& GetTechniqueContext() const { return m_TechniqueContext; } const MaterialTechniqueContext& GetTechniqueContext(int index) const; UINT GetMaterialId() const { return m_MaterialId; } bool HasValidMaterialId() const { return m_MaterialId != UINT_MAX; } bool IsValid() const { return HasValidMaterialId() && m_IsInitialized; } ID3DX11EffectVariable* GetVariable(const std::wstring& varName) const; void SetVariable(const std::wstring& varName, const void* pData, uint32_t byteOffset, uint32_t byteCount) const; void SetVariable_Scalar(const std::wstring& varName, float scalar) const; void SetVariable_Scalar(const std::wstring& varName, bool scalar) const; void SetVariable_Scalar(const std::wstring& varName, int scalar) const; void SetVariable_Matrix(const std::wstring& varName, XMFLOAT4X4 matrix) const; void SetVariable_Matrix(const std::wstring& varName, const float* pData) const; void SetVariable_MatrixArray(const std::wstring& varName, const float* pData, UINT count) const; void SetVariable_Vector(const std::wstring& varName, const float* pData) const; void SetVariable_Vector(const std::wstring& varName, XMFLOAT3 vector) const; void SetVariable_Vector(const std::wstring& varName, XMFLOAT4 vector) const; void SetVariable_VectorArray(const std::wstring& varName, const float* pData, UINT count) const; void SetVariable_Texture(const std::wstring& varName, const TextureData* pTexture) const; void SetVariable_Texture(const std::wstring& varName, ID3D11ShaderResourceView* pSRV) const; void SetTechnique(const std::wstring& techName); void SetTechnique(int index); void ResetMaterialId() { m_MaterialId = UINT_MAX; } void SetMaterialName(const std::wstring& name) { m_MaterialName = name; m_MaterialNameUtf8 = StringUtil::utf8_encode(name); } void UpdateEffectVariables(const SceneContext& sceneContext, const ModelComponent* pModelComponent); void UpdateEffectVariables(const SceneContext& sceneContext, const RenderTarget* pSourceTarget); void DrawImGui(); protected: #pragma region BaseVariables (preset variable by semantic) enum class eRootVariable { WORLD, VIEW, VIEW_INVERSE, WORLD_VIEW_PROJECTION, COUNT //@End }; static std::map m_RootVariableSemanticLUT; ID3DX11EffectVariable* m_RootVariableLUT[static_cast(eRootVariable::COUNT)]{}; #pragma endregion virtual const std::map& GetVariableIndexLUT() const = 0; virtual int GetRootVariableIndex(eRootVariable rootVariable) const = 0; virtual const std::map& GetTechniques() const = 0; virtual const std::wstring& GetEffectName() const = 0; //Internal Material Implementation void _baseInitialize(ID3DX11Effect* pRootEffect, UINT materialId); virtual void InitializeEffectVariables() = 0; virtual void OnUpdateModelVariables(const SceneContext& /*sceneContext*/, const ModelComponent* /*pModel*/) const {}; MaterialTechniqueContext m_TechniqueContext{}; UINT m_numTechniques{}; std::wstring m_MaterialName; std::string m_MaterialNameUtf8; bool m_HasTransparency{}; private: UINT m_MaterialId{UINT_MAX}; bool m_IsInitialized{}; bool m_DrawImGui{}; ID3DX11Effect* m_pEffect{}; bool NeedsUpdate(UINT frame, UINT id) const; UINT m_LastUpdateFrame{}; UINT m_LastUpdateID{}; };