1#include <Core/Utils/Log.hpp>
2#include <Engine/Data/BlinnPhongMaterial.hpp>
3#include <Engine/Data/RenderParameters.hpp>
4#include <Engine/Data/ShaderProgramManager.hpp>
5#include <Engine/RadiumEngine.hpp>
6#include <Engine/Rendering/RenderTechnique.hpp>
17using namespace Core::Utils;
21RenderTechnique::RenderTechnique() : m_numActivePass { 0 } {
22 for (
auto p = Index( 0 ); p < s_maxNbPasses; ++p ) {
23 m_activePasses[p] = PassConfiguration( Data::ShaderConfiguration(),
nullptr );
24 m_passesParameters[p] =
nullptr;
29 m_numActivePass { o.m_numActivePass },
30 m_dirtyBits { o.m_dirtyBits },
31 m_setPasses { o.m_setPasses } {
32 for (
auto p = Index( 0 ); p < m_numActivePass; ++p ) {
34 m_activePasses[p] = o.m_activePasses[p];
35 m_passesParameters[p] = o.m_passesParameters[p];
40RenderTechnique::~RenderTechnique() =
default;
43 Core::Utils::Index pass ) {
44 m_numActivePass =
std::max( m_numActivePass, pass + 1 );
57 Core::Utils::Index pass ) {
58 if ( m_numActivePass == 0 ) {
60 <<
"Unable to set pass parameters : is passes configured using setConfiguration ? ";
63 if ( pass.isValid() ) {
67 for (
int i = 0; i < m_numActivePass; ++i ) {
76 Core::Utils::Index pass ) {
77 if ( m_numActivePass == 0 ) {
79 <<
"Unable to set pass properties : is passes configured using setConfiguration ? ";
83 m_activePasses[pass].first.addProperties( props );
87 for (
int i = 0; i < m_numActivePass; ++i ) {
89 m_activePasses[i].first.addProperties( props );
103 auto shaderProgramManager = RadiumEngine::getInstance()->getShaderProgramManager();
105 for (
auto p = Index( 0 ); p < m_numActivePass; ++p ) {
107 ( (
nullptr == m_activePasses[p].second ) ||
isDirty( p ) ) ) {
108 m_activePasses[p].second =
109 shaderProgramManager->getShaderProgram( m_activePasses[p].first );
113 for (
auto p = Index( 0 ); p < m_numActivePass; ++p ) {
114 if ( m_passesParameters[p] ) { m_passesParameters[p]->updateGL(); }
120 if ( RadiumDefaultRenderTechnique !=
nullptr ) {
121 return *( RadiumDefaultRenderTechnique.
get() );
125 auto builder = EngineRenderTechniques::getDefaultTechnique(
"BlinnPhong" );
126 if ( !builder.first ) {
127 LOG( logERROR ) <<
"Unable to create the default technique : is the Engine initialized ? ";
129 builder.second( *rt,
false );
130 rt->setParametersProvider( mat );
131 RadiumDefaultRenderTechnique.
reset( rt );
132 return *( RadiumDefaultRenderTechnique.
get() );
138namespace EngineRenderTechniques {
146bool registerDefaultTechnique(
const std::string& name, DefaultTechniqueBuilder builder ) {
147 auto result = EngineTechniqueRegistry.insert( { name, builder } );
148 return result.second;
154bool removeDefaultTechnique(
const std::string& name ) {
155 std::size_t removed = EngineTechniqueRegistry.erase( name );
156 return ( removed == 1 );
165 auto search = EngineTechniqueRegistry.find( name );
166 if ( search != EngineTechniqueRegistry.end() ) {
return {
true, search->second }; }
167 auto result =
std::make_pair(
false, [name]( RenderTechnique&,
bool ) ->
void {
168 LOG( logERROR ) <<
"Undefined default technique for " << name <<
" !";
174 EngineTechniqueRegistry.clear();
Shader program parameter provider.
void setParametersProvider(std::shared_ptr< Data::ShaderParameterProvider > provider, Core::Utils::Index pass=Core::Utils::Index(-1))
void clearDirty(Core::Utils::Index pass=DefaultRenderingPasses::LIGHTING_OPAQUE)
void setConfiguration(const Data::ShaderConfiguration &newConfig, Core::Utils::Index pass=DefaultRenderingPasses::LIGHTING_OPAQUE)
const Data::ShaderParameterProvider * getParametersProvider(Core::Utils::Index pass=DefaultRenderingPasses::LIGHTING_OPAQUE) const
void addPassProperties(const std::list< std::string > &props, Core::Utils::Index pass=Core::Utils::Index {})
static RenderTechnique createDefaultRenderTechnique()
const Data::ShaderProgram * getShader(Core::Utils::Index pass=DefaultRenderingPasses::LIGHTING_OPAQUE) const
bool hasConfiguration(Core::Utils::Index pass=DefaultRenderingPasses::LIGHTING_OPAQUE) const
bool isDirty(Core::Utils::Index pass=DefaultRenderingPasses::LIGHTING_OPAQUE) const
void setDirty(Core::Utils::Index pass=DefaultRenderingPasses::LIGHTING_OPAQUE)
hepler function to manage enum as underlying types in VariableSet