LibCarna Version 3.4.0
Loading...
Searching...
No Matches
GeometryStage.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2010 - 2016 Leonid Kostrykin
3 *
4 * Chair of Medical Engineering (mediTEC)
5 * RWTH Aachen University
6 * Pauwelsstr. 20
7 * 52074 Aachen
8 * Germany
9 *
10 *
11 * Copyright (C) 2021 - 2025 Leonid Kostrykin
12 *
13 */
14
15#ifndef GEOMETRYSTAGE_H_6014714286
16#define GEOMETRYSTAGE_H_6014714286
17
23#include <memory>
24#include <map>
25
31namespace LibCarna
32{
33
34namespace base
35{
36
37
38
39// ----------------------------------------------------------------------------------
40// GeometryStage
41// ----------------------------------------------------------------------------------
42
61template< typename RenderableCompare >
63{
64
66
67 Node* root;
68 std::size_t passesRendered;
69 std::map< GeometryFeature*, VideoResource* > acquiredFeatures;
70
71protected:
72
77
78public:
79
87 ( unsigned int geometryType
89
90 const unsigned int geometryType;
91 const unsigned int geometryTypeMask;
92
96 virtual ~GeometryStage();
97
100 virtual void prepareFrame( Node& root ) override;
101
102 virtual void renderPass( const math::Matrix4f& viewTransform, RenderTask& rt, const Viewport& vp ) override;
103
108 std::size_t renderedPassesCount() const;
109
114 template< typename GeometryFeatureType >
115 typename GeometryFeatureType::ManagedInterface& videoResource( GeometryFeatureType& geometryFeature ) const;
116
119 template< typename GeometryFeatureType >
120 const typename GeometryFeatureType::ManagedInterface& videoResource( const GeometryFeatureType& geometryFeature ) const;
121
122protected:
123
128 void activateGLContext() const;
129
133 virtual void buildRenderQueues( Node& root, const math::Matrix4f& viewTransform );
134
138 virtual void rewindRenderQueues();
139
144 virtual void updateRenderQueues( const math::Matrix4f& viewTransform );
145
149 virtual void render( const Renderable& renderable ) = 0;
150
151}; // GeometryStage
152
153
154template< typename RenderableCompare >
155GeometryStage< RenderableCompare >::GeometryStage( unsigned int geometryType, unsigned int geometryTypeMask )
156 : root( nullptr )
157 , passesRendered( 0 )
158 , rq( geometryType, geometryTypeMask )
159 , geometryType( geometryType )
160 , geometryTypeMask( geometryTypeMask )
161{
162}
163
164
165template< typename RenderableCompare >
167{
168 activateGLContext();
169 std::for_each( acquiredFeatures.begin(), acquiredFeatures.end(),
170 [&]( const std::pair< GeometryFeature*, VideoResource* >& entry )
171 {
172 if( entry.second != nullptr )
173 {
174 delete entry.second;
175 }
176 }
177 );
178}
179
180
181template< typename RenderableCompare >
183{
184 if( isInitialized() )
185 {
186 renderer().glContext().makeCurrent();
187 }
188}
189
190
191template< typename RenderableCompare >
193{
194 RenderStage::prepareFrame( root );
195 this->root = &root;
196 this->passesRendered = 0;
197}
198
199
200template< typename RenderableCompare >
202{
203 return passesRendered;
204}
205
206
207template< typename RenderableCompare >
209{
210 rq.build( root, viewTransform );
211}
212
213
214template< typename RenderableCompare >
219
220
221template< typename RenderableCompare >
223{
224 rq.updateModelViewTransforms( viewTransform );
225}
226
227
228template< typename RenderableCompare >
230{
231 const bool isFirstPass = passesRendered == 0;
232
233 /* Maintain the render queues.
234 */
235 if( isFirstPass )
236 {
237 buildRenderQueues( *root, viewTransform );
238 }
239 else
240 {
241 rewindRenderQueues();
242 if( isViewTransformFixed() )
243 {
244 updateRenderQueues( viewTransform );
245 }
246 }
247
248 std::set< GeometryFeature* > usedFeatures;
249 while( !rq.isEmpty() )
250 {
251 const Renderable& renderable = rq.poll();
252 if( isFirstPass )
253 {
254 renderable.geometry().visitFeatures( [&]( GeometryFeature& gf, unsigned int role )
255 {
256 /* Denote that the geometry feature was used.
257 */
258 usedFeatures.insert( &gf );
259
260 /* Check whether video resources need to be acquired.
261 */
262 if( acquiredFeatures.find( &gf ) == acquiredFeatures.end() )
263 {
264 VideoResource* const vr = gf.acquireVideoResource();
265 acquiredFeatures[ &gf ] = vr;
266 }
267 }
268 );
269 }
270 render( renderable );
271 }
272 if( isFirstPass )
273 {
274 /* Release unused video resources.
275 */
276 for( auto itr = acquiredFeatures.begin(); itr != acquiredFeatures.end(); )
277 {
278 if( usedFeatures.find( itr->first ) == usedFeatures.end() )
279 {
280 if( itr->second != nullptr )
281 {
282 delete itr->second;
283 }
284 acquiredFeatures.erase( itr++ );
285 }
286 else
287 {
288 ++itr;
289 }
290 }
291 }
292}
293
294
295template< typename RenderableCompare >
296template< typename GeometryFeatureType >
297typename GeometryFeatureType::ManagedInterface& GeometryStage< RenderableCompare >
299{
300 const auto itr = acquiredFeatures.find( &gf );
301 LIBCARNA_ASSERT( itr != acquiredFeatures.end() );
302 return static_cast< typename GeometryFeatureType::ManagedInterface& >( *itr->second );
303}
304
305
306template< typename RenderableCompare >
307template< typename GeometryFeatureType >
308const typename GeometryFeatureType::ManagedInterface& GeometryStage< RenderableCompare >
310{
311 return videoResource( const_cast< GeometryFeatureType& >( gf ) );
312}
313
314
315
316} // namespace LibCarna :: base
317
318} // namespace LibCarna
319
320#endif // GEOMETRYSTAGE_H_6014714286
Defines LibCarna::base::FrameRenderer.
Defines LibCarna::base::GeometryFeature.
#define LIBCARNA_ASSERT(expression)
If the given expression is false, a break point is raised in debug mode and an AssertionFailure throw...
Defines LibCarna::base::RenderQueue.
Defines LibCarna::base::RenderStage.
Represents an association.
Represents an acquisition of the video resources from a particular GeometryFeature....
Represents "components" that are aggregated by Geometry objects. Closer description is given here.
Partially implements a rendering stage that uses at least one render queue for rendering geometry fro...
virtual void render(const Renderable &renderable)=0
Renders the renderable.
RenderQueue< RenderableCompare > rq
Holds the predefined rendering queue of this rendering stage.
virtual void updateRenderQueues(const math::Matrix4f &viewTransform)
Recomputes the model-view transforms of the renderables enqueued by this stage.
const unsigned int geometryTypeMask
Renders such geometries whose type AND-linked with this equals geometryType.
virtual void rewindRenderQueues()
Rewinds the rendering queues of this stage.
virtual ~GeometryStage()
Releases acquired video resources.
virtual void prepareFrame(Node &root) override
Called once before each frame.
virtual void buildRenderQueues(Node &root, const math::Matrix4f &viewTransform)
Builds the rendering queues of this stage.
void activateGLContext() const
Ensures that the OpenGL context of the hosting LibCarna::base::FrameRenderer is the current one.
GeometryFeatureType::ManagedInterface & videoResource(GeometryFeatureType &geometryFeature) const
Interfaces the geometryFeature video resources that were acquired by this rendering stage.
virtual void renderPass(const math::Matrix4f &viewTransform, RenderTask &rt, const Viewport &vp) override
Called once per pass.
GeometryStage(unsigned int geometryType, unsigned int geometryTypeMask=RenderQueue< RenderableCompare >::EXACT_MATCH_GEOMETRY_TYPE_MASK)
Instantiates s.t. the predefined rendering queue enqueues such LibCarna::base::Geometry scene graph n...
const GeometryFeatureType::ManagedInterface & videoResource(const GeometryFeatureType &geometryFeature) const
std::size_t renderedPassesCount() const
Tells the number of passes rendered so far since the beginning of the current frame.
const unsigned int geometryType
Renders such geometries whose type AND-linked with geometryTypeMask equals this.
Defines the inner node of a scene graph. Implements a spatial scene element that is allowed to have c...
Definition Node.hpp:48
Gathers renderable geometry nodes from scene graph and provides those in a particular order,...
Base abstract class of each rendering stage. Refer to the documentation of the rendering process.
Invokes the rendering stages of the frame renderer successively.
Represents a Geometry object that has been queued into a RenderQueue. The object's model-view transfo...
Defines a rendering viewport. The viewport is a property of the current OpenGL context.
Definition Viewport.hpp:52
Defines LibCarna::base::math namespace and LIBCARNA_FOR_VECTOR3UI.
Eigen::Matrix< float, 4, 4, Eigen::ColMajor > Matrix4f
Defines matrix.
Definition math.hpp:197