146 lines
2.7 KiB
C++
146 lines
2.7 KiB
C++
// Basé sur :
|
|
// CC-BY Edouard.Thiel@univ-amu.fr - 22/01/2019
|
|
|
|
#include "glarea.h"
|
|
#include <QDebug>
|
|
#include <QSurfaceFormat>
|
|
#include <QMatrix4x4>
|
|
|
|
|
|
|
|
GLArea::GLArea(QWidget *parent) :
|
|
QOpenGLWidget(parent)
|
|
{
|
|
QSurfaceFormat sf;
|
|
sf.setDepthBufferSize(24);
|
|
sf.setSamples(16);
|
|
setFormat(sf);
|
|
|
|
setEnabled(true); // événements clavier et souris
|
|
setFocusPolicy(Qt::StrongFocus); // accepte focus
|
|
setFocus(); // donne le focus
|
|
}
|
|
|
|
|
|
GLArea::~GLArea()
|
|
{
|
|
makeCurrent();
|
|
doneCurrent();
|
|
}
|
|
|
|
|
|
void GLArea::initializeGL()
|
|
{
|
|
initializeOpenGLFunctions();
|
|
glClearColor(0.5f,0.5f,1.0f,1.0f);
|
|
glEnable(GL_DEPTH_TEST);
|
|
emit onInit((QOpenGLExtraFunctions *) this);
|
|
}
|
|
|
|
|
|
void GLArea::resizeGL(int w, int h)
|
|
{
|
|
glViewport(0, 0, w, h);
|
|
windowRatio = float(w) / h;
|
|
}
|
|
|
|
|
|
void GLArea::paintGL()
|
|
{
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
// Matrice de projection
|
|
QMatrix4x4 projectionMatrix;
|
|
projectionMatrix.perspective(45.0f, windowRatio, 1.0f, 1000.0f);
|
|
|
|
// Matrice de vue (caméra)
|
|
QMatrix4x4 viewMatrix;
|
|
viewMatrix.translate(xPos, yPos, zPos);
|
|
viewMatrix.rotate(xRot, 1, 0, 0);
|
|
viewMatrix.rotate(yRot, 0, 1, 0);
|
|
viewMatrix.rotate(zRot, 0, 0, 1);
|
|
|
|
emit onPaint((QOpenGLExtraFunctions *) this,
|
|
projectionMatrix,
|
|
viewMatrix);
|
|
}
|
|
|
|
|
|
void GLArea::keyPressEvent(QKeyEvent *ev)
|
|
{
|
|
float da = 1.0f;
|
|
|
|
switch(ev->key()) {
|
|
case Qt::Key_A :
|
|
xRot -= da;
|
|
update();
|
|
break;
|
|
|
|
case Qt::Key_Q :
|
|
xRot += da;
|
|
update();
|
|
break;
|
|
|
|
case Qt::Key_Z :
|
|
yRot -= da;
|
|
update();
|
|
break;
|
|
|
|
case Qt::Key_S :
|
|
yRot += da;
|
|
update();
|
|
break;
|
|
|
|
case Qt::Key_E :
|
|
zRot -= da;
|
|
update();
|
|
break;
|
|
|
|
case Qt::Key_D :
|
|
zRot += da;
|
|
update();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void GLArea::keyReleaseEvent(QKeyEvent *ev)
|
|
{
|
|
qDebug() << __FUNCTION__ << ev->text();
|
|
}
|
|
|
|
|
|
void GLArea::mousePressEvent(QMouseEvent *ev)
|
|
{
|
|
lastPos = ev->pos();
|
|
}
|
|
|
|
|
|
void GLArea::mouseReleaseEvent(QMouseEvent *ev)
|
|
{
|
|
qDebug() << __FUNCTION__ << ev->x() << ev->y() << ev->button();
|
|
}
|
|
|
|
|
|
void GLArea::mouseMoveEvent(QMouseEvent *ev)
|
|
{
|
|
int dx = ev->x() - lastPos.x();
|
|
int dy = ev->y() - lastPos.y();
|
|
|
|
if (ev->buttons() & Qt::LeftButton) {
|
|
xRot += dy;
|
|
yRot += dx;
|
|
update();
|
|
} else if (ev->buttons() & Qt::RightButton) {
|
|
xPos += dx/10.0f;
|
|
yPos -= dy/10.0f;
|
|
update();
|
|
} else if (ev->buttons() & Qt::MidButton) {
|
|
xPos += dx/10.0f;
|
|
zPos += dy;
|
|
update();
|
|
}
|
|
|
|
lastPos = ev->pos();
|
|
}
|