Omnidome
Fulldome Mapping Software Toolkit
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Private Attributes
omni::visual::WarpGrid Class Reference

Draw Handler for WarpGrid. More...

#include <WarpGrid.h>

Inheritance diagram for omni::visual::WarpGrid:
Inheritance graph
[legend]
Collaboration diagram for omni::visual::WarpGrid:
Collaboration graph
[legend]

Public Member Functions

 WarpGrid (omni::WarpGrid const &_warpGrid)
 
 ~WarpGrid ()
 
void draw () const
 Draw warp grid. More...
 
void drawLines ()
 Draw lines for warp grid. More...
 
void drawHandles (QColor const &_color, QRectF const &_rect)
 Draw handles for warp grid. More...
 
void update ()
 Generate geometry. More...
 
int subdivisions () const
 Return number of subdivisions. More...
 
void setSubdivisions (int _subDiv)
 Set number of subdivisions. More...
 
- Public Member Functions inherited from omni::visual::Interface
virtual ~Interface ()
 

Private Attributes

std::unique_ptr< Circlecircle_
 
std::vector< Vertex2D > vertices_
 
std::vector< QVector2D > gridVertices_
 
std::vector< GLuint > indices_
 
std::vector< GLuint > gridIndices_
 
VBO vertexVbo_
 
VBO indexVbo_
 
VBO gridVertexVbo_
 
VBO gridIndexVbo_
 
omni::WarpGrid const & warpGrid_
 
int subdivisions_ = 8
 

Additional Inherited Members

- Static Protected Member Functions inherited from omni::visual::Interface
static void vertex3 (QVector3D const &)
 glVertex3f from QVector3D More...
 
static void visualLine (QVector3D const &_from, QVector3D const &_to)
 Draws a line. More...
 
static void color (QColor _color, float _alpha=1.0)
 glColor4f from QColor More...
 

Detailed Description

Draw Handler for WarpGrid.

Constructor & Destructor Documentation

omni::visual::WarpGrid::WarpGrid ( omni::WarpGrid const &  _warpGrid)
31  :
32  warpGrid_(_warpGrid)
33  {}
omni::WarpGrid const & warpGrid_
Definition: WarpGrid.h:67
omni::visual::WarpGrid::~WarpGrid ( )
36  {}

Member Function Documentation

void omni::visual::WarpGrid::draw ( ) const
virtual

Draw warp grid.

Implements omni::visual::Interface.

39  {
40  withCurrentContext([this](QOpenGLFunctions& _)
41  {
42  _.glBindBuffer(GL_ARRAY_BUFFER, vertexVbo_.id());
43  _.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVbo_.id());
44 
45  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
46  glEnableClientState(GL_VERTEX_ARRAY);
47 
48  glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex2D),
49  (void *)Vertex2D::texCoordOffset());
50  glVertexPointer(2, GL_FLOAT, sizeof(Vertex2D),
51  (void *)Vertex2D::posOffset());
52 
53  _.glDrawElements(GL_QUADS, indices_.size() - 4,
54  GL_UNSIGNED_INT, 0);
55 
56  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
57  glDisableClientState(GL_VERTEX_ARRAY);
58 
59  _.glBindBuffer(GL_ARRAY_BUFFER, 0);
60  _.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
61  });
62  }
std::vector< GLuint > indices_
Definition: WarpGrid.h:62
void withCurrentContext(ContextFunctor f)
Do OpenGL operations with current context, if it exists.
Definition: ContextSwitch.cpp:45
GLuint id() const
Return buffer id.
Definition: VBO.cpp:65
VBO vertexVbo_
Definition: WarpGrid.h:64
VBO indexVbo_
Definition: WarpGrid.h:64
void omni::visual::WarpGrid::drawHandles ( QColor const &  _color,
QRectF const &  _rect 
)

Draw handles for warp grid.

