Skip to content
Snippets Groups Projects
Select Git revision
  • 049998215056daf3adbf27b3b1cf79fa30203e81
  • master default protected
  • developement_1 protected
  • Version_1.2.4
  • Version_1.2.3
  • Version_1.2.2
  • Version_1.2.1
  • Version_1.2.0
  • Version_1.0.1
  • Version_1.0.0
  • Version_0.1.0
  • Version_0.0.6
  • Version_0.0.5
  • Version_0.0.4
  • Version_0.0.3
  • Version_0.0.2
  • Version_0.0.1
17 results

GeometryEngine.cpp

Blame
  • user avatar
    Anakin authored
    04999821
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    GeometryEngine.cpp 5.03 KiB
    #include "..\Header\GeometryEngine.h"
    
    #include <QVector2D>
    #include <QVector3D>
    
    
    struct VertexData
    {
    	QVector3D position;
    	QVector2D texCoord;
    };
    
    GeometryEngine::GeometryEngine()
    	: indexBuf(QOpenGLBuffer::IndexBuffer)
    	, texture(Q_NULLPTR)
    {
    	initializeOpenGLFunctions();
    
    	// Generate 2 VBOs
    	arrayBuf.create();
    	indexBuf.create();
    
    	// Initializes cube geometry and transfers it to VBOs
    	initCubeGeometry();
    }
    
    GeometryEngine::~GeometryEngine()
    {
    	arrayBuf.destroy();
    	indexBuf.destroy();
    	delete texture;
    }
    
    void GeometryEngine::initCubeGeometry()
    {
    	// For cube we would need only 8 vertices but we have to
    	// duplicate vertex for each face because texture coordinate
    	// is different.
        VertexData vertices[] = {
            // 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.33f, 0.0f)}, // v1
            {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(0.0f, 0.5f)},  // v2
            {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v3
    
            // Vertex data for face 1
            {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D( 0.0f, 0.5f)}, // v4
            {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.5f)}, // v5
            {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.0f, 1.0f)},  // v6
            {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v7
    
            // Vertex data for face 2
            {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v8
            {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(1.0f, 0.5f)},  // v9
            {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.66f, 1.0f)}, // v10
            {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(1.0f, 1.0f)},  // v11
    
            // Vertex data for face 3
            {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v12
            {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(1.0f, 0.0f)},  // v13
            {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(0.66f, 0.5f)}, // v14
            {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(1.0f, 0.5f)},  // v15
    
            // Vertex data for face 4
            {QVector3D(-1.0f, -1.0f, -1.0f), QVector2D(0.33f, 0.0f)}, // v16
            {QVector3D( 1.0f, -1.0f, -1.0f), QVector2D(0.66f, 0.0f)}, // v17
            {QVector3D(-1.0f, -1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v18
            {QVector3D( 1.0f, -1.0f,  1.0f), QVector2D(0.66f, 0.5f)}, // v19
    
            // Vertex data for face 5
            {QVector3D(-1.0f,  1.0f,  1.0f), QVector2D(0.33f, 0.5f)}, // v20
            {QVector3D( 1.0f,  1.0f,  1.0f), QVector2D(0.66f, 0.5f)}, // v21
            {QVector3D(-1.0f,  1.0f, -1.0f), QVector2D(0.33f, 1.0f)}, // v22
            {QVector3D( 1.0f,  1.0f, -1.0f), QVector2D(0.66f, 1.0f)}  // v23
        };
    
        // Indices for drawing cube faces using triangle strips.
        // 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)
    		3,2,1,
    		4,5,7,		//rechts (1)
    		6,4,7,
    		8,9,11,		//hinten (3)*
    		8,11,10,
    		14,12,13,	//links (6)*
    		14,13,15,
    		18,16,17,	//unten (5)
    		19,18,17,
    		23,22,20,	//oben (2)*
    		23,20,21
        };
    
        // Transfer vertex data to VBO 0
        arrayBuf.bind();
        arrayBuf.allocate(vertices, 24 * sizeof(VertexData));
    
        // Transfer index data to VBO 1
        indexBuf.bind();
        indexBuf.allocate(indices, 36 * sizeof(GLushort));
    
    	initTexture();
    }
    
    void GeometryEngine::initTexture()
    {
    	// Load cube.png image
    	texture = new QOpenGLTexture(QImage(":images/cube.png").mirrored());
    
    	// Set nearest filtering mode for texture minification
    	texture->setMinificationFilter(QOpenGLTexture::Nearest);
    
    	// Set bilinear filtering mode for texture magnification
    	texture->setMagnificationFilter(QOpenGLTexture::Linear);
    
    	// Wrap texture coordinates by repeating
    	// f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2)
    	texture->setWrapMode(QOpenGLTexture::Repeat);
    }
    
    void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program)
    {
    	// Tell OpenGL which VBOs to use
    	arrayBuf.bind();
    	indexBuf.bind();
    	texture->bind();
    
    	// Use texture unit 0 which contains cube.png
    	program->setUniformValue("texture", 0);
    
    	// Offset for position
    	quintptr offset = 0;
    
    	// Tell OpenGL programmable pipeline how to locate vertex position data
    	int vertexLocation = program->attributeLocation("a_position");
    	program->enableAttributeArray(vertexLocation);
    	program->setAttributeBuffer(vertexLocation, GL_FLOAT, offset, 3, sizeof(VertexData));
    
    	// Offset for texture coordinate
    	offset += sizeof(QVector3D);
    
    	// Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
    	int texcoordLocation = program->attributeLocation("a_texcoord");
    	program->enableAttributeArray(texcoordLocation);
    	program->setAttributeBuffer(texcoordLocation, GL_FLOAT, offset, 2, sizeof(VertexData));
    
    	// Draw cube geometry using indices from VBO 1
    	glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0);
    }