Loading [MathJax]/jax/output/HTML-CSS/config.js
Radium Engine  1.5.28
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DataflowRenderer.cpp
1#include <Dataflow/Rendering/Renderer/DataflowRenderer.hpp>
2
3#include <Engine/Data/ShaderProgramManager.hpp>
4#include <Engine/Data/Texture.hpp>
5#include <Engine/Data/ViewingParameters.hpp>
6
7#include <Engine/Rendering/RenderObject.hpp>
8
9#include <Engine/Scene/DefaultCameraManager.hpp>
10#include <Engine/Scene/DefaultLightManager.hpp>
11
12#include <globjects/Framebuffer.h>
13
14using namespace Ra::Engine;
15using namespace Ra::Engine::Scene;
16using namespace Ra::Engine::Data;
17using namespace Ra::Engine::Rendering;
18using namespace gl;
19
20namespace Ra {
21namespace Dataflow {
22namespace Rendering {
23namespace Renderer {
24using namespace Ra::Dataflow::Core;
25
26DataflowRenderer::RenderGraphController::RenderGraphController() :
27 Ra::Core::Resources::ObservableVoid() {}
28
29void DataflowRenderer::RenderGraphController::configure( DataflowRenderer* renderer,
30 int w,
31 int h ) {
32 m_shaderMngr = renderer->m_shaderProgramManager;
33 m_width = w;
34 m_height = h;
35 if ( !m_graphToLoad.empty() ) {
36 loadGraph( m_graphToLoad );
37 m_graphToLoad = "";
38 }
39}
40
41void DataflowRenderer::RenderGraphController::resize( int w, int h ) {
42 m_width = w;
43 m_height = h;
44 if ( m_renderGraph ) { m_renderGraph->resize( m_width, m_height ); }
45}
46
47void DataflowRenderer::RenderGraphController::update( const Ra::Engine::Data::ViewingParameters& ) {
48
49 if ( m_renderGraph && m_renderGraph->m_recompile ) {
50 // compile the model
51 m_renderGraph->init();
52 // notify the view the model changes
53 notify();
54 // notify the model the view may have changed
55 m_renderGraph->resize( m_width, m_height );
56 }
57}
58
59void DataflowRenderer::RenderGraphController::loadGraph( const std::string filename ) {
60 m_renderGraph.release();
61 auto graphName = filename.substr( filename.find_last_of( '/' ) + 1 );
62 m_renderGraph = std::make_unique<RenderingGraph>( graphName );
63 m_renderGraph->setShaderProgramManager( m_shaderMngr );
64 m_renderGraph->loadFromJson( filename );
65 notify();
66}
67
68void DataflowRenderer::RenderGraphController::defferedLoadGraph( const std::string filename ) {
69 m_graphToLoad = filename;
70}
71
72void DataflowRenderer::RenderGraphController::saveGraph( const std::string filename ) {
73 if ( m_renderGraph ) {
74 auto graphName = filename.substr( filename.find_last_of( '/' ) + 1 );
75 m_renderGraph->saveToJson( filename );
76 m_renderGraph->setInstanceName( graphName );
77 }
78}
79
80void DataflowRenderer::RenderGraphController::resetGraph() {
81 m_renderGraph.release();
82 m_renderGraph = std::make_unique<RenderingGraph>( "untitled" );
83 m_renderGraph->setShaderProgramManager( m_shaderMngr );
84}
85
86// ------------------------------------------------------------------------------------------
87// Interface with Radium renderer ...
88// ------------------------------------------------------------------------------------------
89
90DataflowRenderer::DataflowRenderer( RenderGraphController& controller ) :
91 Renderer(), m_controller { controller }, m_name { m_controller.getRendererName() } {
92 m_controller.attachMember( this, &DataflowRenderer::graphChanged );
93}
94
96
97void DataflowRenderer::graphChanged() {
98 m_graphChanged = true;
99}
100
102 if ( m_controller.m_renderGraph ) {
103 if ( m_controller.m_renderGraph->m_recompile ) {
104 m_controller.m_renderGraph->init();
105 m_controller.resize( m_width, m_height );
106 }
107 m_controller.m_renderGraph->buildRenderTechnique( ro );
108 return true;
109 }
110 else { return false; }
111}
112
114 // uses several resources from the Radium engine
115 auto resourcesRootDir { RadiumEngine::getInstance()->getResourcesDir() + "Shaders/" };
116
118 { { "Hdr2Ldr" },
119 resourcesRootDir + "2DShaders/Basic2D.vert.glsl",
120 resourcesRootDir + "2DShaders/Hdr2Ldr.frag.glsl" } );
121
122 m_postprocessFbo = std::make_unique<globjects::Framebuffer>();
123}
124
126 auto cmngr = dynamic_cast<DefaultCameraManager*>(
127 Ra::Engine::RadiumEngine::getInstance()->getSystem( "DefaultCameraManager" ) );
128 if ( cmngr == nullptr ) {
129 cmngr = new DefaultCameraManager();
130 Ra::Engine::RadiumEngine::getInstance()->registerSystem( "DefaultCameraManager", cmngr );
131 }
132 auto lmngr = dynamic_cast<DefaultLightManager*>(
133 Ra::Engine::RadiumEngine::getInstance()->getSystem( "DefaultLightManager" ) );
134 if ( lmngr == nullptr ) {
135 lmngr = new DefaultLightManager();
136 Ra::Engine::RadiumEngine::getInstance()->registerSystem( "DefaultLightManager", lmngr );
137 }
138 m_lightmanagers.push_back( lmngr );
139
140 // Initialize renderer resources
142 m_controller.configure( this, m_width, m_height );
143
144 // TODO update shared textures as the rengerGraphe modify its output : observe the renderGraph
145 for ( const auto& t : m_sharedTextures ) {
146 m_secondaryTextures.insert( { t.first, t.second.get() } );
147 }
148}
149
151 // Resize the graph resources
152 m_controller.resize( m_width, m_height );
153
154 // Resize the internal resources
155 m_postprocessFbo->bind();
156 m_postprocessFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_fancyTexture->texture() );
157#ifdef PASSES_LOG
158 if ( m_postprocessFbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE ) {
159 LOG( Ra::Core::Utils::logERROR ) << "FBO Error (NodeBasedRenderer::m_postprocessFbo) : "
160 << m_postprocessFbo->statusString();
161 }
162#endif
163 // finished with fbo, unbind to bind default
164 globjects::Framebuffer::unbind();
165}
166
168 // std::cout << "DataflowRenderer::updateStepInternal() : calling update on graph controller."
169 // << std::endl;
170 m_controller.update( renderData );
171 if ( m_controller.m_renderGraph ) {
172 // Update renderTechnique if needed
173 if ( m_graphChanged ) {
175 m_graphChanged = false;
176 }
177 // TODO, improve light and camera management to prevent multiple alloc/copy ...
178 auto lights = getLights();
179 lights->clear();
180 lights->reserve( getLightManager()->count() );
181 for ( size_t i = 0; i < getLightManager()->count(); i++ ) {
182 lights->push_back( getLightManager()->getLight( i ) );
183 }
184 // The graph will take ownership of the light pointer ...
185 m_controller.m_renderGraph->setDataSources( allRenderObjects(), lights );
186 }
187}
188
190 // std::cout << "DataflowRenderer::renderInternal() : executing the graph." << std::endl;
191 // TODO, replace this kind of test by a call to a controller method
192 if ( m_controller.m_renderGraph && m_controller.m_renderGraph->m_ready ) {
193 // Cameras
194 // set input data
195 m_cameras.clear();
196 m_cameras.push_back( renderData );
197 m_controller.m_renderGraph->setCameras( &m_cameras );
198 // execute the graph
199 m_controller.m_renderGraph->execute();
200 // TODO : get all the resulting images (not only the "Beauty" channel
201 const auto& images = m_controller.m_renderGraph->getImagesOutput();
202 // The first image is the "beauty" channel, set the color texture to this
203 m_colorTexture = images[0];
204 }
205 else { m_colorTexture = nullptr; }
206}
207
209 if ( m_colorTexture ) {
210 m_postprocessFbo->bind();
211
212 // GL_ASSERT( glDrawBuffers( 1, buffers ) );
213 GL_ASSERT( glDrawBuffer( GL_COLOR_ATTACHMENT0 ) );
214 GL_ASSERT( glDisable( GL_DEPTH_TEST ) );
215 GL_ASSERT( glDepthMask( GL_FALSE ) );
216
217 auto shader = m_postProcessEnabled
219 : m_shaderProgramManager->getShaderProgram( "DrawScreen" );
220 shader->bind();
221 shader->setUniform( "screenTexture", m_colorTexture, 0 );
222 m_quadMesh->render( shader );
223
224 GL_ASSERT( glDepthMask( GL_TRUE ) );
225 GL_ASSERT( glEnable( GL_DEPTH_TEST ) );
226
227 m_postprocessFbo->unbind();
228 }
229}
230
232
234
235} // namespace Renderer
236} // namespace Rendering
237} // namespace Dataflow
238} // namespace Ra
239
240#if 0
241# include <RadiumNBR/NodeBasedRenderer.hpp>
242
243# include <Core/Containers/MakeShared.hpp>
244
245# ifdef PASSES_LOG
246# include <Core/Utils/Log.hpp>
247using namespace Ra::Core::Utils; // log
248# endif
249
250# include <Engine/Data/ShaderProgramManager.hpp>
251# include <Engine/Data/Texture.hpp>
252# include <Engine/Data/ViewingParameters.hpp>
253
254# include <Engine/Rendering/RenderObject.hpp>
255# include <Engine/Scene/DefaultCameraManager.hpp>
256# include <Engine/Scene/DefaultLightManager.hpp>
257
258# include <globjects/Framebuffer.h>
259
260# include <RadiumNBR/Passes/DebugPass.hpp>
261# include <RadiumNBR/Passes/UiPass.hpp>
262
263using namespace Ra::Engine;
264using namespace Ra::Engine::Scene;
265using namespace Ra::Engine::Data;
266using namespace Ra::Engine::Rendering;
267namespace RadiumNBR {
268using namespace gl;
269
270int NodeBasedRendererMagic = 0xFF0F00F0;
271
272static const GLenum buffers[] = { GL_COLOR_ATTACHMENT0 };
273
274static NodeBasedRenderer::RenderControlFunctor noOpController;
275
276NodeBasedRenderer::NodeBasedRenderer() : Renderer(), m_controller{ noOpController } {}
277
278NodeBasedRenderer::NodeBasedRenderer( NodeBasedRenderer::RenderControlFunctor& controller ) :
279 Renderer(), m_controller{ controller }, m_name{ m_controller.getRendererName() } {
280 setDisplayNode( m_originalRenderGraph.getDisplayNode() );
281}
282
283NodeBasedRenderer::~NodeBasedRenderer() {
284 m_displaySinkNode->detach( m_displayObserverId );
285 m_originalRenderGraph.destroy();
286}
287
288bool NodeBasedRenderer::buildRenderTechnique( RenderObject* ro ) const {
290 for ( size_t level = 0; level < m_originalRenderGraph.nodes_by_level()->size(); level++ )
291 {
292 for ( size_t node = 0; node < m_originalRenderGraph.nodes_by_level()->at( level ).size();
293 node++ )
294 {
295 m_originalRenderGraph.nodes_by_level()->at( level ).at( node )->buildRenderTechnique(
296 ro, *rt );
297 }
298 }
299 rt->updateGL();
300 ro->setRenderTechnique( rt );
301 return true;
302}
303
304void NodeBasedRenderer::initResources() {
305 // uses several resources from the Radium engine
306 auto resourcesRootDir{ RadiumEngine::getInstance()->getResourcesDir() + "Shaders/" };
307
308 m_shaderProgramManager->addShaderProgram(
309 { { "Hdr2Ldr" },
310 resourcesRootDir + "2DShaders/Basic2D.vert.glsl",
311 resourcesRootDir + "2DShaders/Hdr2Ldr.frag.glsl" } );
312
313 m_postprocessFbo = std::make_unique<globjects::Framebuffer>();
314}
315
316void NodeBasedRenderer::loadFromJson( const std::string& jsonFilePath ) {
317 m_jsonFilePath = jsonFilePath;
318
319 if ( m_jsonFilePath != "" )
320 {
321 m_originalRenderGraph.loadFromJson( jsonFilePath );
322 m_originalRenderGraph.init();
323 }
324 else
325 { std::cerr << "No Json was given to load a render graph." << std::endl; }
326}
327
328void NodeBasedRenderer::compileRenderGraph() {
329 m_originalRenderGraph.init();
330 m_originalRenderGraph.resize( m_width, m_height );
331 buildAllRenderTechniques();
332 m_displayedTexture = m_fancyTexture.get();
333}
334
335void NodeBasedRenderer::reloadRenderGraphFromJson() {
336 if ( m_jsonFilePath != "" )
337 {
338 std::cout << "Reloading Render Graph from Json..." << std::endl;
339 // Destroy the resources used by the nodes
340 m_originalRenderGraph.destroy();
341
342 // Clear the nodes
343 m_originalRenderGraph.clear_nodes();
344
345 // Reload
346 m_originalRenderGraph.loadFromJson( m_jsonFilePath );
347 m_originalRenderGraph.init();
348 m_originalRenderGraph.resize( m_width, m_height );
349 buildAllRenderTechniques();
350
351 // Reset displayed texture
352 m_displayedTexture = m_fancyTexture.get();
353
354 std::cout << "Render Graph Reloaded!" << std::endl;
355 }
356 else
357 { std::cerr << "No Json was given to reload a render graph." << std::endl; }
358}
359
360void NodeBasedRenderer::initializeInternal() {
361
362 // TODO : this must be done only once, see register system ...
363 auto cmngr = dynamic_cast<DefaultCameraManager*>(
364 Ra::Engine::RadiumEngine::getInstance()->getSystem( "DefaultCameraManager" ) );
365 if ( cmngr == nullptr )
366 {
367 cmngr = new DefaultCameraManager();
368 Ra::Engine::RadiumEngine::getInstance()->registerSystem( "DefaultCameraManager", cmngr );
369 }
370 auto lmngr = dynamic_cast<DefaultLightManager*>(
371 Ra::Engine::RadiumEngine::getInstance()->getSystem( "DefaultLightManager" ) );
372 if ( lmngr == nullptr )
373 {
374 lmngr = new DefaultLightManager();
375 Ra::Engine::RadiumEngine::getInstance()->registerSystem( "DefaultLightManager", lmngr );
376 }
377 m_lightmanagers.push_back( lmngr );
378
379 // Initialize renderer resources
380 initResources();
381 m_controller.configure( this, m_width, m_height );
382
383 for ( const auto& t : m_sharedTextures )
384 { m_secondaryTextures.insert( { t.first, t.second.get() } ); }
385
386 // Todo cache this in an attribute ?
387 auto resourcesCheck = Ra::Core::Resources::getResourcesPath(
388 reinterpret_cast<void*>( &RadiumNBR::NodeBasedRendererMagic ), { "Resources/RadiumNBR" } );
389 if ( !resourcesCheck )
390 {
391 LOG( Ra::Core::Utils::logERROR ) << "Unable to find resources for NodeBasedRenderer!";
392 return;
393 }
394 auto resourcesPath{ *resourcesCheck };
395}
396
397void NodeBasedRenderer::resizeInternal() {
398 // Resize each internal resources
399 m_controller.resize( m_width, m_height );
400 m_originalRenderGraph.resize( m_width, m_height );
401
402 m_postprocessFbo->bind();
403 m_postprocessFbo->attachTexture( GL_COLOR_ATTACHMENT0, m_fancyTexture->texture() );
404# ifdef PASSES_LOG
405 if ( m_postprocessFbo->checkStatus() != GL_FRAMEBUFFER_COMPLETE )
406 {
407 LOG( Ra::Core::Utils::logERROR ) << "FBO Error (NodeBasedRenderer::m_postprocessFbo) : "
408 << m_postprocessFbo->checkStatus();
409 }
410# endif
411 // finished with fbo, unbind to bind default
412 globjects::Framebuffer::unbind();
413}
414
415void NodeBasedRenderer::renderInternal( const ViewingParameters& renderData ) {
416 // Run the render graph
417 m_originalRenderGraph.execute();
418}
419
420// Draw debug stuff, do not overwrite depth map but do depth testing
421void NodeBasedRenderer::debugInternal( const ViewingParameters& renderData ) {
422# if 0
423 if ( m_drawDebug )
424 {
425 const ShaderProgram* shader;
426
427 m_postprocessFbo->bind();
428 GL_ASSERT( glDisable( GL_BLEND ) );
429 GL_ASSERT( glEnable( GL_DEPTH_TEST ) );
430 GL_ASSERT( glDepthMask( GL_FALSE ) );
431 GL_ASSERT( glDepthFunc( GL_LESS ) );
432
433 glDrawBuffers( 1, buffers );
434
435 for ( const auto& ro : m_debugRenderObjects )
436 {
437 ro->render( RenderParameters{}, renderData );
438 }
439
440 DebugRender::getInstance()->render( renderData.viewMatrix, renderData.projMatrix );
441
442 m_postprocessFbo->unbind();
443
444 m_uiXrayFbo->bind();
445 // Draw X rayed objects always on top of normal objects
446 GL_ASSERT( glDepthMask( GL_TRUE ) );
447 GL_ASSERT( glClear( GL_DEPTH_BUFFER_BIT ) );
448 for ( const auto& ro : m_xrayRenderObjects )
449 {
450 if ( ro->isVisible() )
451 {
452 shader = ro->getRenderTechnique()->getShader();
453
454 // bind data
455 shader->bind();
456 // lighting for Xray : fixed
457 shader->setUniform( "light.color", Ra::Core::Utils::Color::Grey( 5.0 ) );
458 shader->setUniform( "light.type", Light::LightType::DIRECTIONAL );
459 shader->setUniform( "light.directional.direction", Ra::Core::Vector3( 0, -1, 0 ) );
460
461 Ra::Core::Matrix4 M = ro->getTransformAsMatrix();
462 shader->setUniform( "transform.proj", renderData.projMatrix );
463 shader->setUniform( "transform.view", renderData.viewMatrix );
464 shader->setUniform( "transform.model", M );
465
466 ro->getRenderTechnique()->getMaterial()->bind( shader );
467
468 // render
469 ro->getMesh()->render();
470 }
471 }
472 m_uiXrayFbo->unbind();
473 }
474# endif
475}
476
477// Draw UI stuff, always drawn on top of everything else + clear ZMask
478// TODO: NODEGRAPH! Unused ?
479void NodeBasedRenderer::uiInternal( const ViewingParameters& renderData ) {
480# if 0
481 const ShaderProgram* shader;
482
483 m_uiXrayFbo->bind();
484 glDrawBuffers( 1, buffers );
485 // Enable z-test
486 GL_ASSERT( glDepthMask( GL_TRUE ) );
487 GL_ASSERT( glEnable( GL_DEPTH_TEST ) );
488 GL_ASSERT( glDepthFunc( GL_LESS ) );
489 GL_ASSERT( glClear( GL_DEPTH_BUFFER_BIT ) );
490 for ( const auto& ro : m_uiRenderObjects )
491 {
492 if ( ro->isVisible() )
493 {
494 shader = ro->getRenderTechnique()->getShader();
495
496 // bind data
497 shader->bind();
498
499 Ra::Core::Matrix4 M = ro->getTransformAsMatrix();
500 Ra::Core::Matrix4 MV = renderData.viewMatrix * M;
501 Ra::Core::Vector3 V = MV.block<3, 1>( 0, 3 );
502 Scalar d = V.norm();
503
504 Ra::Core::Matrix4 S = Ra::Core::Matrix4::Identity();
505 S.coeffRef( 0, 0 ) = S.coeffRef( 1, 1 ) = S.coeffRef( 2, 2 ) = d;
506
507 M = M * S;
508
509 shader->setUniform( "transform.proj", renderData.projMatrix );
510 shader->setUniform( "transform.view", renderData.viewMatrix );
511 shader->setUniform( "transform.model", M );
512
513 ro->getRenderTechnique()->getMaterial()->bind( shader );
514
515 // render
516 ro->getMesh()->render();
517 }
518 }
519 m_uiXrayFbo->unbind();
520# endif
521}
522
523void NodeBasedRenderer::postProcessInternal( const ViewingParameters& /* renderData */ ) {
524 if ( m_colorTexture )
525 {
526 m_postprocessFbo->bind();
527
528 // GL_ASSERT( glDrawBuffers( 1, buffers ) );
529 GL_ASSERT( glDrawBuffer( GL_COLOR_ATTACHMENT0 ) );
530 GL_ASSERT( glDisable( GL_DEPTH_TEST ) );
531 GL_ASSERT( glDepthMask( GL_FALSE ) );
532
533 auto shader = m_postProcessEnabled
534 ? m_shaderProgramManager->getShaderProgram( "Hdr2Ldr" )
535 : m_shaderProgramManager->getShaderProgram( "DrawScreen" );
536 shader->bind();
537 shader->setUniform( "screenTexture", m_colorTexture, 0 );
538 m_quadMesh->render( shader );
539
540 GL_ASSERT( glDepthMask( GL_TRUE ) );
541 GL_ASSERT( glEnable( GL_DEPTH_TEST ) );
542
543 m_postprocessFbo->unbind();
544 }
545}
546
547void NodeBasedRenderer::updateStepInternal( const ViewingParameters& renderData ) {
548 if ( m_reloadJson )
549 {
550 reloadRenderGraphFromJson();
551 if ( m_resetPath )
552 {
553 m_jsonFilePath = m_jsonFilePath.substr( 0, m_jsonFilePath.rfind( '/' ) + 1 );
554 m_resetPath = false;
555 }
556 m_reloadJson = false;
557 }
558
559 if ( m_originalRenderGraph.m_recompile )
560 {
561 std::cerr << "NodeBasedRenderer::updateStepInternal :Recompiling Graph\n";
562 compileRenderGraph();
563 m_originalRenderGraph.m_recompile = false;
564 }
565
566 // Render objects
567 m_originalRenderGraph.getDataNode<NodeTypeRenderObject>()->setElements( *allRenderObjects() );
568 // Lights
570 for ( size_t i = 0; i < getLightManager()->count(); i++ )
571 { lights.push_back( getLightManager()->getLight( i ) ); }
572 m_originalRenderGraph.getDataNode<NodeTypeLight>()->setElements( lights );
573 // Cameras
575 cameras.push_back( renderData );
576 m_originalRenderGraph.getDataNode<NodeTypeCamera>()->setElements( cameras );
577 // Update the render graph
578
579 m_originalRenderGraph.update();
580}
581
582void NodeBasedRenderer::setDisplayNode( DisplaySinkNode* displayNode ) {
583 m_displaySinkNode = displayNode;
584 m_displayObserverId =
585 m_displaySinkNode->attachMember( this, &NodeBasedRenderer::observeDisplaySink );
586}
587
588void NodeBasedRenderer::observeDisplaySink( const std::vector<NodeTypeTexture*>& graphOutput ) {
589 // TODO : find a way to make the renderer observable to manage ouput texture in the applicaiton
590 // gui if needed
591 std::cout << "NodeBasedRenderer::observeDisplaySink - connected textures ("
592 << graphOutput.size() << ") : \n";
593 /*
594 for ( const auto t : graphOutput )
595 {
596 if ( t ) { std::cout << "\t" << t->getName() << "\n"; }
597 else
598 { std::cout << "\tName not available yet. Must run the graph a first time\n"; }
599 }
600 */
601 // Add display nodes' linked textures to secondary textures
602 m_secondaryTextures.clear();
603 for ( const auto& t : m_sharedTextures )
604 { m_secondaryTextures.insert( { t.first, t.second.get() } ); }
605
606 bool colorTextureSet = false;
607 if ( m_displaySinkNode )
608 {
609 auto textures = m_displaySinkNode->getTextures();
610 for ( const auto t : textures )
611 {
612# ifdef GRAPH_CALL_TRACE
613 std::cout << t->getName() << std::endl;
614# endif
615 if ( t )
616 {
617 if ( !colorTextureSet )
618 {
619 m_colorTexture = t;
620 colorTextureSet = true;
621 }
622 else
623 { m_secondaryTextures.insert( { t->getName(), t } ); }
624 }
625 }
626 }
627
628 if ( !colorTextureSet )
629 {
630 m_colorTexture = m_fancyTexture.get();
631 colorTextureSet = true;
632 }
633}
634
635} // namespace RadiumNBR
636#endif
int attachMember(T *object, void(T::*observer)(Args...))
void updateStepInternal(const Ra::Engine::Data::ViewingParameters &renderData) override
void postProcessInternal(const Ra::Engine::Data::ViewingParameters &renderData) override
Do all post processing stuff. If you override this method, be careful to fill.
void renderInternal(const Ra::Engine::Data::ViewingParameters &renderData) override
All the scene rendering magics basically happens here.
~DataflowRenderer() override
The destructor is used to destroy the render graph.
bool buildRenderTechnique(Ra::Engine::Rendering::RenderObject *ro) const override
void initializeInternal() override
Sets the display sink node.
void debugInternal(const Ra::Engine::Data::ViewingParameters &renderData) override
Add the debug layer with useful informations.
void uiInternal(const Ra::Engine::Data::ViewingParameters &renderData) override
Draw the UI data.
Ra::Engine::Scene::LightManager * getLightManager()
Access the default light manager.
Management of shader parameters with automatic binding of a named parameter to the corresponding glsl...
Core::Utils::optional< const Data::ShaderProgram * > addShaderProgram(const Data::ShaderConfiguration &config)
const Data::ShaderProgram * getShaderProgram(const std::string &id)
void setUniform(const char *name, const T &value) const
Uniform setters.
void render(const Data::RenderParameters &lightParams, const Data::ViewingParameters &viewParams, const Data::ShaderProgram *shader, const Data::RenderParameters &shaderParams)
Data::ShaderProgramManager * m_shaderProgramManager
Definition Renderer.hpp:436
std::vector< Ra::Engine::Scene::LightManager * > m_lightmanagers
Definition Renderer.hpp:455
std::unique_ptr< Data::Texture > m_fancyTexture
Final color texture : might be attached to the main framebuffer.
Definition Renderer.hpp:475
std::map< std::string, Data::Texture * > m_secondaryTextures
Textures exposed in the texture section box to be displayed.
Definition Renderer.hpp:477
DefaultCameraManager. A simple Camera Manager with a list of Cameras.
DefaultLightManager. A simple Light Manager with a list of lights.
virtual size_t count() const
Number of lights. This is still a work in progress. The idea is to make it possible for a LightManage...
T clear(T... args)
T endl(T... args)
T find_last_of(T... args)
optional< std::string > getResourcesPath(void *symbol, const std::string &pattern)
Search for general resource path.
Definition Resources.cpp:55
std::shared_ptr< T > make_shared(Args &&... args)
(GPU) Data representation, along with manager
Rendering engines.
Scene and how to communicate.
This namespace contains engine and ECS related stuff.
hepler function to manage enum as underlying types in VariableSet
Definition Cage.cpp:4
T push_back(T... args)
T resize(T... args)
T size(T... args)
virtual void update(const Ra::Engine::Data::ViewingParameters &renderData)
virtual void configure(DataflowRenderer *renderer, int w, int h)
the set of viewing parameters extracted from the camera and given to the renderer
T substr(T... args)