88  {
89  if (!circle_) return;
90 
91  const float _radius = 0.1 / sqrt(
93  float _rX = _radius * _rect.width();
94  float _rY = _radius * _rect.height();
95 
96  withCurrentContext([&](QOpenGLFunctions& _)
97  {
98  for (auto& _point : warpGrid_.points())
99  {
100  glColor4f(1.0, 1.0, 1.0, 0.5);
101  circle_->drawLine(_point.pos(), _rX, _rY);
102 
103  if (_point.selected())
104  {
105  glColor4f(_color.redF(), _color.greenF(), _color.blueF(),
106  0.5);
107  circle_->drawFill(_point.pos(), _rX, _rY);
108  }
109  }
110  });
111  }
std::unique_ptr< Circle > circle_
Definition: WarpGrid.h:59
std::vector< WarpPoint > const & points() const
Return const reference to warp points.
Definition: WarpGrid.cpp:255
void withCurrentContext(ContextFunctor f)
Do OpenGL operations with current context, if it exists.
Definition: ContextSwitch.cpp:45
int horizontal() const
Return horizontal resolution.
Definition: WarpGrid.cpp:68
int vertical() const
Return vertical resolution.
Definition: WarpGrid.cpp:63
omni::WarpGrid const & warpGrid_
Definition: WarpGrid.h:67
void omni::visual::WarpGrid::drawLines ( )

Draw lines for warp grid.

65  {
66  withCurrentContext([this](QOpenGLFunctions& _)
67  {
68  glColor4f(1.0, 1.0, 1.0, 0.2);
69  glLineWidth(2.0);
70  _.glBindBuffer(GL_ARRAY_BUFFER, gridVertexVbo_.id());
71  _.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gridIndexVbo_.id());
72 
73  glEnableClientState(GL_VERTEX_ARRAY);
74 
75  glVertexPointer(2, GL_FLOAT, sizeof(QVector2D), 0);
76 
77  _.glDrawElements(GL_LINES, gridIndices_.size() - 4,
78  GL_UNSIGNED_INT, 0);
79 
80  glDisableClientState(GL_VERTEX_ARRAY);
81 
82  _.glBindBuffer(GL_ARRAY_BUFFER, 0);
83  _.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
84  });
85  }
VBO gridVertexVbo_
Definition: WarpGrid.h:65
std::vector< GLuint > gridIndices_
Definition: WarpGrid.h:63
VBO gridIndexVbo_
Definition: WarpGrid.h:65
void withCurrentContext(ContextFunctor f)
Do OpenGL operations with current context, if it exists.
Definition: ContextSwitch.cpp:45
GLuint id() const
Return buffer id.
Definition: VBO.cpp:65
void omni::visual::WarpGrid::setSubdivisions ( int  _subDiv)

Set number of subdivisions.

117  {
118  subdivisions_ = _subdivisions;
119  update();
120  }
void update()
Generate geometry.
Definition: WarpGrid.cpp:122
int subdivisions_
Definition: WarpGrid.h:68
int omni::visual::WarpGrid::subdivisions ( ) const

Return number of subdivisions.

113  {
114  return subdivisions_;
115  }
int subdivisions_
Definition: WarpGrid.h:68
void omni::visual::WarpGrid::update ( )
virtual

Generate geometry.

Generate grid

Reimplemented from omni::visual::Interface.

