SWBF2-Classic-Msh-Viewer/MeshViewerQt/Source/OpenGlViewer.cpp

101 lines
2.5 KiB
C++

#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);
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)
{
//TODO: change perspective
}
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();
}