00001 #include "RendererWidget.h"
00002 #include "RendererWidget.moc"
00003
00004 #include <geometry/point.h>
00005
00006 static GLfloat LightAmb[] = { 0.3f, 0.3f, 0.3f, 1.0f };
00007 static GLfloat LightDif[] = { 0.6f, 0.6f, 0.6f, 1.0f };
00008 static GLfloat LightPos[] = { 6.0f, 6.0f, 8.0f, 1.0f };
00009
00010
00011 RendererWidget::RendererWidget(QWidget *_parent):
00012 QGLWidget(_parent),
00013 m_laserPoseX(0),
00014 m_laserPoseY(0),
00015 m_laserPoseTheta(0),
00016 m_rotationX(0.0),
00017 m_rotationY(0.0),
00018 m_rotationZ(0.0),
00019 m_offsetX(0.0),
00020 m_offsetY(0.0),
00021 m_offsetZ(-10.0),
00022 m_scale(1.0)
00023 {
00024
00025 }
00026
00027 void RendererWidget::unprojectCoordinates(GLdouble viewX, GLdouble viewY, GLdouble* worldX, GLdouble* worldY, GLdouble* worldZ){
00028 makeCurrent();
00029
00030
00031
00032
00033
00034
00035 unprojectCoordinates(viewX, viewY, m_GLdefaultDepth, worldX, worldY, worldZ);
00036 }
00037
00038
00039 void RendererWidget::unprojectCoordinates(GLdouble viewX, GLdouble viewY, GLdouble viewZ, GLdouble* worldX, GLdouble* worldY, GLdouble* worldZ){
00040 makeCurrent();
00041
00042 GLdouble modelView[16];
00043 glGetDoublev( GL_MODELVIEW_MATRIX, modelView);
00044 GLdouble projection[16];
00045 glGetDoublev( GL_PROJECTION_MATRIX, projection);
00046 GLint viewPort[4];
00047 glGetIntegerv( GL_VIEWPORT, viewPort);
00048 gluUnProject( viewX, viewY, viewZ, modelView, projection, viewPort, worldX, worldY, worldZ);
00049 }
00050
00051
00052 void RendererWidget::initializeGL(){
00053 glShadeModel(GL_SMOOTH);
00054 glClearColor(0.9f, 0.9f, 0.9f, 1.0f);
00055 glClearDepth(1.0f);
00056 glClearStencil(0);
00057 glEnable(GL_DEPTH_TEST);
00058 glDepthFunc(GL_LEQUAL);
00059 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00060 glEnable(GL_BLEND);
00061 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
00062 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
00063
00064 glEnable(GL_LINE_SMOOTH);
00065
00066
00067
00068 glEnable(GL_CULL_FACE);
00069
00070 glEnable(GL_POINT_SMOOTH);
00071 glPointSize(3.0);
00072
00073
00074
00075 glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmb);
00076 glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDif);
00077 glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
00078 }
00079
00080 void RendererWidget::resizeGL(int width, int height){
00081 glViewport(0, 0, width, height);
00082 glMatrixMode(GL_PROJECTION);
00083 glLoadIdentity();
00084 GLfloat x = (GLfloat) width / (GLfloat) height;
00085 glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
00086 glMatrixMode(GL_MODELVIEW);
00087 }
00088
00089 void RendererWidget::paintGL(){
00090 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00091 glMatrixMode(GL_MODELVIEW);
00092 glLoadIdentity();
00093
00094 glColor4f(0.f,0.f,0.f,1.0f);
00095
00096 glTranslatef(m_offsetX, m_offsetY, m_offsetZ);
00097 glRotatef(m_rotationX, 1.0, 0.0, 0.0);
00098 glRotatef(m_rotationY, 0.0, 1.0, 0.0);
00099 glRotatef(m_rotationZ, 0.0, 0.0, 1.0);
00100 glScalef(m_scale, m_scale, m_scale);
00101
00102 glTranslatef(-m_laserPoseX, -m_laserPoseY, 0.f);
00103 glRotatef(rad2deg(-m_laserPoseTheta), 0.f, 0.f, 1.f);
00104
00105 GLdouble modelView[16];
00106 glGetDoublev( GL_MODELVIEW_MATRIX, modelView);
00107 GLdouble projection[16];
00108 glGetDoublev( GL_PROJECTION_MATRIX, projection);
00109 GLint viewPort[4];
00110 glGetIntegerv( GL_VIEWPORT, viewPort);
00111 GLdouble viewX, viewY, worldX=0., worldY=0., worldZ=0.;
00112 gluProject(worldX, worldY, worldZ, modelView, projection, viewPort, &viewX, &viewY, &m_GLdefaultDepth);
00113
00114 for(unsigned int i = 0; i < m_renderObject.size(); i++){
00115 m_renderObject[i]->render();
00116 }
00117
00118 return;
00119 }
00120
00121 void RendererWidget::setRotation(float _x, float _y, float _z){
00122 m_rotationX = _x;
00123 m_rotationY = _y;
00124 m_rotationZ = _z;
00125 }
00126
00127 void RendererWidget::setOffset(float _x, float _y, float _z){
00128 m_offsetX = _x;
00129 m_offsetY = _y;
00130 m_offsetZ = _z;
00131 }
00132
00133 void RendererWidget::setLaserPose(float x, float y, float theta){
00134 m_laserPoseX = x;
00135 m_laserPoseY = y;
00136 m_laserPoseTheta = theta;
00137 }
00138
00139 void RendererWidget::setScale(float _scale){
00140 m_scale = _scale;
00141 }
00142
00143 void RendererWidget::makeSnapshot(const char * _filename){
00144
00145 }
00146
00147 void RendererWidget::mousePressEvent(QMouseEvent *_event){
00148 m_lastMousePosition = _event->pos();
00149 m_lastMousePressPosition = _event->pos();
00150
00151
00152
00153
00154
00155
00156
00157
00158 }
00159
00160 void RendererWidget::mouseReleaseEvent(QMouseEvent *_event){
00161 if(m_lastMousePressPosition == _event->pos()){
00162 makeCurrent();
00163 GLint viewport[4];
00164 glGetIntegerv(GL_VIEWPORT, viewport);
00165 GLint x = viewport[0] + _event->x();
00166 GLint y = viewport[0] + viewport[3] - _event->y();
00167 m_lastMousePressPosition = _event->pos();
00168 emit mousePressedGL(!_event->buttons(), x, y);
00169 } else{
00170 m_lastMousePressPosition = _event->pos();
00171 }
00172 }
00173
00174 void RendererWidget::mouseMoveEvent(QMouseEvent *_event){
00175 makeCurrent();
00176 GLint viewport[4];
00177 glGetIntegerv(GL_VIEWPORT, viewport);
00178 GLint x1 = viewport[0] + m_lastMousePosition.x();
00179 GLint y1 = viewport[1] + viewport[3] - m_lastMousePosition.y();
00180 GLint x2 = viewport[0] + _event->x();
00181 GLint y2 = viewport[1] + viewport[3] - _event->y();
00182
00183 GLint dx = _event->x() - m_lastMousePosition.x();
00184 GLint dy = _event->y() - m_lastMousePosition.y();
00185 if (_event->buttons() & Qt::LeftButton) {
00186 m_offsetX += ((double) dx) / width() * 8;
00187 m_offsetY -= ((double) dy) / height() * 4;
00188 } else if (_event->buttons() & Qt::RightButton) {
00189 m_rotationX += 0.4 * dy;
00190 m_rotationZ += 0.4 * dx;
00191 }
00192 updateGL();
00193 m_lastMousePosition = _event->pos();
00194 emit mouseMovedGL(_event->buttons(), x1, y1, x2, y2);
00195 }
00196
00197 void RendererWidget::wheelEvent(QWheelEvent *_event){
00198 _event->delta() > 0 ? m_scale += m_scale * 0.1f : m_scale -= m_scale * 0.1f;
00199 updateGL();
00200 }
00201