123  {
124  if (!warpGrid_.hasChanged()) {
125  return;
126  }
127 
128  primaryContextSwitch([&](QOpenGLFunctions& _) {
129  if (!circle_) {
130  circle_.reset(new Circle());
131  }
132 
133 
134  vertexVbo_.gen();
135  indexVbo_.gen();
137  gridIndexVbo_.gen();
138 
139  size_t _resX = subdivisions() * (warpGrid_.horizontal() - 1) + 1;
140  size_t _resY = subdivisions() * (warpGrid_.vertical() - 1) + 1;
141  size_t _numVertices = _resX * _resY;
142  bool _resized = vertices_.size() != _numVertices;
143 
144  if (_resized) {
145  vertices_.clear();
146  vertices_.resize(_numVertices);
147  indices_.clear();
148  indices_.resize(4 * _numVertices);
149 
150  gridVertices_.clear();
151  size_t _num = (2 * subdivisions()) * warpGrid_.horizontal() * warpGrid_.vertical();
152  gridVertices_.resize(_num);
153  gridIndices_.clear();
154  gridIndices_.resize(_num * 2);
155  }
156 
157  auto _vertexIt = vertices_.begin();
158  auto _indexIt = indices_.begin();
159 
160  for (size_t x = 0; x < _resX; ++x) {
161  for (size_t y = 0; y < _resY; ++y) {
162  // index
163  if (_resized) {
164  if (((x + 1) < _resX) && ((y + 1) < _resY)) {
165  *(_indexIt++) = (x + 0) * _resY + (y + 0);
166  *(_indexIt++) = (x + 1) * _resY + (y + 0);
167  *(_indexIt++) = (x + 1) * _resY + (y + 1);
168  *(_indexIt++) = (x + 0) * _resY + (y + 1);
169  }
170 
171  // texCoords
172  float tx = x / (float)(_resX - 1);
173  float ty = y / (float)(_resY - 1);
174  _vertexIt->setTexCoord(QVector2D(tx, 1.0 - ty));
175  }
176 
177  // transform coordinates to [0..numControls]
178  float u = x * (warpGrid_.horizontal() - 1) /
179  (float)(_resX - 1);
180  float v = y * (warpGrid_.vertical() - 1) /
181  (float)(_resY - 1);
182 
183  // determine col and row
184  int _col = (int)(u);
185  int _row = (int)(v);
186 
187  // normalize coordinates to [0..1]
188  u -= _col;
189  v -= _row;
190 
191  _vertexIt->setPos(warpGrid_.getWarpPointPos(_col, _row, u, v));
192  ++_vertexIt;
193  }
194  }
195 
196  /// Generate grid
197  auto _gridVertexIt = gridVertices_.begin();
198  auto _gridIndexIt = gridIndices_.begin();
199 
200  // Generate horizontal lines
201  size_t i = 0;
202 
203  for (size_t y = 0; y < _resY; y += subdivisions()) {
204  for (size_t x = 0; x < _resX; ++x) {
205  *(_gridVertexIt++) = vertices_[x * _resY + y].pos();
206 
207  if (x < _resX - 1) {
208  *(_gridIndexIt++) = i;
209  *(_gridIndexIt++) = i + 1;
210  }
211  ++i;
212  }
213  }
214 
215  // Generate vertical lines
216  for (size_t x = 0; x < _resX; x += subdivisions()) {
217  for (size_t y = 0; y < _resY; ++y) {
218  *(_gridVertexIt++) = vertices_[x * _resY + y].pos();
219 
220  if (y < _resY - 1) {
221  *(_gridIndexIt++) = i;
222  *(_gridIndexIt++) = i + 1;
223  }
224  ++i;
225  }
226  }
227 
230 
233  });
234  }
std::vector< GLuint > indices_
Definition: WarpGrid.h:62
std::unique_ptr< Circle > circle_
Definition: WarpGrid.h:59
void bufferStaticElementArray(BUF const &_buf)
Copy static index array onto GPU.
Definition: VBO.h:59
VBO gridVertexVbo_
Definition: WarpGrid.h:65
std::vector< GLuint > gridIndices_
Definition: WarpGrid.h:63
bool hasChanged() const
Return true if warp grid has changed.
Definition: WarpGrid.cpp:251
VBO gridIndexVbo_
Definition: WarpGrid.h:65
int subdivisions() const
Return number of subdivisions.
Definition: WarpGrid.cpp:113
std::vector< QVector2D > gridVertices_
Definition: WarpGrid.h:61
VBO vertexVbo_
Definition: WarpGrid.h:64
std::vector< Vertex2D > vertices_
Definition: WarpGrid.h:60
QVector2D getWarpPointPos(int x, int y) const
Return position of warp point.
Definition: WarpGrid.cpp:104
void gen()
Generate a new VBO and get the associated ID.
Definition: VBO.cpp:38
int horizontal() const
Return horizontal resolution.
Definition: WarpGrid.cpp:68
void bufferStaticArray(BUF const &_buf)
Copy static vertex array onto GPU.
Definition: VBO.h:44
int vertical() const
Return vertical resolution.
Definition: WarpGrid.cpp:63
void primaryContextSwitch(ContextFunctor f)
Switch to primary context to create OpenGL objects like textures etc.
Definition: ContextSwitch.cpp:40
VBO indexVbo_
Definition: WarpGrid.h:64
omni::WarpGrid const & warpGrid_
Definition: WarpGrid.h:67

Field Documentation

std::unique_ptr<Circle> omni::visual::WarpGrid::circle_
private
VBO omni::visual::WarpGrid::gridIndexVbo_
private
std::vector<GLuint> omni::visual::WarpGrid::gridIndices_
private
VBO omni::visual::WarpGrid::gridVertexVbo_
private
std::vector<QVector2D> omni::visual::WarpGrid::gridVertices_
private
VBO omni::visual::WarpGrid::indexVbo_
private
std::vector<GLuint> omni::visual::WarpGrid::indices_
private
int omni::visual::WarpGrid::subdivisions_ = 8
private
VBO omni::visual::WarpGrid::vertexVbo_
private
std::vector<Vertex2D> omni::visual::WarpGrid::vertices_
private
omni::WarpGrid const& omni::visual::WarpGrid::warpGrid_
private

The documentation for this class was generated from the following files: