#include "..\Header\GeometryEngine.h" #include "..\Header\MshFile.h" ///////////////////////////////////////////////////////////////////////// // public constructor/destructor GeometryEngine::GeometryEngine() : m_indexBuf(QOpenGLBuffer::IndexBuffer) { initializeOpenGLFunctions(); // Generate 2 VBOs m_arrayBuf.create(); m_indexBuf.create(); // Initializes cube geometry and transfers it to VBOs initCubeGeometry(); } GeometryEngine::~GeometryEngine() { m_arrayBuf.destroy(); m_indexBuf.destroy(); for (auto it : m_textures) delete it; m_textures.clear(); m_textures.squeeze(); } ///////////////////////////////////////////////////////////////////////// // private functions void GeometryEngine::initCubeGeometry() { try { MshFile file("..\\Release\\Msh\\cube.msh"); m_models = file.getModels(); //TODO use models local, apply MVP directly to the vertex, save size and tex index info //TODO: handle the textures } catch (std::invalid_argument e) { //TODO: make a cool message box auto msg = e.what(); } // Transfer vertex data to VBO 0 m_arrayBuf.bind(); m_arrayBuf.allocate(m_models->first()->segmList.front()->vertices.data(), m_models->first()->segmList.front()->vertices.size() * sizeof(VertexData)); // Transfer index data to VBO 1 m_indexBuf.bind(); m_indexBuf.allocate(m_models->first()->segmList.front()->indices.data(), m_models->first()->segmList.front()->indices.size() * sizeof(GLushort)); //QVector 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 // }; //QVector 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 //m_arrayBuf.bind(); //m_arrayBuf.allocate(vertices.data(), vertices.size() * sizeof(VertexData)); //// Transfer index data to VBO 1 //m_indexBuf.bind(); //m_indexBuf.allocate(indices.data(), indices.size() * sizeof(GLushort)); // load the texture initTexture(); } void GeometryEngine::initTexture() { // Load cube.png image QOpenGLTexture* new_texture = new QOpenGLTexture(QImage(":images/cube.png").mirrored()); // Set nearest filtering mode for texture minification new_texture->setMinificationFilter(QOpenGLTexture::Nearest); // Set bilinear filtering mode for texture magnification new_texture->setMagnificationFilter(QOpenGLTexture::Linear); // Wrap texture coordinates by repeating // f.ex. texture coordinate (1.1, 1.2) is same as (0.1, 0.2) new_texture->setWrapMode(QOpenGLTexture::Repeat); m_textures.push_back(new_texture); } ///////////////////////////////////////////////////////////////////////// // public functions void GeometryEngine::drawGeometry(QOpenGLShaderProgram *program) { // Tell OpenGL which VBOs to use m_arrayBuf.bind(); m_indexBuf.bind(); m_textures.first()->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); }