Developer Documentation
Loading...
Searching...
No Matches
DrawModes.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
44
45
46
47//=============================================================================
48//
49// CLASS DrawModes - IMPLEMENTATION
50//
51//=============================================================================
52
53
54//== INCLUDES =================================================================
55
56#include "DrawModes.hh"
57#include "BaseNode.hh"
58
59#include <sstream>
60
61
62//== NAMESPACES ==============================================================
63
64namespace ACG {
65namespace SceneGraph {
66namespace DrawModes {
67
68
69// == Default Draw Mode initialization ======================================
70
71DrawMode NONE = DrawMode( ModeFlagSet(0) );
72DrawMode DEFAULT = DrawMode( ModeFlagSet(1) );
73DrawMode POINTS = DrawMode( ModeFlagSet(1) << 1 );
74DrawMode POINTS_COLORED = DrawMode( ModeFlagSet(1) << 2 );
75DrawMode POINTS_SHADED = DrawMode( ModeFlagSet(1) << 3 );
76DrawMode EDGES = DrawMode( ModeFlagSet(1) << 4 );
77DrawMode EDGES_COLORED = DrawMode( ModeFlagSet(1) << 5 );
78DrawMode WIREFRAME = DrawMode( ModeFlagSet(1) << 6 );
79DrawMode FACES = DrawMode( ModeFlagSet(1) << 7 );
80DrawMode HIDDENLINE = DrawMode( ModeFlagSet(1) << 8 );
81DrawMode SOLID_FLAT_SHADED = DrawMode( ModeFlagSet(1) << 9 );
82DrawMode SOLID_SMOOTH_SHADED = DrawMode( ModeFlagSet(1) << 10 );
83DrawMode SOLID_PHONG_SHADED = DrawMode( ModeFlagSet(1) << 11 );
84DrawMode SOLID_FACES_COLORED = DrawMode( ModeFlagSet(1) << 12 );
85DrawMode SOLID_POINTS_COLORED = DrawMode( ModeFlagSet(1) << 13 );
87DrawMode SOLID_ENV_MAPPED = DrawMode( ModeFlagSet(1) << 15 );
88DrawMode SOLID_TEXTURED = DrawMode( ModeFlagSet(1) << 16 );
89DrawMode SOLID_TEXTURED_SHADED = DrawMode( ModeFlagSet(1) << 17 );
90DrawMode SOLID_1DTEXTURED = DrawMode( ModeFlagSet(1) << 18 );
91DrawMode SOLID_1DTEXTURED_SHADED = DrawMode( ModeFlagSet(1) << 19 );
92DrawMode SOLID_3DTEXTURED = DrawMode( ModeFlagSet(1) << 20 );
93DrawMode SOLID_3DTEXTURED_SHADED = DrawMode( ModeFlagSet(1) << 21 );
96DrawMode SOLID_2DTEXTURED_FACE = DrawMode( ModeFlagSet(1) << 24 );
98DrawMode SOLID_SHADER = DrawMode( ModeFlagSet(1) << 26 );
100DrawMode CELLS = DrawMode( ModeFlagSet(1) << 28 );
101DrawMode CELLS_COLORED = DrawMode( ModeFlagSet(1) << 29 );
102DrawMode HALFEDGES = DrawMode( ModeFlagSet(1) << 30 );
103DrawMode HALFEDGES_COLORED = DrawMode( ModeFlagSet(1) << 31 );
105DrawMode UNUSED = DrawMode( ModeFlagSet(1) << 33 );
106
107
108//== IMPLEMENTATION ==========================================================
109
110
120
121 public:
122
124 DrawModeInternal(const std::string & _name, const DrawMode & _id, const bool _propertyBased = false) :
125 name_(_name),
126 id_(_id),
127 propertyBased_(_propertyBased)
128 {
129 }
130
132 void name(const std::string& _name) {
133 name_ = _name;
134 }
135
137 const std::string& name() const {
138 return name_;
139 }
140
141 const DrawMode& id() const {
142 return id_;
143 }
144
145 bool propertyBased() const {
146 return propertyBased_;
147 }
148
149
150 DrawModeProperties& properties() {
151 return properties_;
152 }
153
154 private:
155 std::string name_;
159};
160
161
162typedef std::vector< DrawModeInternal > VecDrawModes;
163
166static VecDrawModes registeredDrawModes_;
167
169static DrawMode firstFreeID_;
170
171
172DrawModeProperties::DrawModeProperties(DrawModePrimitive _primitive,
173 DrawModeLightStage _lightStage,
174 DrawModeNormalSource _normalSource,
175 DrawModeColorSource _colorSource,
176 DrawModeTexCoordSource _texcoordSource,
177 bool _envMapping):
178envMapped_(_envMapping),
179primitive_(_primitive),
180lightStage_(_lightStage),
181colorSource_(_colorSource),
182texcoordSource_(_texcoordSource),
183normalSource_(_normalSource)
184{
185}
186
187
188DrawMode::DrawMode(size_t _index)
189{
190 modeFlags_.reset();
191 if ( _index >= modeFlags_.size() ) {
192 std::cerr << "Illegal drawMode specification from unsigned int. This should not be a bitset!!!" << std::endl;
193 } else {
194 modeFlags_.set(_index);
195 }
196 layers_.resize(1);
198}
199
200DrawMode::DrawMode() {
201 layers_.resize(1);
203}
204
205DrawMode::DrawMode(const ModeFlagSet& _flags) :
206 modeFlags_(_flags)
207{
208 layers_.resize(1);
210}
211
212DrawMode DrawMode::getFromDescription(std::string _description)
213{
214 DrawMode val;
215 bool found = false;
216 std::istringstream f(_description);
217 std::string s;
218 while (std::getline(f, s, '+')) {
219 VecDrawModes::const_iterator modeIter, modeEnd( registeredDrawModes_.end() );
220 for( modeIter = registeredDrawModes_.begin(); modeIter != modeEnd; ++modeIter ) {
221 if(modeIter->name() == s) {
222 val |= modeIter->id();
223 found = true;
224 }
225 }
226 }
227 if(!found)
228 return DEFAULT;
229 else return val;
230}
231
232DrawMode::operator bool() const {
233 return( modeFlags_ != NONE.modeFlags_ );
234}
235/*
236bool DrawMode::propertyBased() const {
237 if ( isAtomic() ) {
238 return registeredDrawModes_[getIndex()].propertyBased();
239 } else {
240 // Combined drawmode, iterate over all contained modes and return
241 VecDrawModes::const_iterator modeIter, modeEnd( registeredDrawModes_.end() );
242 for( modeIter = registeredDrawModes_.begin(); modeIter != modeEnd; ++modeIter )
243 if( ((*this) & modeIter->id()) && modeIter->propertyBased() )
244 return true;
245
246 return false;
247 }
248}
249*/
250
252 if (_props)
253 {
254 if (layers_.empty())
255 layers_.push_back(*_props);
256 else
257 layers_[0] = *_props;
258 }
259 else
260 layers_.erase(layers_.begin());
261}
262
267
268bool DrawMode::operator==(const DrawMode& _mode) const {
269 return modeFlags_ == _mode.modeFlags_;
270 //return ((modeFlags_ & _mode.modeFlags_).any());
271}
272
273bool DrawMode::operator!=( const DrawMode& _mode2 ) const {
274 return (modeFlags_ != _mode2.modeFlags_);
275}
276
277DrawMode& DrawMode::operator++() {
278 if ( modeFlags_.count() != 1 ) {
279 std::cerr << "Operator ++ for drawMode which is not atomic!!" << std::endl;
280 }
281
282 modeFlags_ <<= 1;
283
284 return (*this);
285}
286
287DrawMode DrawMode::operator&(const DrawMode& _mode) const {
288 DrawMode andMode = DrawMode(modeFlags_ & _mode.modeFlags_);
289
290 andMode.setDrawModeProperties(getDrawModeProperties());
291
292 for (unsigned int i = 1; i < getNumLayers(); ++i)
293 andMode.addLayer(getLayer(i));
294
295 // remove all distinct layers
296 for (int i = (int)andMode.getNumLayers() - 1; i >= 0; --i)
297 {
298 int layerIndex = _mode.getLayerIndex(andMode.getLayer(i));
299
300 if (layerIndex < 0)
301 andMode.removeLayer(i);
302 }
303
304 return andMode;
305}
306
307DrawMode& DrawMode::operator|=( const DrawMode& _mode2 ) {
308 modeFlags_ |= _mode2.modeFlags_;
309
310 for (unsigned int i = 0; i < _mode2.getNumLayers(); ++i)
311 addLayer(_mode2.getLayer(i));
312
313// assert(checkConsistency());
314
315 return (*this);
316}
317
318DrawMode& DrawMode::operator&=( const DrawMode& _mode2 ) {
319 modeFlags_ &= _mode2.modeFlags_;
320
321 // remove all distinct layers
322 for (int i = (int)getNumLayers() - 1; i >= 0; --i)
323 {
324 int layerIndex2 = _mode2.getLayerIndex(getLayer(i));
325
326 if (layerIndex2 < 0)
327 removeLayer(i);
328 }
329
330// assert(checkConsistency());
331
332 return (*this);
333}
334
335DrawMode DrawMode::operator|( const DrawMode& _mode2 ) const {
336 DrawMode combined = DrawMode( modeFlags_ | _mode2.modeFlags_ );
337
338 combined.setDrawModeProperties(getDrawModeProperties());
339
340 for (unsigned int i = 1; i < getNumLayers(); ++i)
341 combined.addLayer(getLayer(i));
342
343 for (unsigned int i = 0; i < _mode2.getNumLayers(); ++i)
344 combined.addLayer(_mode2.getLayer(i));
345
346 return combined;
347}
348
349DrawMode DrawMode::operator^( const DrawMode& _mode2 ) const {
350
351 DrawMode xorMode = DrawMode( modeFlags_ ^ _mode2.modeFlags_ );
352
353 // xor on properties (curProps)
354
355 // do xor on new temporary DrawMode
356 // internal layers of this and _mode2 must stay the same
357 std::vector<const DrawModeProperties*> tmpLayers;
358
359
360 // initialize tmpLayers with my own layers
361 for (unsigned int i = 0; i < getNumLayers(); ++i)
362 {
363 const DrawModeProperties* curProps = getLayer(i);
364
365 if (curProps)
366 tmpLayers.push_back(curProps);
367 }
368
369
370 // xor on tmpLayers
371 for (unsigned int i = 0; i < _mode2.getNumLayers(); ++i)
372 {
373 const DrawModeProperties* curProps = _mode2.getLayer(i);
374
375 if (!curProps) continue;
376
377
378
379 int addToVec = 1;
380
381 // is the other layer already contained in my own list?
382 for (unsigned int k = 0; addToVec && k < tmpLayers.size(); ++k)
383 {
384 if (!memcmp(tmpLayers[k], curProps, sizeof(DrawModeProperties)))
385 {
386 // yes, remove it (layer exists in both drawmodes)
387 tmpLayers.erase(tmpLayers.begin() + k);
388 addToVec = 0;
389 }
390 }
391
392 if (addToVec) // no, add it
393 tmpLayers.push_back(curProps);
394 }
395
396
397
398 // DrawModes equal?
399 if (tmpLayers.empty())
400 {
401 xorMode.removeLayer(0u);
402 return xorMode; // return default property set to not cause exceptions
403 }
404
405 // layers not empty,
406 // copy to temporary drawmode and return
407
408 xorMode.setDrawModeProperties(tmpLayers[0]);
409 for (unsigned int i = 1; i < tmpLayers.size(); ++i)
410 xorMode.addLayer(tmpLayers[i]);
411
412
413// assert(xorMode.checkConsistency());
414
415 return xorMode;
416}
417
418DrawMode DrawMode::operator~( ) const {
419 return( DrawMode(~modeFlags_) );
420}
421
422
423
424size_t DrawMode::getIndex() const {
425 if ( modeFlags_.count() == 1 ) {
426 for ( size_t i = 0 ; i < modeFlags_.size() ; ++i )
427 if ( modeFlags_[i] )
428 return i;
429 }
430
431 return 0;
432}
433
434std::string DrawMode::description() const
435{
436 std::string text("");
437
438 VecDrawModes::const_iterator modeIter, modeEnd( registeredDrawModes_.end() );
439 for( modeIter = registeredDrawModes_.begin(); modeIter != modeEnd; ++modeIter )
440 {
441 if( (*this) & modeIter->id() )
442 {
443 if (!text.empty()) text += "+";
444 text += modeIter->name();
445 }
446 }
447
448 return text;
449}
450
451//----------------------------------------------------------------------------
452
454{
455 modeFlags_ = (modeFlags_ | _filter.modeFlags_) ^ _filter.modeFlags_;
456
457 for (unsigned int i = 0; i < _filter.getNumLayers(); ++i)
458 {
459 int idx = getLayerIndex(_filter.getLayer(i));
460
461 removeLayer((unsigned int)idx);
462 }
463}
464
465
466
467//----------------------------------------------------------------------------
468
470{
471 // XOR on bitflag
472 modeFlags_ = (modeFlags_ ^ _mode.modeFlags_);
473
474 // addLayer does redundancy check here
475 for (unsigned int i = 0; i < _mode.getNumLayers(); ++i)
476 addLayer(_mode.getLayer(i));
477
478// checkConsistency();
479// assert(checkConsistency());
480}
481
482//----------------------------------------------------------------------------
483
484std::vector< DrawMode >
486{
487 std::vector< DrawMode > draw_mode_ids;
488
489 VecDrawModes::const_iterator modeIter, modeEnd( registeredDrawModes_.end() );
490 for( modeIter = registeredDrawModes_.begin();
491 modeIter != modeEnd;
492 ++modeIter )
493 if( (*this) & modeIter->id() )
494 draw_mode_ids.push_back( modeIter->id() );
495
496 return draw_mode_ids;
497}
498
499
500//----------------------------------------------------------------------------
501
502bool DrawMode::isAtomic() const {
503 return(modeFlags_.count() == 1 );
504}
505
506
507//----------------------------------------------------------------------------
508
509bool
510DrawMode::containsAtomicDrawMode( const DrawMode& _atomicDrawMode) const
511{
512 return (*this) & _atomicDrawMode;
513}
514
515//----------------------------------------------------------------------------
516
517size_t DrawMode::maxModes() const {
518 return (modeFlags_.size() );
519}
520
522 return layers_.size();
523}
524
525const DrawModeProperties* DrawMode::getLayer( unsigned int i ) const {
526 return (i >= layers_.size() ? 0 : &layers_[i]);
527}
528
529
531{
532 if (getLayerIndex(_props) < 0 && _props)
533 layers_.push_back(*_props);
534}
535
536bool DrawMode::removeLayer( unsigned int _i )
537{
538 if (_i < layers_.size() )
539 {
540 layers_.erase(layers_.begin() + _i);
541 return true;
542 }
543
544 return false;
545}
546
548{
549 int layerId = getLayerIndex(_prop);
550
551 if (layerId >= 0)
552 return removeLayer((unsigned int)layerId);
553
554 return false;
555}
556
558{
559 return getLayer(0);
560}
561
562
564{
565
566 // allow at most one layer per primitive
567 for (unsigned int i = 0; i < layers_.size(); ++i)
568 {
569 for (unsigned int k = i+1; k < layers_.size(); ++k)
570 {
571 if (layers_[i].primitive() == layers_[k].primitive())
572 return false;
573 }
574 }
575
576
577
578 // bitflag -> layer parallelism
579
580 // points-mode in bitflag => point layer expected
581
582 if ((*this & DrawModes::POINTS) ||
583 (*this & DrawModes::POINTS_COLORED) ||
584 (*this & DrawModes::POINTS_SHADED))
585 {
586 int pointsLayer = 0;
587 for (unsigned int k = 0; k < layers_.size(); ++k)
588 {
589 if (layers_[k].primitive() == PRIMITIVE_POINT)
590 pointsLayer++;
591 }
592
593 if (!pointsLayer)
594 return false;
595 }
596
597
598 return true;
599}
600
602{
603 if (!_prop) return -1;
604
605 for (unsigned int i = 0; i < layers_.size(); ++i)
606 {
607 if ( layers_[i] == *_prop )
608 return (int)i;
609
610 // if (!memcmp(&layers_[i], &bla, sizeof(DrawModeProperties)))
611 // return (int)i;
612 }
613 return -1;
614}
615
617{
618 for (unsigned int i = 0; i < layers_.size(); ++i)
619 {
620 if ( layers_[i].primitive() == _type )
621 return (int)i;
622 }
623 return -1;
624}
625
626//----------------------------------------------------------------------------
627
628
630{
631 static bool initialized_ = false;
632
633 if( initialized_ )
634 return;
635
636 registeredDrawModes_.clear();
637
638 NONE.removeLayer(0u);
640
641 POINTS. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POINT));
642 POINTS_COLORED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POINT, LIGHTSTAGE_UNLIT, NORMAL_NONE, COLOR_PER_VERTEX));
643 POINTS_SHADED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POINT, LIGHTSTAGE_SMOOTH, NORMAL_PER_VERTEX));
644
645 EDGES. setDrawModeProperties(DrawModeProperties(PRIMITIVE_EDGE));
646 EDGES_COLORED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_EDGE, LIGHTSTAGE_UNLIT, NORMAL_NONE, COLOR_PER_VERTEX));
647
648 WIREFRAME. setDrawModeProperties(DrawModeProperties(PRIMITIVE_EDGE));
649 EDGES_COLORED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_EDGE, LIGHTSTAGE_UNLIT, NORMAL_NONE, COLOR_PER_EDGE));
650
651 WIREFRAME. setDrawModeProperties(DrawModeProperties(PRIMITIVE_WIREFRAME));
652
653 FACES. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POLYGON));
654
655 HIDDENLINE. setDrawModeProperties(DrawModeProperties(PRIMITIVE_HIDDENLINE));
656
657 SOLID_FLAT_SHADED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POLYGON, LIGHTSTAGE_SMOOTH, NORMAL_PER_FACE));
658 SOLID_SMOOTH_SHADED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POLYGON, LIGHTSTAGE_SMOOTH, NORMAL_PER_VERTEX));
659
660 SOLID_PHONG_SHADED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POLYGON, LIGHTSTAGE_PHONG, NORMAL_PER_VERTEX));
661
662 SOLID_FACES_COLORED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POLYGON, LIGHTSTAGE_UNLIT, NORMAL_NONE, COLOR_PER_FACE));
663
664 SOLID_POINTS_COLORED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POLYGON, LIGHTSTAGE_UNLIT, NORMAL_NONE, COLOR_PER_VERTEX));
666
667 SOLID_ENV_MAPPED. setDrawModeProperties(DrawModeProperties(PRIMITIVE_POLYGON, LIGHTSTAGE_UNLIT, NORMAL_NONE, COLOR_NONE, TEXCOORD_PER_VERTEX, true));
668
671
674
677
681
684
686
687 CELLS.setDrawModeProperties(DrawModeProperties(PRIMITIVE_CELL));
689
692
693
694 registeredDrawModes_.push_back( DrawModeInternal( "<invalid>", NONE ) );
695 registeredDrawModes_.push_back( DrawModeInternal( "Default", DEFAULT ) );
696
697 registeredDrawModes_.push_back( DrawModeInternal( "Points", POINTS ) );
698 registeredDrawModes_.push_back( DrawModeInternal( "Points (colored)", POINTS_COLORED ) );
699 registeredDrawModes_.push_back( DrawModeInternal( "Points (shaded)", POINTS_SHADED ) );
700
701 registeredDrawModes_.push_back( DrawModeInternal( "Edges", EDGES ) );
702 registeredDrawModes_.push_back( DrawModeInternal( "Edges Colored", EDGES_COLORED ) );
703
704 registeredDrawModes_.push_back( DrawModeInternal( "Wireframe", WIREFRAME ) );
705
706 registeredDrawModes_.push_back( DrawModeInternal( "Faces", FACES ) );
707
708 registeredDrawModes_.push_back( DrawModeInternal( "Hiddenline", HIDDENLINE ) );
709
710 registeredDrawModes_.push_back( DrawModeInternal( "Solid (flat shaded)", SOLID_FLAT_SHADED ) );
711 registeredDrawModes_.push_back( DrawModeInternal( "Solid (smooth shaded)", SOLID_SMOOTH_SHADED ) );
712 registeredDrawModes_.push_back( DrawModeInternal( "Solid (Phong shaded)", SOLID_PHONG_SHADED ) );
713
714 registeredDrawModes_.push_back( DrawModeInternal( "Solid (colored per-face)", SOLID_FACES_COLORED ) );
715 registeredDrawModes_.push_back( DrawModeInternal( "Solid (colored per-vertex)", SOLID_POINTS_COLORED ) );
716 registeredDrawModes_.push_back( DrawModeInternal( "Solid (colored per-vertex, shaded)", SOLID_POINTS_COLORED_SHADED ) );
717
718 registeredDrawModes_.push_back( DrawModeInternal( "Solid (environment mapped)", SOLID_ENV_MAPPED ) );
719
720 registeredDrawModes_.push_back( DrawModeInternal( "Solid (textured)", SOLID_TEXTURED ) );
721 registeredDrawModes_.push_back( DrawModeInternal( "Solid (textured, shaded)", SOLID_TEXTURED_SHADED ) );
722
723 registeredDrawModes_.push_back( DrawModeInternal( "Solid (scalar field)", SOLID_1DTEXTURED ) );
724 registeredDrawModes_.push_back( DrawModeInternal( "Solid (scalar field, shaded)", SOLID_1DTEXTURED_SHADED ) );
725
726 registeredDrawModes_.push_back( DrawModeInternal( "Solid (3D textured)", SOLID_3DTEXTURED ) );
727 registeredDrawModes_.push_back( DrawModeInternal( "Solid (3D textured, shaded)", SOLID_3DTEXTURED_SHADED ) );
728
729 registeredDrawModes_.push_back( DrawModeInternal( "Solid (colored per-face, flat shaded)", SOLID_FACES_COLORED_FLAT_SHADED ) );
730 registeredDrawModes_.push_back( DrawModeInternal( "Solid (colored per-face, smooth shaded)", SOLID_FACES_COLORED_SMOOTH_SHADED ) );
731
732 registeredDrawModes_.push_back(DrawModeInternal("Solid (colored per-face, face textured, smooth shaded)", SOLID_FACES_COLORED_2DTEXTURED_FACE_SMOOTH_SHADED));
733
734
735 registeredDrawModes_.push_back( DrawModeInternal( "Solid (face textured)", SOLID_2DTEXTURED_FACE ) );
736 registeredDrawModes_.push_back( DrawModeInternal( "Solid (face textured, shaded)", SOLID_2DTEXTURED_FACE_SHADED ) );
737 registeredDrawModes_.push_back( DrawModeInternal( "Shader controlled", SOLID_SHADER ) );
738
739 registeredDrawModes_.push_back( DrawModeInternal( "Solid (smooth shaded, features)", SOLID_SMOOTH_SHADED_FEATURES ) );
740
741 registeredDrawModes_.push_back( DrawModeInternal( "Cells", CELLS ) );
742 registeredDrawModes_.push_back( DrawModeInternal( "Cells Colored", CELLS_COLORED ) );
743
744 registeredDrawModes_.push_back( DrawModeInternal( "Halfedges", HALFEDGES ) );
745 registeredDrawModes_.push_back( DrawModeInternal( "Halfedges Colored", HALFEDGES_COLORED ) );
746
747 firstFreeID_ = UNUSED;
748 initialized_ = true;
749}
750
751
752//----------------------------------------------------------------------------
753
754
755const DrawMode& addDrawMode( const std::string & _name , bool _propertyBased)
756{
757 // check if mode exists already
758 VecDrawModes::iterator modeIter, modeEnd( registeredDrawModes_.end() );
759
760 for( modeIter = registeredDrawModes_.begin(); modeIter != modeEnd; ++modeIter ) {
761 if( _name == modeIter->name() ) {
762 return modeIter->id();
763 }
764 }
765
766
767 // add new mode
768 registeredDrawModes_.push_back( DrawModeInternal( _name, firstFreeID_ , _propertyBased) );
769 ++firstFreeID_;
770
771 return registeredDrawModes_[ registeredDrawModes_.size() - 1 ].id();
772}
773
774//----------------------------------------------------------------------------
775
776ACGDLLEXPORT
777const DrawMode& addDrawMode( const std::string & _name, const DrawModeProperties& _properties)
778{
779 const DrawMode& drawmode = addDrawMode( _name , true );
780
781 // Get the internal DrawMode
782 VecDrawModes::iterator modeIter, modeEnd( registeredDrawModes_.end() );
783
784 for( modeIter = registeredDrawModes_.begin(); modeIter != modeEnd; ++modeIter ) {
785 if( _name == modeIter->name() ) {
786 modeIter->properties() = _properties;
787 return drawmode;
788 }
789 }
790
791 return drawmode;
792}
793
794//----------------------------------------------------------------------------
795
796
797const DrawMode& getDrawMode( const std::string & _name )
798{
799 // check if mode exists
800 VecDrawModes::const_iterator modeIter, modeEnd( registeredDrawModes_.end() );
801
802 for( modeIter = registeredDrawModes_.begin(); modeIter != modeEnd; ++modeIter )
803 {
804 if( _name == modeIter->name() )
805 {
806 return modeIter->id();
807 }
808 }
809
810 // the DrawMode does not exists
811 return DrawModes::NONE;
812}
813
814bool drawModeExists(const std::string & _name) {
815
816 // check if mode exists
817 VecDrawModes::const_iterator modeIter, modeEnd( registeredDrawModes_.end() );
818
819 for( modeIter = registeredDrawModes_.begin(); modeIter != modeEnd; ++modeIter )
820 {
821 if( _name == modeIter->name() )
822 return true;
823 }
824
825 // the DrawMode does not exists
826 return false;
827}
828
829
830DrawMode getDrawModeFromIndex( unsigned int _index ) {
831 return DrawMode(_index);
832}
833
834//=============================================================================
835} // namespace DrawModes
836} // namespace SceneGraph
837} // namespace ACG
838//=============================================================================
DrawModeInternal(const std::string &_name, const DrawMode &_id, const bool _propertyBased=false)
Definition DrawModes.cc:124
DrawModeProperties properties_
The properties associated with this DrawMode.
Definition DrawModes.cc:158
std::string name_
Human Readable Name.
Definition DrawModes.cc:155
void name(const std::string &_name)
Set the name of the DrawMode.
Definition DrawModes.cc:132
const std::string & name() const
Get the name of the DrawMode.
Definition DrawModes.cc:137
bool propertyBased_
Flag if the DrawMode is property based.
Definition DrawModes.cc:157
DrawMode id_
The id of the DrawMode.
Definition DrawModes.cc:156
DrawModeProperties stores a set of properties that defines, how to render an object.
Definition DrawModes.hh:177
void addLayer(const DrawModeProperties *_props)
add another layer on top of this drawmode
Definition DrawModes.cc:530
void combine(DrawMode _mode)
combine with another drawmode
Definition DrawModes.cc:469
size_t getIndex() const
get an index of the current drawMode
Definition DrawModes.cc:424
void filter(DrawMode _filter)
filter out one drawmode
Definition DrawModes.cc:453
int getLayerIndexByPrimitive(DrawModePrimitive _type) const
search for layer with specified primitive
Definition DrawModes.cc:616
const DrawModeProperties * getLayer(unsigned int _i) const
returns the property set at layer i
Definition DrawModes.cc:525
std::vector< DrawMode > getAtomicDrawModes() const
Separates this drawMode into a list of all separate atomic draw modes.
Definition DrawModes.cc:485
size_t maxModes() const
Get the number of maximum Modes which could be handled by the current implementation.
Definition DrawModes.cc:517
bool removeLayer(unsigned int _i)
remove layer at index i
Definition DrawModes.cc:536
bool containsAtomicDrawMode(const DrawMode &_atomicDrawMode) const
Check whether an Atomic DrawMode is active in this draw Mode.
Definition DrawModes.cc:510
bool isAtomic() const
Check if this is an atomic draw Mode.
Definition DrawModes.cc:502
const DrawModeProperties * getDrawModeProperties() const
returns the base properties of this draw mode
Definition DrawModes.cc:557
bool checkConsistency() const
checks consistency of property layers
Definition DrawModes.cc:563
void setDrawModeProperties(const DrawModeProperties *_props)
set the base properties of this draw mode
Definition DrawModes.cc:251
int getLayerIndex(const DrawModeProperties *_prop) const
returns layer index of a property, -1 if not in list
Definition DrawModes.cc:601
std::vector< DrawModeProperties > layers_
Definition DrawModes.hh:500
size_t getNumLayers() const
returns the layer count
Definition DrawModes.cc:521
DrawMode EDGES
draw edges
Definition DrawModes.cc:76
DrawMode SOLID_SMOOTH_SHADED
draw smooth shaded (Gouraud shaded) faces (requires halfedge normals)
Definition DrawModes.cc:82
DrawModeLightStage
Lighting stage of a mesh: unlit, smooth, phong.
Definition DrawModes.hh:108
DrawMode UNUSED
marks the last used ID
Definition DrawModes.cc:105
DrawMode SOLID_PHONG_SHADED
draw phong shaded faces
Definition DrawModes.cc:83
DrawMode HALFEDGES
draw halfedges
Definition DrawModes.cc:102
DrawMode SOLID_ENV_MAPPED
draw environment mapped
Definition DrawModes.cc:87
DrawMode SOLID_3DTEXTURED_SHADED
draw smooth shaded textured faces
Definition DrawModes.cc:93
DrawMode SOLID_POINTS_COLORED_SHADED
draw faces, but use Gouraud shading to interpolate vertex colors
Definition DrawModes.cc:86
DrawMode SOLID_FACES_COLORED_SMOOTH_SHADED
draw smooth shaded and colored faces (requires vertex normals and face colors)
Definition DrawModes.cc:95
DrawMode POINTS_COLORED
draw colored, but not lighted points (requires point colors)
Definition DrawModes.cc:74
bool drawModeExists(const std::string &_name)
Check if the given draw mode exists.
Definition DrawModes.cc:814
DrawMode HALFEDGES_COLORED
draw halfedges with colors (without shading)
Definition DrawModes.cc:103
DrawMode SOLID_TEXTURED_SHADED
draw smooth shaded textured faces
Definition DrawModes.cc:89
DrawMode SOLID_2DTEXTURED_FACE
draw per halfedge textured faces
Definition DrawModes.cc:96
DrawMode SOLID_2DTEXTURED_FACE_SHADED
draw per halfedge textured faces
Definition DrawModes.cc:97
DrawMode SOLID_FACES_COLORED
draw colored, but not lighted faces using face colors
Definition DrawModes.cc:84
const DrawMode & getDrawMode(const std::string &_name)
Get a custom DrawMode.
Definition DrawModes.cc:797
DrawMode DEFAULT
use the default (global) draw mode and not the node's own.
Definition DrawModes.cc:72
DrawModeColorSource
Source of Primitive Colors.
Definition DrawModes.hh:135
DrawMode SOLID_FACES_COLORED_FLAT_SHADED
draw flat shaded and colored faces (requires face normals and colors)
Definition DrawModes.cc:94
DrawMode WIREFRAME
draw wireframe
Definition DrawModes.cc:78
DrawMode CELLS_COLORED
draw cells with colors (without shading)
Definition DrawModes.cc:101
DrawModeTexCoordSource
Source of Texture Coordinates.
Definition DrawModes.hh:148
DrawMode HIDDENLINE
draw hidden line (2 rendering passes needed)
Definition DrawModes.cc:80
DrawMode SOLID_FACES_COLORED_2DTEXTURED_FACE_SMOOTH_SHADED
draw per halfedge texture faces modulated with face colors with smooth shading
Definition DrawModes.cc:104
DrawMode POINTS
draw unlighted points using the default base color
Definition DrawModes.cc:73
DrawMode getDrawModeFromIndex(unsigned int _index)
given an index of an atomic draw mode, return the drawmode
Definition DrawModes.cc:830
DrawMode POINTS_SHADED
draw shaded points (requires point normals)
Definition DrawModes.cc:75
DrawMode SOLID_1DTEXTURED
draw textured faces
Definition DrawModes.cc:90
DrawMode EDGES_COLORED
draw edges with colors (without shading)
Definition DrawModes.cc:77
DrawMode NONE
not a valid draw mode
Definition DrawModes.cc:71
DrawMode SOLID_POINTS_COLORED
draw colored, but not lighted faces using interpolated vertex colors
Definition DrawModes.cc:85
DrawMode SOLID_3DTEXTURED
draw textured faces
Definition DrawModes.cc:92
DrawMode SOLID_SMOOTH_SHADED_FEATURES
draw smooth shaded (Gouraud shaded) faces (requires halfedge normals)
Definition DrawModes.cc:99
DrawModeNormalSource
Source of Normals.
Definition DrawModes.hh:160
void initializeDefaultDrawModes(void)
Definition DrawModes.cc:629
const DrawMode & addDrawMode(const std::string &_name, bool _propertyBased)
Add a custom DrawMode.
Definition DrawModes.cc:755
DrawMode SOLID_TEXTURED
draw textured faces
Definition DrawModes.cc:88
DrawMode SOLID_1DTEXTURED_SHADED
draw smooth shaded textured faces
Definition DrawModes.cc:91
DrawMode SOLID_FLAT_SHADED
draw flat shaded faces (requires face normals)
Definition DrawModes.cc:81
DrawModePrimitive
Primitive mode of a mesh.
Definition DrawModes.hh:119
Namespace providing different geometric functions concerning angles.