Carna  Version 3.0.1
FrameRendererHelper.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2010 - 2015 Leonid Kostrykin
3  *
4  * Chair of Medical Engineering (mediTEC)
5  * RWTH Aachen University
6  * Pauwelsstr. 20
7  * 52074 Aachen
8  * Germany
9  *
10  */
11 
12 #ifndef FRAMERENDERERHELPER_H_6014714286
13 #define FRAMERENDERERHELPER_H_6014714286
14 
15 #include <Carna/Carna.h>
16 #include <Carna/base/Log.h>
17 #include <Carna/base/text.h>
19 #include <Carna/base/RenderStage.h>
20 #include <Carna/base/GLContext.h>
24 #include <set>
25 
30 namespace Carna
31 {
32 
33 namespace helpers
34 {
35 
36 
37 
38 // ----------------------------------------------------------------------------------
39 // DefaultRenderStageOrder
40 // ----------------------------------------------------------------------------------
41 
49 class CARNA_LIB DefaultRenderStageOrder : std::binary_function< base::RenderStage*, base::RenderStage*, bool >
50 {
51 
52 public:
53 
57  bool operator()( const base::RenderStage* x, const base::RenderStage* y ) const;
58 
59 }; // DefaultRenderStageOrder
60 
61 
62 
63 // ----------------------------------------------------------------------------------
64 // FrameRendererHelper
65 // ----------------------------------------------------------------------------------
66 
77 template< typename RenderStageOrder >
79 {
80 
82 
83  std::set< base::RenderStage*, RenderStageOrder > stages;
84 
85 public:
86 
91 
96 
102 
107 
111  void reset();
112 
117  void commit( bool clear = true );
118 
119 }; // FrameRendererHelper
120 
121 
122 template< typename RenderStageOrder >
124  : renderer( renderer )
125 {
126 }
127 
128 
129 template< typename RenderStageOrder >
131 {
132  reset();
133 }
134 
135 
136 template< typename RenderStageOrder >
138 {
139  std::for_each( stages.begin(), stages.end(), std::default_delete< base::RenderStage >() );
140  stages.clear();
141 }
142 
143 
144 template< typename RenderStageOrder >
146 {
147  if( clear )
148  {
149  renderer.clearStages();
150  }
151  presets::MeshColorCodingStage* mccs = nullptr;
152  presets::OccludedRenderingStage* occluded = nullptr;
153  unsigned int registeredMeshColorCodingStages = 0;
154  unsigned int enabledOccludedStages = 0;
155  for( auto stageItr = stages.begin(); stageItr != stages.end(); ++stageItr )
156  {
157  base::RenderStage* const rs = *stageItr;
158  renderer.appendStage( rs );
159 
160  if( mccs == nullptr )
161  {
162  mccs = dynamic_cast< presets::MeshColorCodingStage* >( rs );
163  }
164  if( occluded == nullptr )
165  {
166  occluded = dynamic_cast< presets::OccludedRenderingStage* >( rs );
167  }
168 
169  base::MeshRenderingStageBase* const meshRenderer = dynamic_cast< base::MeshRenderingStageBase* >( rs );
170  if( meshRenderer != nullptr && mccs != nullptr )
171  {
172  mccs->putGeometryType( meshRenderer->geometryType, meshRenderer->ROLE_DEFAULT_MESH );
173  mccs->enableMaterials( meshRenderer->geometryType, meshRenderer->ROLE_DEFAULT_MATERIAL );
174  ++registeredMeshColorCodingStages;
175  }
176  if( meshRenderer != nullptr && occluded != nullptr )
177  {
178  occluded->enableStage( *rs );
179  ++enabledOccludedStages;
180  }
181  }
183  , "FrameRendererHelper registered "
184  + base::text::lexical_cast< std::string >( registeredMeshColorCodingStages )
185  + " stage(s) for color coding." );
187  , "FrameRendererHelper enabled "
188  + base::text::lexical_cast< std::string >( enabledOccludedStages )
189  + " stage(s) for occluded rendering." );
190  stages.clear();
191 }
192 
193 
194 template< typename RenderStageOrder >
196 {
197  stages.insert( rs );
198  return *this;
199 }
200 
201 
202 
203 } // namespace Carna :: helpers
204 
205 } // namespace Carna
206 
207 
208 
209 #endif // FRAMERENDERERHELPER_H_6014714286
Defines default rendering stages order used by FrameRendererHelper.
void enableStage(const base::RenderStage &rs)
Enables rs in .
Implements a simple interface for mapping frame coordinates to base::Mesh objects.
Defines Carna::base::text.
void putGeometryType(unsigned int geometryType, unsigned int meshRole)
Activates geometryType. Meshes with meshRole attached to geometry nodes with geometryType will be pro...
Indicates messages that might be of interest when searching bugs.
Definition: Log.h:88
Defines Carna::base::GLContext.
void enableMaterials(unsigned int geometryType, unsigned int materialRole)
Enables support for materials if geometryType has been activated or will be activated later...
void record(Severity severity, const std::string &entry) const
Instructs current writer to write entry with severity.
Defines Carna::base::Log.
Defines Carna::presets::MeshColorCodingStage.
static const unsigned int ROLE_DEFAULT_MATERIAL
Identifies the Material object that MeshRenderingStage uses for rendering.
static Log & instance()
Returns the only instance from class InstanceType.
Definition: Singleton.h:109
void reset()
Resets changes that have been made since the last invocation of commit.
base::RenderStageSequence & renderer
References the configured renderer.
Renders geometry that is actually depth-occluded. The occluded geometry is rendered with reduced opac...
Base abstract class of each rendering stage. Refer to the documentation of the rendering process...
Definition: RenderStage.h:42
Defines Carna::base::MeshRenderingStage.
Defines MeshRenderingStage class template instance invariants.
Defines Carna::base::RenderStageSequence.
FrameRendererHelper< RenderStageOrder > & operator<<(base::RenderStage *rs)
Takes possession of rs and adds it to the renderer when commit is invoked.
void commit(bool clear=true)
Commits recorded changes to the associated renderer. Removes all previosly committed stages if clear ...
Defines Carna::presets::OccludedRenderingStage.
static const unsigned int ROLE_DEFAULT_MESH
Identifies the Mesh object that MeshRenderingStage uses for rendering.
FrameRendererHelper(base::RenderStageSequence &renderer)
Instantiates helper for renderer.
const unsigned int geometryType
Holds the geometry type rendered by this MeshRenderingStage.
Defines Carna::base::RenderStage.
#define NON_COPYABLE
Features class it is placed in as non-copyable.
Definition: noncopyable.h:109
Adds rendering stages to a base::FrameRenderer object according to RenderStageOrder.
Definition: Carna.h:198
Represents a rendering stages sequence.