manage data in vectors
This commit is contained in:
parent
0499982150
commit
82ce8ad72a
|
@ -4,6 +4,7 @@
|
||||||
#include <QOpenGLShaderProgram>
|
#include <QOpenGLShaderProgram>
|
||||||
#include <QOpenGLBuffer>
|
#include <QOpenGLBuffer>
|
||||||
#include <QOpenGLTexture>
|
#include <QOpenGLTexture>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
class GeometryEngine : protected QOpenGLFunctions
|
class GeometryEngine : protected QOpenGLFunctions
|
||||||
{
|
{
|
||||||
|
@ -11,15 +12,15 @@ public:
|
||||||
GeometryEngine();
|
GeometryEngine();
|
||||||
virtual ~GeometryEngine();
|
virtual ~GeometryEngine();
|
||||||
|
|
||||||
void drawGeometry(QOpenGLShaderProgram *program);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QOpenGLBuffer m_arrayBuf;
|
||||||
|
QOpenGLBuffer m_indexBuf;
|
||||||
|
QVector<QOpenGLTexture*> m_textures;
|
||||||
|
|
||||||
void initCubeGeometry();
|
void initCubeGeometry();
|
||||||
void initTexture();
|
void initTexture();
|
||||||
|
|
||||||
QOpenGLBuffer arrayBuf;
|
public:
|
||||||
QOpenGLBuffer indexBuf;
|
void drawGeometry(QOpenGLShaderProgram *program);
|
||||||
|
|
||||||
QOpenGLTexture *texture;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,19 @@ public:
|
||||||
explicit OglViewerWidget(QWidget *parent = 0);
|
explicit OglViewerWidget(QWidget *parent = 0);
|
||||||
~OglViewerWidget();
|
~OglViewerWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct {
|
||||||
|
bool left = false;
|
||||||
|
bool right = false;
|
||||||
|
QVector2D position;
|
||||||
|
} m_mouse;
|
||||||
|
|
||||||
|
QOpenGLShaderProgram m_program;
|
||||||
|
GeometryEngine *m_dataEngine;
|
||||||
|
|
||||||
|
QMatrix4x4 m_projection;
|
||||||
|
QQuaternion m_rotation;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
||||||
void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
|
||||||
|
@ -34,17 +47,6 @@ protected:
|
||||||
private:
|
private:
|
||||||
void initShaders();
|
void initShaders();
|
||||||
|
|
||||||
private:
|
|
||||||
struct {
|
|
||||||
bool left = false;
|
|
||||||
bool right = false;
|
|
||||||
QVector2D position;
|
|
||||||
} m_mouse;
|
|
||||||
|
|
||||||
QOpenGLShaderProgram m_program;
|
|
||||||
GeometryEngine *m_dataEngine;
|
|
||||||
|
|
||||||
QMatrix4x4 m_projection;
|
|
||||||
QQuaternion m_rotation;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -10,15 +10,18 @@ struct VertexData
|
||||||
QVector2D texCoord;
|
QVector2D texCoord;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// public constructor/destructor
|
||||||
|
|
||||||
GeometryEngine::GeometryEngine()
|
GeometryEngine::GeometryEngine()
|
||||||
: indexBuf(QOpenGLBuffer::IndexBuffer)
|
: m_indexBuf(QOpenGLBuffer::IndexBuffer)
|
||||||
, texture(Q_NULLPTR)
|
|
||||||
{
|
{
|
||||||
initializeOpenGLFunctions();
|
initializeOpenGLFunctions();
|
||||||
|
|
||||||
// Generate 2 VBOs
|
// Generate 2 VBOs
|
||||||
arrayBuf.create();
|
m_arrayBuf.create();
|
||||||
indexBuf.create();
|
m_indexBuf.create();
|
||||||
|
|
||||||
// Initializes cube geometry and transfers it to VBOs
|
// Initializes cube geometry and transfers it to VBOs
|
||||||
initCubeGeometry();
|
initCubeGeometry();
|
||||||
|
@ -26,17 +29,23 @@ GeometryEngine::GeometryEngine()
|
||||||
|
|
||||||
GeometryEngine::~GeometryEngine()
|
GeometryEngine::~GeometryEngine()
|
||||||
{
|
{
|
||||||
arrayBuf.destroy();
|
m_arrayBuf.destroy();
|
||||||
indexBuf.destroy();
|
m_indexBuf.destroy();
|
||||||
delete texture;
|
|
||||||
|
for (auto it : m_textures)
|
||||||
|
delete it;
|
||||||
|
m_textures.clear();
|
||||||
|
m_textures.squeeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// private functions
|
||||||
|
|
||||||
void GeometryEngine::initCubeGeometry()
|
void GeometryEngine::initCubeGeometry()
|
||||||
{
|
{
|
||||||
// For cube we would need only 8 vertices but we have to
|
|
||||||
// duplicate vertex for each face because texture coordinate
|
QVector<VertexData> vertices = {
|
||||||
// is different.
|
|
||||||
VertexData vertices[] = {
|
|
||||||
// Vertex data for face 0
|
// Vertex data for face 0
|
||||||
{QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.0f)}, // v0
|
{QVector3D(-1.0f, -1.0f, 1.0f), QVector2D(0.0f, 0.0f)}, // v0
|
||||||
{QVector3D( 1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.0f)}, // v1
|
{QVector3D( 1.0f, -1.0f, 1.0f), QVector2D(0.33f, 0.0f)}, // v1
|
||||||
|
@ -74,14 +83,7 @@ void GeometryEngine::initCubeGeometry()
|
||||||
{QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.66f, 1.0f)} // v23
|
{QVector3D( 1.0f, 1.0f, -1.0f), QVector2D(0.66f, 1.0f)} // v23
|
||||||
};
|
};
|
||||||
|
|
||||||
// Indices for drawing cube faces using triangle strips.
|
QVector<GLushort> indices = {
|
||||||
// Triangle strips can be connected by duplicating indices
|
|
||||||
// between the strips. If connecting strips have opposite
|
|
||||||
// vertex order then last index of the first strip and first
|
|
||||||
// index of the second strip needs to be duplicated. If
|
|
||||||
// connecting strips have same vertex order then only last
|
|
||||||
// index of the first strip needs to be duplicated.
|
|
||||||
GLushort indices[] = {
|
|
||||||
0,1,2, //vorne (4)
|
0,1,2, //vorne (4)
|
||||||
3,2,1,
|
3,2,1,
|
||||||
4,5,7, //rechts (1)
|
4,5,7, //rechts (1)
|
||||||
|
@ -97,38 +99,45 @@ void GeometryEngine::initCubeGeometry()
|
||||||
};
|
};
|
||||||
|
|
||||||
// Transfer vertex data to VBO 0
|
// Transfer vertex data to VBO 0
|
||||||
arrayBuf.bind();
|
m_arrayBuf.bind();
|
||||||
arrayBuf.allocate(vertices, 24 * sizeof(VertexData));
|
m_arrayBuf.allocate(vertices.data(), vertices.size() * sizeof(VertexData));
|
||||||
|
|
||||||
// Transfer index data to VBO 1
|
// Transfer index data to VBO 1
|
||||||
indexBuf.bind();
|
m_indexBuf.bind();
|
||||||
indexBuf.allocate(indices, 36 * sizeof(GLushort));
|
m_indexBuf.allocate(indices.data(), indices.size() * sizeof(GLushort));
|
||||||
|
|
||||||
|
// load the texture
|
||||||
initTexture();
|
initTexture();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GeometryEngine::initTexture()
|
void GeometryEngine::initTexture()
|
||||||
{
|
{
|
||||||
// Load cube.png image
|
// Load cube.png image
|
||||||
texture = new QOpenGLTexture(QImage(":images/cube.png").mirrored());
|
QOpenGLTexture* new_texture = new QOpenGLTexture(QImage(":images/cube.png").mirrored());
|
||||||
|
|
||||||
// Set nearest filtering mode for texture minification
|
// Set nearest filtering mode for texture minification
|
||||||
texture->setMinificationFilter(QOpenGLTexture::Nearest);
|
new_texture->setMinificationFilter(QOpenGLTexture::Nearest);
|
||||||
|
|
||||||
// Set bilinear filtering mode for texture magnification
|
// Set bilinear filtering mode for texture magnification
|
||||||
texture->setMagnificationFilter(QOpenGLTexture::Linear);
|
new_texture->setMagnificationFilter(QOpenGLTexture::Linear);
|
||||||
|
|
||||||
// Wrap texture coordinates by repeating
|
// Wrap texture coordinates by repeating
|
||||||
// f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2)
|
// f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2)
|
||||||
texture->setWrapMode(QOpenGLTexture::Repeat);
|
new_texture->setWrapMode(QOpenGLTexture::Repeat);
|
||||||
|
|
||||||
|
m_textures.push_back(new_texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// public functions
|
||||||
|
|
||||||
void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
|
void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
|
||||||
{
|
{
|
||||||
// Tell OpenGL which VBOs to use
|
// Tell OpenGL which VBOs to use
|
||||||
arrayBuf.bind();
|
m_arrayBuf.bind();
|
||||||
indexBuf.bind();
|
m_indexBuf.bind();
|
||||||
texture->bind();
|
m_textures.first()->bind();
|
||||||
|
|
||||||
// Use texture unit 0 which contains cube.png
|
// Use texture unit 0 which contains cube.png
|
||||||
program->setUniformValue("texture", 0);
|
program->setUniformValue("texture", 0);
|
||||||
|
|
|
@ -3,6 +3,10 @@
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// public constructor/destructor
|
||||||
|
|
||||||
OglViewerWidget::OglViewerWidget(QWidget *parent) :
|
OglViewerWidget::OglViewerWidget(QWidget *parent) :
|
||||||
QOpenGLWidget(parent),
|
QOpenGLWidget(parent),
|
||||||
m_dataEngine(0)
|
m_dataEngine(0)
|
||||||
|
@ -19,6 +23,10 @@ OglViewerWidget::~OglViewerWidget()
|
||||||
doneCurrent();
|
doneCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// protected functions
|
||||||
|
|
||||||
void OglViewerWidget::mousePressEvent(QMouseEvent *e)
|
void OglViewerWidget::mousePressEvent(QMouseEvent *e)
|
||||||
{
|
{
|
||||||
// Save mouse press position
|
// Save mouse press position
|
||||||
|
@ -83,25 +91,6 @@ void OglViewerWidget::initializeGL()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OglViewerWidget::initShaders()
|
|
||||||
{
|
|
||||||
// Compile vertex shader
|
|
||||||
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vshader.glsl"))
|
|
||||||
close();
|
|
||||||
|
|
||||||
// Compile fragment shader
|
|
||||||
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fshader.glsl"))
|
|
||||||
close();
|
|
||||||
|
|
||||||
// Link shader pipeline
|
|
||||||
if (!m_program.link())
|
|
||||||
close();
|
|
||||||
|
|
||||||
// Bind shader pipeline for use
|
|
||||||
if (!m_program.bind())
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OglViewerWidget::resizeGL(int w, int h)
|
void OglViewerWidget::resizeGL(int w, int h)
|
||||||
{
|
{
|
||||||
// Calculate aspect ratio
|
// Calculate aspect ratio
|
||||||
|
@ -133,3 +122,30 @@ void OglViewerWidget::paintGL()
|
||||||
// Draw cube geometry
|
// Draw cube geometry
|
||||||
m_dataEngine->drawGeometry(&m_program);
|
m_dataEngine->drawGeometry(&m_program);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// private functions
|
||||||
|
|
||||||
|
void OglViewerWidget::initShaders()
|
||||||
|
{
|
||||||
|
// Compile vertex shader
|
||||||
|
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/vshader.glsl"))
|
||||||
|
close();
|
||||||
|
|
||||||
|
// Compile fragment shader
|
||||||
|
if (!m_program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/fshader.glsl"))
|
||||||
|
close();
|
||||||
|
|
||||||
|
// Link shader pipeline
|
||||||
|
if (!m_program.link())
|
||||||
|
close();
|
||||||
|
|
||||||
|
// Bind shader pipeline for use
|
||||||
|
if (!m_program.bind())
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
// public functions
|
Loading…
Reference in New Issue