Omnidome
Fulldome Mapping Software Toolkit
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
omni::canvas::util Namespace Reference

Functions

template<typename VERTICES , typename INDICES >
static void generateCone (size_t _slices, float _zTop, float _zBottom, float _radius, VERTICES &_vertices, INDICES &indices)
 Generate a cone with vertices and indices. More...
 
template<typename VERTICES , typename INDICES >
static void generateSphereStack (size_t _slices, float _zTop, float _zBottom, float _topRadius, float _bottomRadius, VERTICES &_vertices, INDICES &indices)
 Generate a stack with top and bottom radius. More...
 
template<typename VERTICES , typename INDICES >
static void generateSphere (size_t _stacks, size_t _slices, VERTICES &_vertices, INDICES &indices)
 Generate a sphere. More...
 
template<typename VERTICES , typename INDICES >
static void generateSphereUpper (size_t _stacks, size_t _slices, float _bottom, VERTICES &_vertices, INDICES &indices)
 Generate bottom cut off sphere. More...
 

Function Documentation

template<typename VERTICES , typename INDICES >
static void omni::canvas::util::generateCone ( size_t  _slices,
float  _zTop,
float  _zBottom,
float  _radius,
VERTICES &  _vertices,
INDICES &  indices 
)
static

Generate a cone with vertices and indices.

37  {
38  size_t _startIndex = _vertices.size();
39 
40  QVector3D _p(0, 0, _zTop);
41 
42  _vertices.emplace_back(_p, _p.normalized(), QPointF(0.5, 0.0));
43 
44  for_each_circle_point(_slices, _radius, [&](size_t i, const QPointF& _p2)
45  {
46  _p = QVector3D(_p2.x(), _p2.y(), _zBottom);
47  QVector3D _normal = _p.normalized();
48  _vertices.emplace_back(_p, _normal,
49  QPointF(float(i) / _slices,
50  acos(_normal.z()) / M_PI));
51 
52  if (_zTop > _zBottom)
53  {
54  indices.push_back(_startIndex);
55  indices.push_back(_startIndex + 1 + i);
56  indices.push_back(_startIndex + 1 + (i + 1) % _slices);
57  } else
58  {
59  indices.push_back(_startIndex + 1 + (i + 1) % _slices);
60  indices.push_back(_startIndex + 1 + i);
61  indices.push_back(_startIndex);
62  }
63  });
64  }
void for_each_circle_point(size_t _numVertices, float _radius, F _f)
Definition: util.h:44
template<typename VERTICES , typename INDICES >
static void omni::canvas::util::generateSphere ( size_t  _stacks,
size_t  _slices,
VERTICES &  _vertices,
INDICES &  indices 
)
static

Generate a sphere.

Top cone

Bottom cone

111  {
112  // If there are M lines of latitude (horizontal) and
113  // N lines of longitude (vertical), then put dots at
114  // (x, y, z) = (sin(Pi * m/M) cos(2Pi * n/N), sin(Pi * m/M) sin(2Pi *
115  // n/N), cos(Pi * m/M))
116  auto stackRadius = [&_stacks](size_t index)
117  {
118  return sin(M_PI * float(index) / _stacks);
119  };
120  auto stackPos = [&_stacks](size_t index)
121  {
122  return cos(M_PI * float(index) / _stacks);
123  };
124 
125  /// Top cone
126  generateCone(_slices, 1.0, stackPos(1), stackRadius(1), _vertices,
127  indices);
128 
129  /// Bottom cone
130  generateCone(_slices, -1.0, stackPos(_stacks - 1), stackRadius(
131  1), _vertices, indices);
132 
133  for (size_t i = 1; i < _stacks - 1; ++i)
134  {
135  generateSphereStack(_slices,
136  stackPos(i), stackPos(i + 1),
137  stackRadius(i), stackRadius(i + 1),
138  _vertices, indices);
139  }
140  }
static void generateSphereStack(size_t _slices, float _zTop, float _zBottom, float _topRadius, float _bottomRadius, VERTICES &_vertices, INDICES &indices)
Generate a stack with top and bottom radius.
Definition: util.h:68
static void generateCone(size_t _slices, float _zTop, float _zBottom, float _radius, VERTICES &_vertices, INDICES &indices)
Generate a cone with vertices and indices.
Definition: util.h:31
template<typename VERTICES , typename INDICES >
static void omni::canvas::util::generateSphereStack ( size_t  _slices,
float  _zTop,
float  _zBottom,
float  _topRadius,
float  _bottomRadius,
VERTICES &  _vertices,
INDICES &  indices 
)
static

Generate a stack with top and bottom radius.

Top triangle

Bottom triangle

72  {
73  size_t _startIndex = _vertices.size();
74 
75  for (size_t i = 0; i <= _slices; ++i)
76  {
77  float _m = 2.0 * M_PI * float(i) / _slices;
78  float _cos = cos(_m), _sin = sin(_m);
79  QVector3D _top(_cos * _topRadius, _sin * _topRadius, _zTop);
80  QVector3D _bottom(_cos * _bottomRadius, _sin * _bottomRadius, _zBottom);
81  QVector3D _normalTop(_top.normalized());
82  QVector3D _normalBottom(_bottom.normalized());
83  _vertices.emplace_back(_top, _normalTop,
84  QPointF(float(i) / _slices,
85  acos(_normalTop.z()) / M_PI));
86  _vertices.emplace_back(_bottom, _normalBottom,
87  QPointF(float(i) / _slices,
88  acos(_normalBottom.z()) / M_PI));
89  }
90 
91  for (size_t i = 0; i < _slices; ++i)
92  {
93  /// Top triangle
94  indices.push_back(_startIndex + 2 * i);
95  indices.push_back(_startIndex + 2 * i + 1);
96  indices.push_back(_startIndex + 2 * (i + 1));
97 
98  /// Bottom triangle
99  indices.push_back(_startIndex + 2 * i + 1);
100  indices.push_back(_startIndex + 2 * (i + 1) + 1);
101  indices.push_back(_startIndex + 2 * (i + 1));
102  }
103  }
template<typename VERTICES , typename INDICES >
static void omni::canvas::util::generateSphereUpper ( size_t  _stacks,
size_t  _slices,
float  _bottom,
VERTICES &  _vertices,
INDICES &  indices 
)
static

Generate bottom cut off sphere.

Top cone

149  {
150  /// Top cone
151  auto stackRadius = [&_stacks](size_t index)
152  {
153  return sin(M_PI * float(index) / _stacks);
154  };
155  auto stackPos = [&_stacks](size_t index)
156  {
157  return cos(M_PI * float(index) / _stacks);
158  };
159 
160  generateCone(_slices, 1.0, stackPos(1), stackRadius(1), _vertices,
161  indices);
162 
163  for (size_t i = 1; i < _stacks - 1; ++i)
164  {
165  float _stackPos = stackPos(i + 1);
166 
167  if (_stackPos < _bottom) continue;
168  generateSphereStack(_slices,
169  stackPos(i), stackPos(i + 1),
170  stackRadius(i), stackRadius(i + 1),
171  _vertices, indices);
172  }
173  }
static void generateSphereStack(size_t _slices, float _zTop, float _zBottom, float _topRadius, float _bottomRadius, VERTICES &_vertices, INDICES &indices)
Generate a stack with top and bottom radius.
Definition: util.h:68
static void generateCone(size_t _slices, float _zTop, float _zBottom, float _radius, VERTICES &_vertices, INDICES &indices)
Generate a cone with vertices and indices.
Definition: util.h:31