130 float inner_radius,
float outer_radius,
136 : m_name(
name), m_st(st), m_pmvMatrix(pmvMatrix), m_pmvMatrixUniform(
std::move(pmvMatrixUniform)),
137 m_colorUniform(
std::move(colorUniform)), m_gearColor(gearColor), m_tx(tx),
138 m_useMappedBuffers(false), m_picked(false), m_objbox(), m_viewbox(), m_PMvi() {
139 const float dz = width * 0.5f;
146 const float r0 = inner_radius;
147 const float r1 = outer_radius - tooth_depth / 2.0f;
148 const float r2 = outer_radius + tooth_depth / 2.0f;
150 const float da = 2.0f * std::numbers::pi_v<float> / float(teeth) / 4.0f;
155 const GLenum vboUsage = GL_STATIC_DRAW;
157 m_frontFace = createInterleaved(m_useMappedBuffers, 6,
false, 4 * teeth + 2, vboUsage);
158 addInterleavedVertexAndNormalArrays(m_frontFace, 3);
159 m_backFace = createInterleaved(m_useMappedBuffers, 6,
false, 4 * teeth + 2, vboUsage);
160 addInterleavedVertexAndNormalArrays(m_backFace, 3);
161 m_frontSide = createInterleaved(m_useMappedBuffers, 6,
false, 6 * teeth, vboUsage);
162 addInterleavedVertexAndNormalArrays(m_frontSide, 3);
163 m_backSide = createInterleaved(m_useMappedBuffers, 6,
false, 6 * teeth, vboUsage);
164 addInterleavedVertexAndNormalArrays(m_backSide, 3);
165 m_outwardFace = createInterleaved(m_useMappedBuffers, 6,
false, 4 * 4 * teeth + 2, vboUsage);
166 addInterleavedVertexAndNormalArrays(m_outwardFace, 3);
167 m_insideRadiusCyl = createInterleaved(m_useMappedBuffers, 6,
false, 2 * teeth + 2, vboUsage);
168 addInterleavedVertexAndNormalArrays(m_insideRadiusCyl, 3);
170 for( GLsizei i = 0; i < teeth; i++ ) {
171 const float angle = float(i) * 2.0f * std::numbers::pi_v<float> / float(teeth);
172 sincos(angle + da * 0.0f, s, 0, c, 0);
173 sincos(angle + da * 1.0f, s, 1, c, 1);
174 sincos(angle + da * 2.0f, s, 2, c, 2);
175 sincos(angle + da * 3.0f, s, 3, c, 3);
181 vert(m_frontFace, r0 * c[0], r0 * s[0], dz, normal);
182 vert(m_frontFace, r1 * c[0], r1 * s[0], dz, normal);
183 vert(m_frontFace, r0 * c[0], r0 * s[0], dz, normal);
184 vert(m_frontFace, r1 * c[3], r1 * s[3], dz, normal);
187 vert(m_frontSide, r1 * c[0], r1 * s[0], dz, normal);
188 vert(m_frontSide, r2 * c[1], r2 * s[1], dz, normal);
189 vert(m_frontSide, r2 * c[2], r2 * s[2], dz, normal);
190 vert(m_frontSide, r1 * c[0], r1 * s[0], dz, normal);
191 vert(m_frontSide, r2 * c[2], r2 * s[2], dz, normal);
192 vert(m_frontSide, r1 * c[3], r1 * s[3], dz, normal);
198 vert(m_backFace, r1 * c[0], r1 * s[0], -dz, normal);
199 vert(m_backFace, r0 * c[0], r0 * s[0], -dz, normal);
200 vert(m_backFace, r1 * c[3], r1 * s[3], -dz, normal);
201 vert(m_backFace, r0 * c[0], r0 * s[0], -dz, normal);
204 vert(m_backSide, r1 * c[3], r1 * s[3], -dz, normal);
205 vert(m_backSide, r2 * c[2], r2 * s[2], -dz, normal);
206 vert(m_backSide, r2 * c[1], r2 * s[1], -dz, normal);
207 vert(m_backSide, r1 * c[3], r1 * s[3], -dz, normal);
208 vert(m_backSide, r2 * c[1], r2 * s[1], -dz, normal);
209 vert(m_backSide, r1 * c[0], r1 * s[0], -dz, normal);
212 u = r2 * c[1] - r1 * c[0];
213 v = r2 * s[1] - r1 * s[0];
214 len = std::sqrt(u * u + v * v);
219 vert(m_outwardFace, r1 * c[0], r1 * s[0], dz, normal);
220 vert(m_outwardFace, r1 * c[0], r1 * s[0], -dz, normal);
221 vert(m_outwardFace, r2 * c[1], r2 * s[1], dz, normal);
222 vert(m_outwardFace, r2 * c[1], r2 * s[1], -dz, normal);
226 vert(m_outwardFace, r2 * c[1], r2 * s[1], dz, normal);
227 vert(m_outwardFace, r2 * c[1], r2 * s[1], -dz, normal);
228 vert(m_outwardFace, r2 * c[2], r2 * s[2], dz, normal);
229 vert(m_outwardFace, r2 * c[2], r2 * s[2], -dz, normal);
231 normal[0] = (r1 * s[3] - r2 * s[2]);
232 normal[1] = (r1 * c[3] - r2 * c[2]) * -1.0f;
233 vert(m_outwardFace, r2 * c[2], r2 * s[2], dz, normal);
234 vert(m_outwardFace, r2 * c[2], r2 * s[2], -dz, normal);
235 vert(m_outwardFace, r1 * c[3], r1 * s[3], dz, normal);
236 vert(m_outwardFace, r1 * c[3], r1 * s[3], -dz, normal);
240 vert(m_outwardFace, r1 * c[3], r1 * s[3], dz, normal);
241 vert(m_outwardFace, r1 * c[3], r1 * s[3], -dz, normal);
242 vert(m_outwardFace, r1 * c[0], r1 * s[0], dz, normal);
243 vert(m_outwardFace, r1 * c[0], r1 * s[0], -dz, normal);
246 normal[0] = c[0] * -1.0f;
247 normal[1] = s[0] * -1.0f;
249 vert(m_insideRadiusCyl, r0 * c[0], r0 * s[0], -dz, normal);
250 vert(m_insideRadiusCyl, r0 * c[0], r0 * s[0], dz, normal);
256 vert(m_frontFace, r0 * c[4], r0 * s[4], dz, normal);
257 vert(m_frontFace, r1 * c[4], r1 * s[4], dz, normal);
258 m_frontFace->seal(
true);
262 vert(m_backFace, r1 * c[4], r1 * s[4], -dz, normal);
263 vert(m_backFace, r0 * c[4], r0 * s[4], -dz, normal);
264 m_backFace->seal(
true);
266 m_backSide->seal(
true);
267 m_frontSide->seal(
true);
270 sincos(da * 1.0f, s, 1, c, 1);
271 u = r2 * c[1] - r1 * c[4];
272 v = r2 * s[1] - r1 * s[4];
273 len = std::sqrt(u * u + v * v);
279 vert(m_outwardFace, r1 * c[4], r1 * s[4], dz, normal);
280 vert(m_outwardFace, r1 * c[4], r1 * s[4], -dz, normal);
281 m_outwardFace->seal(
true);
284 normal[0] = c[4] * -1.0f;
285 normal[1] = s[4] * -1.0f;
287 vert(m_insideRadiusCyl, r0 * c[4], r0 * s[4], -dz, normal);
288 vert(m_insideRadiusCyl, r0 * c[4], r0 * s[4], dz, normal);
289 m_insideRadiusCyl->seal(
true);