vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
osgQ_QSection.h
Go to the documentation of this file.
1 #ifndef OSGQ_QSECTION
2 #define OSGQ_QSECTION
3 
4 #include <osg/Shape>
5 
6 namespace osgQ {
7 
8  class QSection;
9 
11  {
12  public:
14  virtual ~QShapeVisitor() {}
15  virtual void apply(const QSection&) {}
16  };
17 
18 
19  class QConstShapeVisitor : public osg::ConstShapeVisitor
20  {
21  public:
23  virtual ~QConstShapeVisitor() {}
24  virtual void apply(const QSection&) {}
25  };
26 
27  class QSection : public osg::Shape
28  {
29  public:
30 
32  _center(0.0f,0.0f,0.0f),
33  _outerRadius(1.0f),
34  _innerRadius(0.5f),
35  _angleFrom(osg::PI / 4.0f),
36  _angleTo(osg::PI * 3.0f / 4.0f),
37  _outerAngleAddition(0.0f),
38  _height(1.0f) {}
39 
40  QSection(const osg::Vec3& center,float innerRadius,float outerRadius,
41  float angleFrom,float angleTo,float outerAngleAddition,float height):
42  _center(center),
43  _outerRadius(outerRadius),
44  _innerRadius(innerRadius),
45  _angleFrom(angleFrom),
46  _angleTo(angleTo),
47  _outerAngleAddition(0.0f),
48  _height(height) {}
49 
50  QSection(const QSection& qsection,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
51  osg::Shape(qsection,copyop),
52  _center(qsection._center),
53  _outerRadius(qsection._outerRadius),
54  _innerRadius(qsection._innerRadius),
55  _angleFrom(qsection._angleFrom),
56  _angleTo(qsection._angleTo),
58  _height(qsection._height),
59  _rotation(qsection._rotation) {}
60 
61 
62  virtual osg::Object* cloneType() const { return new QSection(); }
63  virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new QSection (*this,copyop); }
64  virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const QSection *>(obj)!=NULL; }
65  virtual const char* libraryName() const { return "osgq"; }
66  virtual const char* className() const { return "QSection"; }
67 
68  virtual void accept(osg::ShapeVisitor& sv) { (dynamic_cast<QShapeVisitor *>(&sv))->apply(*this); }
69  virtual void accept(osg::ConstShapeVisitor& csv) const { (dynamic_cast<QConstShapeVisitor *>(&csv))->apply(*this); }
70 
71 // virtual void accept(QShapeVisitor& sv) { sv.apply(*this); }
72 // virtual void accept(QConstShapeVisitor& csv) const { csv.apply(*this); }
73 
74  inline bool valid() const { return ((_innerRadius>=0.0f) && (_outerRadius >= _innerRadius) && (_angleFrom <= _angleTo)); }
75 
76  inline void set(const osg::Vec3& center,float outerRadius,float innerRadius,
77  float angleFrom,float angleTo,float outerAngleAddition,float height)
78  {
79  _center = center;
80  _outerRadius = outerRadius;
81  _innerRadius = innerRadius;
82  _angleFrom = angleFrom;
83  _angleTo = angleTo;
84  _outerAngleAddition = outerAngleAddition;
85  _height = height;
86  }
87 
88  inline void setCenter(const osg::Vec3& center) { _center = center; }
89  inline const osg::Vec3& getCenter() const { return _center; }
90 
91  inline void setOuterRadius(float outerRadius) { _outerRadius = outerRadius; }
92  inline float getOuterRadius() const { return _outerRadius; }
93 
94  inline void setInnerRadius(float innerRadius) { _innerRadius = innerRadius; }
95  inline float getInnerRadius() const { return _innerRadius; }
96 
97  inline void setAngleFrom(float angleFrom) { _angleFrom = angleFrom; }
98  inline float getAngleFrom() const { return _angleFrom; }
99 
100  inline void setAngleTo(float angleTo) { _angleTo = angleTo; }
101  inline float getAngleTo() const { return _angleTo; }
102 
103  inline void setOuterAngleAddition(float outerAngleAddition) { _outerAngleAddition = outerAngleAddition; }
104  // half of this addition will be added to [angleFrom] and half of it to [angleTo]
105  // (only on the outer side of the section)
106  inline float getOuterAngleAddition() const { return _outerAngleAddition; }
107 
108  inline void setHeight(float height) { _height = height; }
109  inline float getHeight() const { return _height; }
110 
111  inline void setRotation(const osg::Quat& quat) { _rotation = quat; }
112  inline const osg::Quat& getRotation() const { return _rotation; }
113  inline osg::Matrix computeRotationMatrix() const { return osg::Matrix(_rotation); }
114  bool zeroRotation() const { return _rotation.zeroRotation(); }
115 
116  inline int computeNumberOfSegments() const;
117 
118  protected:
119  virtual ~QSection() {}
120 
121  osg::Vec3 _center;
124  float _angleFrom;
125  float _angleTo;
127  float _height;
128  osg::Quat _rotation;
129  };
130 
131 
133  {
134  int n = (int) (_outerRadius * (_angleTo - _angleFrom) * (20.0f / osg::PI));
135  return (n < 0) ? 0 : n;
136  }
137 
138 }
139 
140 #endif