23 static void Rototranslate(
const CVector3& c_position,
24 const CQuaternion& c_orientation) {
26 CRadians cZAngle, cYAngle, cXAngle;
27 c_orientation.ToEulerAngles(cZAngle, cYAngle, cXAngle);
29 glTranslatef(c_position.GetX(), c_position.GetY(), c_position.GetZ());
31 glRotatef(
ToDegrees(cXAngle).GetValue(), 1.0f, 0.0f, 0.0f);
32 glRotatef(
ToDegrees(cYAngle).GetValue(), 0.0f, 1.0f, 0.0f);
33 glRotatef(
ToDegrees(cZAngle).GetValue(), 0.0f, 0.0f, 1.0f);
40 m_vecFunctionHolders(1),
41 m_pcQTOpenGLMainWindow(NULL) {
94 return *m_pcQTOpenGLMainWindow;
101 m_pcQTOpenGLMainWindow = &c_main_win;
115 const GLfloat pfColor[] = {
116 c_color.
GetRed() / 255.0f,
123 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
131 const Real f_diameter) {
133 glPushAttrib(GL_POINT_BIT);
137 glPointSize(f_diameter);
138 glEnable(GL_POINT_SMOOTH);
141 glVertex3f(c_position.
GetX(), c_position.
GetY(), c_position.
GetZ());
157 glPushAttrib(GL_POLYGON_BIT);
162 glDisable(GL_CULL_FACE);
164 glEnable(GL_POLYGON_SMOOTH);
165 glPolygonMode(GL_FRONT_AND_BACK, b_fill ? GL_FILL : GL_LINE);
167 Rototranslate(c_position, c_orientation);
169 glBegin(GL_TRIANGLES);
170 glNormal3f(0.0f, 0.0f, 1.0f);
171 glVertex3f(-f_base * 0.5f, 0.0f, 0.0f);
172 glVertex3f( f_base * 0.5f, 0.0f, 0.0f);
173 glVertex3f( 0.0f, f_height, 0.0f);
185 const std::vector<CVector2>& vec_points,
188 if(vec_points.size() < 2) {
189 LOGERR <<
"CQTOpenGLUserFunctions::DrawPolygon() needs at least 3 points." << std::endl;
193 glPushAttrib(GL_POLYGON_BIT);
197 glDisable(GL_CULL_FACE);
199 glEnable(GL_POLYGON_SMOOTH);
200 glPolygonMode(GL_FRONT_AND_BACK, b_fill ? GL_FILL : GL_LINE);
202 Rototranslate(c_position, c_orientation);
205 glNormal3f(0.0f, 0.0f, 1.0f);
206 for(
size_t i = 0; i < vec_points.size(); ++i) {
207 glVertex3f(vec_points[i].GetX(), vec_points[i].GetY(), 0.0f);
211 glTranslatef(-c_position.
GetX(), -c_position.
GetY(), -c_position.
GetZ());
224 GLuint un_vertices) {
226 glPushAttrib(GL_POLYGON_BIT);
231 glDisable(GL_CULL_FACE);
233 glEnable(GL_POLYGON_SMOOTH);
234 glPolygonMode(GL_FRONT_AND_BACK, b_fill ? GL_FILL : GL_LINE);
236 Rototranslate(c_position, c_orientation);
241 glNormal3f(0.0f, 0.0f, 1.0f);
242 for(
size_t i = 0; i < un_vertices; ++i) {
243 glVertex3f(cVertex.
GetX(), cVertex.
GetY(), 0.0f);
260 GLuint un_vertices) {
266 Rototranslate(c_position, c_orientation);
268 Real fHalfHeight = f_height * 0.5f;
271 glBegin(GL_QUAD_STRIP);
272 for(GLuint i = 0; i <= un_vertices; i++) {
273 glNormal3f(cVertex.
GetX(), cVertex.
GetY(), 0.0f);
274 glVertex3f(cVertex.
GetX() * f_radius, cVertex.
GetY() * f_radius, fHalfHeight);
275 glVertex3f(cVertex.
GetX() * f_radius, cVertex.
GetY() * f_radius, -fHalfHeight);
280 cVertex.
Set(f_radius, 0.0f);
282 glNormal3f(0.0f, 0.0f, 1.0f);
283 for(GLuint i = 0; i <= un_vertices; i++) {
284 glVertex3f(cVertex.
GetX(), cVertex.
GetY(), fHalfHeight);
289 cVertex.
Set(f_radius, 0.0f);
292 glNormal3f(0.0f, 0.0f, -1.0f);
293 for(GLuint i = 0; i <= un_vertices; i++) {
294 glVertex3f(cVertex.
GetX(), cVertex.
GetY(), -fHalfHeight);
314 Rototranslate(c_position, c_orientation);
319 glNormal3f(0.0f, 0.0f, -1.0f);
320 glVertex3f( cHalfSize.
GetX(), cHalfSize.
GetY(), -cHalfSize.
GetZ());
321 glVertex3f( cHalfSize.
GetX(), -cHalfSize.
GetY(), -cHalfSize.
GetZ());
322 glVertex3f(-cHalfSize.
GetX(), -cHalfSize.
GetY(), -cHalfSize.
GetZ());
323 glVertex3f(-cHalfSize.
GetX(), cHalfSize.
GetY(), -cHalfSize.
GetZ());
325 glNormal3f(0.0f, 0.0f, 1.0f);
326 glVertex3f(-cHalfSize.
GetX(), -cHalfSize.
GetY(), cHalfSize.
GetZ());
327 glVertex3f( cHalfSize.
GetX(), -cHalfSize.
GetY(), cHalfSize.
GetZ());
328 glVertex3f( cHalfSize.
GetX(), cHalfSize.
GetY(), cHalfSize.
GetZ());
329 glVertex3f(-cHalfSize.
GetX(), cHalfSize.
GetY(), cHalfSize.
GetZ());
334 glNormal3f(1.0f, 0.0f, 0.0f);
335 glVertex3f( cHalfSize.
GetX(), -cHalfSize.
GetY(), -cHalfSize.
GetZ());
336 glVertex3f( cHalfSize.
GetX(), cHalfSize.
GetY(), -cHalfSize.
GetZ());
337 glVertex3f( cHalfSize.
GetX(), cHalfSize.
GetY(), cHalfSize.
GetZ());
338 glVertex3f( cHalfSize.
GetX(), -cHalfSize.
GetY(), cHalfSize.
GetZ());
340 glNormal3f(-1.0f, 0.0f, 0.0f);
341 glVertex3f(-cHalfSize.
GetX(), -cHalfSize.
GetY(), -cHalfSize.
GetZ());
342 glVertex3f(-cHalfSize.
GetX(), -cHalfSize.
GetY(), cHalfSize.
GetZ());
343 glVertex3f(-cHalfSize.
GetX(), cHalfSize.
GetY(), cHalfSize.
GetZ());
344 glVertex3f(-cHalfSize.
GetX(), cHalfSize.
GetY(), -cHalfSize.
GetZ());
346 glNormal3f(0.0f, -1.0f, 0.0f);
347 glVertex3f(-cHalfSize.
GetX(), -cHalfSize.
GetY(), -cHalfSize.
GetZ());
348 glVertex3f( cHalfSize.
GetX(), -cHalfSize.
GetY(), -cHalfSize.
GetZ());
349 glVertex3f( cHalfSize.
GetX(), -cHalfSize.
GetY(), cHalfSize.
GetZ());
350 glVertex3f(-cHalfSize.
GetX(), -cHalfSize.
GetY(), cHalfSize.
GetZ());
352 glNormal3f(0.0f, 1.0f, 0.0f);
353 glVertex3f(-cHalfSize.
GetX(), cHalfSize.
GetY(), -cHalfSize.
GetZ());
354 glVertex3f(-cHalfSize.
GetX(), cHalfSize.
GetY(), cHalfSize.
GetZ());
355 glVertex3f( cHalfSize.
GetX(), cHalfSize.
GetY(), cHalfSize.
GetZ());
356 glVertex3f( cHalfSize.
GetX(), cHalfSize.
GetY(), -cHalfSize.
GetZ());
369 glPushAttrib(GL_LINE_BIT | GL_ENABLE_BIT);
371 glEnable(GL_LINE_SMOOTH);
372 glLineWidth(f_width);
374 glDisable(GL_LIGHTING);
375 glDisable(GL_COLOR_MATERIAL);
390 static void TransformPoint(
Real* pf_vec_out,
391 const Real* pf_trans,
392 const Real* pf_vec_in) {
393 #define M(row,col) pf_trans[col * 4 + row]
395 M(0, 0) * pf_vec_in[0] +
396 M(0, 1) * pf_vec_in[1] +
397 M(0, 2) * pf_vec_in[2] +
398 M(0, 3) * pf_vec_in[3];
400 M(1, 0) * pf_vec_in[0] +
401 M(1, 1) * pf_vec_in[1] +
402 M(1, 2) * pf_vec_in[2] +
403 M(1, 3) * pf_vec_in[3];
405 M(2, 0) * pf_vec_in[0] +
406 M(2, 1) * pf_vec_in[1] +
407 M(2, 2) * pf_vec_in[2] +
408 M(2, 3) * pf_vec_in[3];
410 M(3, 0) * pf_vec_in[0] +
411 M(3, 1) * pf_vec_in[1] +
412 M(3, 2) * pf_vec_in[2] +
413 M(3, 3) * pf_vec_in[3];
421 const std::string& str_text,
423 const QFont& c_font) {
426 glGetDoublev(GL_MODELVIEW_MATRIX, pf_mv);
428 GLdouble pf_proj[16];
429 glGetDoublev(GL_PROJECTION_MATRIX, pf_proj);
432 glGetIntegerv(GL_VIEWPORT, pn_vp);
434 GLdouble pf_v1[4], pf_v2[4];
436 pf_v1[0] = c_position.
GetX();
437 pf_v1[1] = c_position.
GetY();
438 pf_v1[2] = c_position.
GetZ();
440 TransformPoint(pf_v2, pf_mv, pf_v1);
442 TransformPoint(pf_v1, pf_proj, pf_v2);
444 if (pf_v1[3] == 0.0)
return;
446 pf_v1[0] /= pf_v1[3];
447 pf_v1[1] /= pf_v1[3];
450 (pn_vp[0] + (1. + pf_v1[0]) * pn_vp[2] / 2.) /
453 (pn_vp[1] + (1. + pf_v1[1]) * pn_vp[3] / 2.) /
458 glPushAttrib(GL_ENABLE_BIT);
460 glDisable(GL_LIGHTING);
461 glDisable(GL_COLOR_MATERIAL);
463 glDisable(GL_CULL_FACE);
467 cPainter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
475 cPainter.setFont(c_font);
477 cPainter.drawText(pf_v2[0], pf_v2[1], str_text.c_str());
489 if(t_thunk) (this->*t_thunk)(c_entity);