129 float inner_radius,
float outer_radius,
135 : m_name(
name), m_st(st), m_pmvMatUni(pmvMatUni),
136 m_colorUniform(
std::move(colorUniform)), m_gearColor(gearColor), m_tx(tx),
137 m_useMappedBuffers(false), m_picked(false), m_objbox(), m_viewbox(), m_PMvi() {
138 const float dz = width * 0.5f;
145 const float r0 = inner_radius;
146 const float r1 = outer_radius - tooth_depth / 2.0f;
147 const float r2 = outer_radius + tooth_depth / 2.0f;
149 const float da = 2.0f * std::numbers::pi_v<float> / float(teeth) / 4.0f;
154 const GLenum vboUsage = GL_STATIC_DRAW;
156 m_frontFace = createInterleaved(m_useMappedBuffers, 6,
false, 4 * teeth + 2, vboUsage);
157 addInterleavedVertexAndNormalArrays(m_frontFace, 3);
158 m_backFace = createInterleaved(m_useMappedBuffers, 6,
false, 4 * teeth + 2, vboUsage);
159 addInterleavedVertexAndNormalArrays(m_backFace, 3);
160 m_frontSide = createInterleaved(m_useMappedBuffers, 6,
false, 6 * teeth, vboUsage);
161 addInterleavedVertexAndNormalArrays(m_frontSide, 3);
162 m_backSide = createInterleaved(m_useMappedBuffers, 6,
false, 6 * teeth, vboUsage);
163 addInterleavedVertexAndNormalArrays(m_backSide, 3);
164 m_outwardFace = createInterleaved(m_useMappedBuffers, 6,
false, 4 * 4 * teeth + 2, vboUsage);
165 addInterleavedVertexAndNormalArrays(m_outwardFace, 3);
166 m_insideRadiusCyl = createInterleaved(m_useMappedBuffers, 6,
false, 2 * teeth + 2, vboUsage);
167 addInterleavedVertexAndNormalArrays(m_insideRadiusCyl, 3);
169 for( GLsizei i = 0; i < teeth; i++ ) {
170 const float angle = float(i) * 2.0f * std::numbers::pi_v<float> / float(teeth);
171 sincos(angle + da * 0.0f, s, 0, c, 0);
172 sincos(angle + da * 1.0f, s, 1, c, 1);
173 sincos(angle + da * 2.0f, s, 2, c, 2);
174 sincos(angle + da * 3.0f, s, 3, c, 3);
180 vert(m_frontFace, r0 * c[0], r0 * s[0], dz, normal);
181 vert(m_frontFace, r1 * c[0], r1 * s[0], dz, normal);
182 vert(m_frontFace, r0 * c[0], r0 * s[0], dz, normal);
183 vert(m_frontFace, r1 * c[3], r1 * s[3], dz, normal);
186 vert(m_frontSide, r1 * c[0], r1 * s[0], dz, normal);
187 vert(m_frontSide, r2 * c[1], r2 * s[1], dz, normal);
188 vert(m_frontSide, r2 * c[2], r2 * s[2], dz, normal);
189 vert(m_frontSide, r1 * c[0], r1 * s[0], dz, normal);
190 vert(m_frontSide, r2 * c[2], r2 * s[2], dz, normal);
191 vert(m_frontSide, r1 * c[3], r1 * s[3], dz, normal);
197 vert(m_backFace, r1 * c[0], r1 * s[0], -dz, normal);
198 vert(m_backFace, r0 * c[0], r0 * s[0], -dz, normal);
199 vert(m_backFace, r1 * c[3], r1 * s[3], -dz, normal);
200 vert(m_backFace, r0 * c[0], r0 * s[0], -dz, normal);
203 vert(m_backSide, r1 * c[3], r1 * s[3], -dz, normal);
204 vert(m_backSide, r2 * c[2], r2 * s[2], -dz, normal);
205 vert(m_backSide, r2 * c[1], r2 * s[1], -dz, normal);
206 vert(m_backSide, r1 * c[3], r1 * s[3], -dz, normal);
207 vert(m_backSide, r2 * c[1], r2 * s[1], -dz, normal);
208 vert(m_backSide, r1 * c[0], r1 * s[0], -dz, normal);
211 u = r2 * c[1] - r1 * c[0];
212 v = r2 * s[1] - r1 * s[0];
213 len = std::sqrt(u * u + v * v);
218 vert(m_outwardFace, r1 * c[0], r1 * s[0], dz, normal);
219 vert(m_outwardFace, r1 * c[0], r1 * s[0], -dz, normal);
220 vert(m_outwardFace, r2 * c[1], r2 * s[1], dz, normal);
221 vert(m_outwardFace, r2 * c[1], r2 * s[1], -dz, normal);
225 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[2], r2 * s[2], dz, normal);
228 vert(m_outwardFace, r2 * c[2], r2 * s[2], -dz, normal);
230 normal[0] = (r1 * s[3] - r2 * s[2]);
231 normal[1] = (r1 * c[3] - r2 * c[2]) * -1.0f;
232 vert(m_outwardFace, r2 * c[2], r2 * s[2], dz, normal);
233 vert(m_outwardFace, r2 * c[2], r2 * s[2], -dz, normal);
234 vert(m_outwardFace, r1 * c[3], r1 * s[3], dz, normal);
235 vert(m_outwardFace, r1 * c[3], r1 * s[3], -dz, normal);
239 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[0], r1 * s[0], dz, normal);
242 vert(m_outwardFace, r1 * c[0], r1 * s[0], -dz, normal);
245 normal[0] = c[0] * -1.0f;
246 normal[1] = s[0] * -1.0f;
248 vert(m_insideRadiusCyl, r0 * c[0], r0 * s[0], -dz, normal);
249 vert(m_insideRadiusCyl, r0 * c[0], r0 * s[0], dz, normal);
255 vert(m_frontFace, r0 * c[4], r0 * s[4], dz, normal);
256 vert(m_frontFace, r1 * c[4], r1 * s[4], dz, normal);
257 m_frontFace->seal(
true);
261 vert(m_backFace, r1 * c[4], r1 * s[4], -dz, normal);
262 vert(m_backFace, r0 * c[4], r0 * s[4], -dz, normal);
263 m_backFace->seal(
true);
265 m_backSide->seal(
true);
266 m_frontSide->seal(
true);
269 sincos(da * 1.0f, s, 1, c, 1);
270 u = r2 * c[1] - r1 * c[4];
271 v = r2 * s[1] - r1 * s[4];
272 len = std::sqrt(u * u + v * v);
278 vert(m_outwardFace, r1 * c[4], r1 * s[4], dz, normal);
279 vert(m_outwardFace, r1 * c[4], r1 * s[4], -dz, normal);
280 m_outwardFace->seal(
true);
283 normal[0] = c[4] * -1.0f;
284 normal[1] = s[4] * -1.0f;
286 vert(m_insideRadiusCyl, r0 * c[4], r0 * s[4], -dz, normal);
287 vert(m_insideRadiusCyl, r0 * c[4], r0 * s[4], dz, normal);
288 m_insideRadiusCyl->seal(
true);