First triangle drawn in Qt Project

This commit is contained in:
Anakin
2016-12-10 14:42:00 +01:00
parent 8cf86a41eb
commit 5faf584d84
9 changed files with 220 additions and 19 deletions

View File

@@ -2,8 +2,12 @@
#include "OpenGlViewer.h"
#include "defines.h"
#include <QKeyEvent>
#include <QMessageBox>
/////////////////////////////////////////////////////////////////////////
// constructor/destructor
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui (new Ui::MainWindowClass)
@@ -16,6 +20,10 @@ MainWindow::~MainWindow()
delete ui;
}
/////////////////////////////////////////////////////////////////////////
// private functions
void MainWindow::setupWindow()
{
ui->setupUi(this);
@@ -26,11 +34,32 @@ void MainWindow::setupWindow()
this->setCentralWidget(new OpenGlViewer(this));
ui->mainToolBar->addAction("File Info", this, &MainWindow::aboutFile);
ui->statusBar->showMessage(DEFAULT_STATUS_MESSAGE);
}
/////////////////////////////////////////////////////////////////////////
// private slots
void MainWindow::openFile()
{
//TODO: Open file
}
void MainWindow::aboutFile()
{
//TODO: Open Window with file information
QMessageBox* dialog = new QMessageBox(QMessageBox::Information, WINDOW_NAME, "File Info", QMessageBox::StandardButton::Close, this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
dialog->setDetailedText("This is the cool detailed text\n");
dialog->exec();
}
/////////////////////////////////////////////////////////////////////////
// events
void MainWindow::keyPressEvent(QKeyEvent * keyEvent)
{
switch (keyEvent->key())

View File

@@ -1,25 +1,84 @@
#include "OpenGlViewer.h"
#include "defines.h"
#include "Vertex.h"
#include <iostream>
static const Vertex sg_vertexes[] = {
Vertex(QVector3D(0.00f, 0.75f, 1.0f), QVector3D(1.0f, 0.0f, 0.0f)),
Vertex(QVector3D(0.75f, -0.75f, 1.0f), QVector3D(0.0f, 1.0f, 0.0f)),
Vertex(QVector3D(-0.75f, -0.75f, 1.0f), QVector3D(0.0f, 0.0f, 1.0f))
};
OpenGlViewer::OpenGlViewer(QWidget *parent)
: QOpenGLWidget(parent)
{
QSurfaceFormat format;
format.setRenderableType(QSurfaceFormat::OpenGL);
format.setProfile(QSurfaceFormat::CompatibilityProfile);
format.setVersion(DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION);
format.setProfile(QSurfaceFormat::CoreProfile);
this->setFormat(format);
setFormat(format);
}
OpenGlViewer::~OpenGlViewer()
{
mVertexArray.destroy();
mVertexBuffer.destroy();
delete mProgram;
}
void OpenGlViewer::printContextInformation()
{
QString glType;
QString glVersion;
QString glProfile;
glType = (context()->isOpenGLES()) ? "OpenGL ES" : "OpenGL";
glVersion = reinterpret_cast<const char*>(glGetString(GL_VERSION));
#define CASE(c) case QSurfaceFormat::c: glProfile = #c; break
switch (format().profile())
{
CASE(NoProfile);
CASE(CoreProfile);
CASE(CompatibilityProfile);
}
#undef CASE
std::cout << glType.toStdString() << " - " << glVersion.toStdString() << " (" << glProfile.toStdString() << ")";
}
void OpenGlViewer::initializeGL()
{
initializeOpenGLFunctions();
printContextInformation();
//glEnable(GL_DEPTH_TEST);
glClearColor(DEAFAULT_BACKGROUND);
mProgram = new QOpenGLShaderProgram();
mProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/simple.vert");
mProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/simple.frag");
mProgram->link();
mProgram->bind();
mVertexBuffer.create();
mVertexBuffer.bind();
mVertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
mVertexBuffer.allocate(sg_vertexes, sizeof(sg_vertexes));
mVertexArray.create();
mVertexArray.bind();
mProgram->enableAttributeArray(0);
mProgram->enableAttributeArray(1);
mProgram->setAttributeBuffer(0, GL_FLOAT, Vertex::positionOffset(), Vertex::PositionTupleSize, Vertex::stride());
mProgram->setAttributeBuffer(1, GL_FLOAT, Vertex::colorOffset(), Vertex::ColorTupleSize, Vertex::stride());
mVertexArray.release();
mVertexBuffer.release();
mProgram->release();
}
void OpenGlViewer::resizeGL(int w, int h)
@@ -30,5 +89,12 @@ void OpenGlViewer::resizeGL(int w, int h)
void OpenGlViewer::paintGL()
{
//TODO: paint here
glClear(GL_COLOR_BUFFER_BIT);
mProgram->bind();
mVertexArray.bind();
glDrawArrays(GL_TRIANGLES, 0, sizeof(sg_vertexes) / sizeof(sg_vertexes[0]));
mVertexArray.release();
mProgram->release();
}