20 #ifndef OMNI_CANVAS_UTIL_HPP_
21 #define OMNI_CANVAS_UTIL_HPP_
30 template<
typename VERTICES,
typename INDICES>
38 size_t _startIndex = _vertices.size();
40 QVector3D _p(0, 0, _zTop);
42 _vertices.emplace_back(_p, _p.normalized(), QPointF(0.5, 0.0));
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));
54 indices.push_back(_startIndex);
55 indices.push_back(_startIndex + 1 + i);
56 indices.push_back(_startIndex + 1 + (i + 1) % _slices);
59 indices.push_back(_startIndex + 1 + (i + 1) % _slices);
60 indices.push_back(_startIndex + 1 + i);
61 indices.push_back(_startIndex);
67 template<
typename VERTICES,
typename INDICES>
69 float _zTop,
float _zBottom,
70 float _topRadius,
float _bottomRadius,
71 VERTICES& _vertices, INDICES& indices)
73 size_t _startIndex = _vertices.size();
75 for (
size_t i = 0; i <= _slices; ++i)
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));
91 for (
size_t i = 0; i < _slices; ++i)
94 indices.push_back(_startIndex + 2 * i);
95 indices.push_back(_startIndex + 2 * i + 1);
96 indices.push_back(_startIndex + 2 * (i + 1));
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));
106 template<
typename VERTICES,
typename INDICES>
116 auto stackRadius = [&_stacks](
size_t index)
118 return sin(M_PI *
float(index) / _stacks);
120 auto stackPos = [&_stacks](
size_t index)
122 return cos(M_PI *
float(index) / _stacks);
126 generateCone(_slices, 1.0, stackPos(1), stackRadius(1), _vertices,
130 generateCone(_slices, -1.0, stackPos(_stacks - 1), stackRadius(
131 1), _vertices, indices);
133 for (
size_t i = 1; i < _stacks - 1; ++i)
136 stackPos(i), stackPos(i + 1),
137 stackRadius(i), stackRadius(i + 1),
143 template<
typename VERTICES,
typename INDICES>
151 auto stackRadius = [&_stacks](
size_t index)
153 return sin(M_PI *
float(index) / _stacks);
155 auto stackPos = [&_stacks](
size_t index)
157 return cos(M_PI *
float(index) / _stacks);
160 generateCone(_slices, 1.0, stackPos(1), stackRadius(1), _vertices,
163 for (
size_t i = 1; i < _stacks - 1; ++i)
165 float _stackPos = stackPos(i + 1);
167 if (_stackPos < _bottom)
continue;
169 stackPos(i), stackPos(i + 1),
170 stackRadius(i), stackRadius(i + 1),
static void generateSphereUpper(size_t _stacks, size_t _slices, float _bottom, VERTICES &_vertices, INDICES &indices)
Generate bottom cut off sphere.
Definition: util.h:144
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
void for_each_circle_point(size_t _numVertices, float _radius, F _f)
Definition: util.h:44
static void generateSphere(size_t _stacks, size_t _slices, VERTICES &_vertices, INDICES &indices)
Generate a sphere.
Definition: util.h:107