Developer Documentation
RendererInfo.cc
1/*===========================================================================*\
2* *
3* OpenFlipper *
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openflipper.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenFlipper. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39* *
40\*===========================================================================*/
41
42
43#include <OpenFlipper/common/RendererInfo.hh>
44
45static RenderManager renderManager_;
46static PostProcessorManager postProcessorManager_;
47
48RenderManager& renderManager() {
49 return renderManager_;
50}
51
52PostProcessorManager& postProcessorManager() {
53 return postProcessorManager_;
54}
55
56RendererInfo::RendererInfo():
57 plugin(0),
58 name(""),
59 optionsAction(0)
60{
61}
62
63RendererInfo::RendererInfo(RenderInterface* _plugin,QString _name) :
64 plugin(_plugin),
65 name(_name),
66 optionsAction(0)
67{
68}
69
70
71RenderManager::RenderManager()
72{
73 availableRenderers_.clear();
74 availableRenderers_.push_back(RendererInfo(0,"Default internal renderer"));
75
76 activeRenderers_.clear();
77}
78
79bool RenderManager::rendererExists(QString _name) {
80
81 for ( unsigned int i = 0 ; i < availableRenderers_.size() ; ++i)
82 if ( availableRenderers_[i].name == _name)
83 return true;
84
85 return false;
86
87}
88
90
91 for ( unsigned int i = 0 ; i < availableRenderers_.size() ; ++i)
92 if ( availableRenderers_[i].name == _name)
93 return &availableRenderers_[i];
94
96 availableRenderers_[availableRenderers_.size()-1].name = _name;
97
99}
100
102
103 for ( unsigned int i = 0 ; i < availableRenderers_.size() ; ++i)
104 if ( availableRenderers_[i].name == _name)
105 return &availableRenderers_[i];
106
107 return 0;
108}
109
111
112 for ( unsigned int i = 0 ; i < availableRenderers_.size() ; ++i)
113 if ( availableRenderers_[i].name == _name)
114 return i;
115
116 return -1;
117}
118
120
121 int renderers = 0;
122
123 // Skip first one as it is the default renderer
124 for ( unsigned int i = 1 ; i < availableRenderers_.size() ; ++i)
125 if ( (availableRenderers_[i].modes & _mode) )
126 renderers++;
127
128 return renderers;
129}
130
132
133 if ( _id >= availableRenderers_.size())
134 return 0;
135 else
136 return &availableRenderers_[_id];
137
138}
139
141 return availableRenderers_.size();
142}
143
144
145void RenderManager::setActive(unsigned int _active, int _id) {
146
147 if ( _id < 0 ) {
148 std::cerr << "RenderManager::setActive illegal viewer id: " << _id << std::endl;
149 return;
150 }
151
152 // Increase vector size
153 if ( _id >= (int)activeRenderers_.size() )
154 activeRenderers_.resize(_id +1 );
155
156 if ( _active < availableRenderers_.size() )
157 activeRenderers_[_id] = _active;
158 else
159 std::cerr << "Out of range error when setting active renderer" << std::endl;
160}
161
162void RenderManager::setActive(QString _active, int _id) {
163
164 if ( _id < 0 ) {
165 std::cerr << "RenderManager::setActive illegal viewer id: " << _id << std::endl;
166 return;
167 }
168
169 // Increase vector size
170 if ( _id >= (int)activeRenderers_.size() ) {
171 activeRenderers_.resize(_id +1 );
172
173 }
174
175 for ( unsigned int i = 0 ; i < availableRenderers_.size() ; ++i)
176 if ( availableRenderers_[i].name == _active) {
177 activeRenderers_[_id] = i;
178 }
179
180}
181
183
184 // Temporary viewer with no fixed id, return first renderer
185 if ( _id < 0 )
186 return 0;
187
188 // Increase vector size
189 if ( _id >= (int)activeRenderers_.size() )
190 activeRenderers_.resize(_id +1 );
191
193}
194
195unsigned int RenderManager::activeId( int _id) {
196
197 // Temporary viewer with no fixed id, return first renderer
198 if ( _id < 0 )
199 return 0;
200
201 // Increase vector size
202 if ( _id >= (int)activeRenderers_.size() )
203 activeRenderers_.resize(_id +1 );
204
205 return activeRenderers_[_id];
206}
207
208//===================================================================
209
210PostProcessorInfo::PostProcessorInfo(PostProcessorInterface* _plugin, QString _name) :
211 plugin(_plugin),
212 name(_name),
213 optionsAction(0)
214{
215}
216
217PostProcessorInfo::PostProcessorInfo():
218 plugin(0),
219 name(""),
220 optionsAction(0)
221{
222}
223
224
225PostProcessorManager::PostProcessorManager()
226{
228 availablePostProcessors_.push_back(PostProcessorInfo(0,"Default internal post processor"));
229
230 activePostProcessors_.clear();
231}
232
233
235
236 for ( unsigned int i = 0 ; i < availablePostProcessors_.size() ; ++i)
237 if ( availablePostProcessors_[i].name == _name)
238 return true;
239
240 return false;
241
242}
243
245
246 for ( unsigned int i = 0 ; i < availablePostProcessors_.size() ; ++i)
247 if ( availablePostProcessors_[i].name == _name)
248 return &availablePostProcessors_[i];
249
252
254}
255
257
258 for ( unsigned int i = 0 ; i < availablePostProcessors_.size() ; ++i)
259 if ( availablePostProcessors_[i].name == _name)
260 return &availablePostProcessors_[i];
261
262 return 0;
263}
264
266
267 if ( _id >= availablePostProcessors_.size())
268 return 0;
269 else
270 return &availablePostProcessors_[_id];
271
272}
273
275 return availablePostProcessors_.size();
276}
277
278void PostProcessorManager::setActive(unsigned int _active, int _viewerId ) {
279
280 // Temporary viewer with no fixed id
281 if ( _viewerId < 0 ) {
282 std::cerr << "PostProcessorManager::setActive illegal viewer id: " << _viewerId << std::endl;
283 return;
284 }
285
286 // Increase vector size
287 if ( _viewerId >= (int)activePostProcessors_.size() )
288 activePostProcessors_.resize(_viewerId +1 );
289
290 // clear chain and add postprocessor
291 activePostProcessors_[_viewerId].clear();
292 activePostProcessors_[_viewerId].push_back(_active);
293}
294
295void PostProcessorManager::setActive(QString _active, int _id ) {
296
297 // Temporary viewer with no fixed id
298 if ( _id < 0 ) {
299 std::cerr << "PostProcessorManager::setActive illegal viewer id: " << _id << std::endl;
300 return;
301 }
302
303 // Increase vector size
304 if ( _id >= (int)activePostProcessors_.size() )
305 activePostProcessors_.resize(_id +1 );
306
307 for ( unsigned int i = 0 ; i < availablePostProcessors_.size() ; ++i)
308 if ( availablePostProcessors_[i].name == _active) {
309
310 // clear chain and add postprocessor
311 activePostProcessors_[_id].clear();
312 activePostProcessors_[_id].push_back(i);
313 }
314
315}
316
318
319 // Temporary viewer with no fixed id, return first post processor
320 if ( _id < 0 )
321 return 0;
322
323 // Increase vector size
324 if ( _id >= (int)activePostProcessors_.size() )
325 activePostProcessors_.resize(_id +1 );
326
327 if ( (int)activePostProcessors_[_id].size() <= _chainIdx)
328 return 0;
329
330 return &availablePostProcessors_[activePostProcessors_[_id][_chainIdx]];
331}
332
333unsigned int PostProcessorManager::activeId( int _id, int _chainIdx ) {
334
335 // Temporary viewer with no fixed id, return first post processor
336 if ( _id < 0 )
337 return 0;
338
339 // Increase vector size
340 if ( _id >= (int)activePostProcessors_.size() )
341 activePostProcessors_.resize(_id +1 );
342
343 if ( (int)activePostProcessors_[_id].size() <= _chainIdx)
344 return 0;
345
346 return activePostProcessors_[_id][_chainIdx];
347}
348
350
351 // Temporary viewer with no fixed id, return first post processor
352 if ( _id < 0 )
353 return 0;
354
355 // Increase vector size
356 if ( _id >= (int)activePostProcessors_.size() )
357 activePostProcessors_.resize(_id +1 );
358
359 return (int)activePostProcessors_[_id].size();
360}
361
362void PostProcessorManager::append( unsigned int _active, int _viewerId ) {
363
364 // Temporary viewer with no fixed id
365 if ( _viewerId < 0 ) {
366 std::cerr << "PostProcessorManager::append illegal viewer id: " << _viewerId << std::endl;
367 return;
368 }
369
370 // Increase vector size
371 if ( _viewerId >= (int)activePostProcessors_.size() )
372 activePostProcessors_.resize(_viewerId +1 );
373
374 if ( _active < availablePostProcessors_.size() )
375 activePostProcessors_[_viewerId].push_back(_active);
376 else
377 std::cerr << "Out of range error when setting active post processor" << std::endl;
378
379}
380
381void PostProcessorManager::append( QString _active, int _id ) {
382
383 // Temporary viewer with no fixed id
384 if ( _id < 0 ) {
385 std::cerr << "PostProcessorManager::append illegal viewer id: " << _id << std::endl;
386 return;
387 }
388
389 // Increase vector size
390 if ( _id >= (int)activePostProcessors_.size() )
391 activePostProcessors_.resize(_id +1 );
392
393 for ( unsigned int i = 0 ; i < availablePostProcessors_.size() ; ++i)
394 if ( availablePostProcessors_[i].name == _active) {
395 activePostProcessors_[_id].push_back(i);
396 }
397
398}
399
400
401void PostProcessorManager::insert( unsigned int _active, int _chainIdx, int _viewerId ) {
402
403 // Temporary viewer with no fixed id
404 if ( _viewerId < 0 ) {
405 std::cerr << "PostProcessorManager::insert illegal viewer id: " << _viewerId << std::endl;
406 return;
407 }
408
409 // Increase vector size
410 if ( _viewerId >= (int)activePostProcessors_.size() )
411 activePostProcessors_.resize(_viewerId +1 );
412
413 if ( _active < availablePostProcessors_.size() )
414 activePostProcessors_[_viewerId].insert(activePostProcessors_[_viewerId].begin() + _chainIdx, _active);
415 else
416 std::cerr << "Out of range error when setting active post processor" << std::endl;
417
418}
419
420void PostProcessorManager::insert( QString _active, int _chainIdx, int _id ) {
421
422 // Temporary viewer with no fixed id
423 if ( _id < 0 ) {
424 std::cerr << "PostProcessorManager::insert illegal viewer id: " << _id << std::endl;
425 return;
426 }
427
428 // Increase vector size
429 if ( _id >= (int)activePostProcessors_.size() )
430 activePostProcessors_.resize(_id +1 );
431
432 for ( unsigned int i = 0 ; i < availablePostProcessors_.size() ; ++i)
433 if ( availablePostProcessors_[i].name == _active) {
434 activePostProcessors_[_id].insert(activePostProcessors_[_id].begin() + _chainIdx, i);
435 }
436
437}
438
439void PostProcessorManager::remove( int _id, int _chainIdx ) {
440
441 // Temporary viewer with no fixed id, return first post processor
442 if ( _id < 0 )
443 return;
444
445 // Increase vector size
446 if ( _id >= (int)activePostProcessors_.size() )
447 activePostProcessors_.resize(_id +1 );
448
449 if ( (int)activePostProcessors_[_id].size() <= _chainIdx)
450 return;
451
452 activePostProcessors_[_id].erase(activePostProcessors_[_id].begin() + _chainIdx);
453
454}
455
456
457
Interface to add global image post processor functions from within plugins.
void setActive(unsigned int _active, int _viewerId)
set the active post processor for viewer
unsigned int activeId(int _id, int _chainIdx=0)
Get the id of the active post processor for viewer at chain index.
PostProcessorInfo * newPostProcessor(QString _name)
Get a new post processor Instance.
size_t available()
number of available post processor
std::vector< PostProcessorInfo > availablePostProcessors_
Vector holding all available post processors.
int numActive(int _id)
Get the number of active post processors for viewer.
PostProcessorInfo * getPostProcessor(QString _name)
get post processor with the given name
void append(unsigned int _active, int _viewerId)
Append the active post processor to the chain for viewer.
std::vector< std::vector< unsigned int > > activePostProcessors_
The currently active post processor chain.
void remove(int _id, int _chainIdx)
Remove a post processor at the specified chain index.
PostProcessorInfo * active(int _id, int _chainIdx=0)
Get the current active post processor for viewer at chain index.
PostProcessorInfo * operator[](unsigned int _id)
Get the post processor with the given id.
void insert(unsigned int _active, int _chainIdx, int _viewerId)
Insert the active post processor to the chain for viewer.
bool postProcessorExists(QString _name)
Check if a post processor with the given name exists.
Interface to add additional rendering functions from within plugins.
int countRenderers(ACG::SceneGraph::DrawModes::DrawMode _mode)
count renderers for a DrawMode (excluding the default renderer)
void setActive(unsigned int _active, int _id)
set the active renderer
RendererInfo * active(int _id)
Get the current active renderer.
RendererInfo * newRenderer(QString _name)
Get a new renderer Instance.
Definition: RendererInfo.cc:89
std::vector< unsigned int > activeRenderers_
The currently active renderer ids.
int getRendererId(QString _name)
get renderer id with the given name
RendererInfo * operator[](unsigned int _id)
Get the renderer with the given id.
size_t available()
number of available renderers
unsigned int activeId(int _id)
Get the id of the active renderer.
bool rendererExists(QString _name)
Check if a renderer with the given name exists.
Definition: RendererInfo.cc:79
RendererInfo * getRenderer(QString _name)
get renderer with the given name
std::vector< RendererInfo > availableRenderers_
Vector holding all available renderers.