Files
LifeProject/LifeGraphics/render/IMaterialProxy.cpp
T
2025-05-13 02:46:21 +03:00

92 lines
2.0 KiB
C++

#include "render/IMaterialProxy.h"
#include "IObjectMesh.h"
namespace LifeGraphics
{
IMaterial* IMaterialProxy::GetBaseMaterial()
{
return base;
}
bool IMaterialProxy::SelectTechnique(MaterialTechnique tech)
{
TechniqueCollectionItr it = technics.find(tech);
if(it != technics.end()){
active_technique = it->second;
return true;
}
else //try to request it from parent material
{
IMaterialTechnique* t = base->CreateTechnique(MT_RENDER_DEFERRED,this);
if(t == nullptr) return false;
active_technique = t;
return AddTechnique(t);
}
return false;
}
IMaterialProxy::IMaterialProxy(IMaterial* source, IObjectMesh* _geom)
:active_technique(nullptr)
{
base = source;
geom = _geom;
}
bool IMaterialProxy::AddTechnique(IMaterialTechnique* tech)
{
TechniqueCollectionItr it = technics.find(tech->GetTechniqueType());
if(it != technics.end())//found
return false;
else
{
technics[tech->GetTechniqueType()] = tech;
return true;
}
}
IMaterialTechnique* IMaterialProxy::GetTechnique()
{
return active_technique;
}
bool IMaterialTechnique::SelectPass(MaterialPass pass)
{
if(active_pass != NULL && active_pass->GetPassType() == pass)
return true;
PassCollectionItr it = passes.find(pass);
if(it != passes.end())
{
active_pass = it->second;
return true;
}
//pass not found -> try to create it!
IMaterialPass* newpass = parent->GetBaseMaterial()->CreatePass(this, pass);
if(newpass != nullptr)
{
active_pass = newpass;
return true;
}
return false;
}
IMaterialPass* IMaterialTechnique::GetPass()
{
return active_pass;
}
bool IMaterialTechnique::AddPass(IMaterialPass* pass)
{
PassCollectionItr it = passes.find(pass->GetPassType());
if(it != passes.end()) //found
return false;
else
{
passes[pass->GetPassType()] = pass;
return true;
}
}
IMaterialTechnique::IMaterialTechnique(MaterialTechnique tech, IMaterialProxy* _parent)
:active_pass(nullptr), tech_type(tech), parent(_parent)
{
}
MaterialTechnique IMaterialTechnique::GetTechniqueType()
{
return tech_type;
}
}