still trying to fix the problem

This commit is contained in:
Anakin
2016-12-14 17:20:20 +01:00
parent 96379a9afb
commit b6ef34f988
7 changed files with 255 additions and 84 deletions

View File

@@ -35,7 +35,7 @@ OpenGlViewer::OpenGlViewer(QWidget *parent)
QSurfaceFormat format;
format.setRenderableType(QSurfaceFormat::OpenGL);
format.setSamples(4);
format.setProfile(QSurfaceFormat::CompatibilityProfile);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setVersion(DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION);
setFormat(format);
@@ -44,9 +44,9 @@ OpenGlViewer::OpenGlViewer(QWidget *parent)
OpenGlViewer::~OpenGlViewer()
{
m_oglTexture->destroy();
glDeleteTextures(1, &m_oglTexture);
glDeleteBuffers(1, &m_vertexBuffer);
m_vertexArray.destroy();
m_vertexBuffer.destroy();
delete m_program;
deleteData();
@@ -70,10 +70,12 @@ void OpenGlViewer::initializeGL()
glEnable(GL_CULL_FACE);
// Create texture
m_oglTexture = new QOpenGLTexture(QOpenGLTexture::Target2D);
m_oglTexture->setWrapMode(QOpenGLTexture::Repeat);
m_oglTexture->setMagnificationFilter(QOpenGLTexture::Linear);
m_oglTexture->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
glGenTextures(1, &m_oglTexture);
glBindTexture(GL_TEXTURE_2D, m_oglTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
// Create Shader
m_program = new QOpenGLShaderProgram();
@@ -87,9 +89,8 @@ void OpenGlViewer::initializeGL()
m_uniformMVP = m_program->uniformLocation("MVP");
// Create Vertex Buffer
m_vertexBuffer.create();
m_vertexBuffer.bind();
m_vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
glGenBuffers(1, &m_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
// Create Vertex Array Object
m_vertexArray.create();
@@ -101,7 +102,7 @@ void OpenGlViewer::initializeGL()
// unbind everything
m_vertexArray.release();
m_vertexBuffer.release();
glBindBuffer(GL_ARRAY_BUFFER, 0);
m_program->release();
}
@@ -112,8 +113,11 @@ void OpenGlViewer::paintGL()
glClear(GL_COLOR_BUFFER_BIT);
m_program->bind();
m_vertexArray.bind();
m_oglTexture->bind();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_oglTexture);
m_program->setUniformValue("textureSampler", 0);
if (m_vModels != nullptr)
{
@@ -133,15 +137,19 @@ void OpenGlViewer::paintGL()
// set the texture
std::uint32_t tmp_textureIndex = segmentIterator->textureIndex >= m_vTextures->size() ? m_vTextures->size() - 1 : segmentIterator->textureIndex;
if (m_oglTexture->isCreated())
{
m_oglTexture->destroy();
m_oglTexture->create();
m_oglTexture->setSize(m_vTextures->at(tmp_textureIndex)->width(), m_vTextures->at(tmp_textureIndex)->height());
m_oglTexture->setData(*m_vTextures->at(tmp_textureIndex));
}
glTexImage2D(
GL_TEXTURE_2D,
0,
m_vTextures->at(tmp_textureIndex)->alpha ? GL_RGBA : GL_RGB,
m_vTextures->at(tmp_textureIndex)->width,
m_vTextures->at(tmp_textureIndex)->height,
0,
m_vTextures->at(tmp_textureIndex)->alpha ? GL_BGRA : GL_BGR,
GL_UNSIGNED_BYTE,
m_vTextures->at(tmp_textureIndex)->data->data()
);
glGenerateMipmap(GL_TEXTURE_2D);
// give the MVP to the shader
m_program->setUniformValue(m_uniformMVP, getMVPMatrix(modelIndex));
@@ -159,9 +167,9 @@ void OpenGlViewer::paintGL()
}
}
m_oglTexture->release();
m_vertexArray.release();
m_program->release();
this->frameSwapped();
}
void OpenGlViewer::printContextInformation()
@@ -270,9 +278,12 @@ void OpenGlViewer::deleteData()
while (!m_vTextures->empty())
{
// remove the last texture
QImage* cursor = m_vTextures->back();
TextureData* cursor = m_vTextures->back();
m_vTextures->pop_back();
cursor->data->clear();
delete cursor->data;
//delete image
delete cursor;
}
@@ -285,7 +296,7 @@ void OpenGlViewer::deleteData()
/////////////////////////////////////////////////////////////////////////
// public functions
void OpenGlViewer::setData(std::vector<Model*>* models, std::vector<QImage*>* textures, BoundingBox bbox)
void OpenGlViewer::setData(std::vector<Model*>* models, std::vector<TextureData*>* textures, BoundingBox bbox)
{
// new Data, so clean up the old things
deleteData();
@@ -348,10 +359,14 @@ void OpenGlViewer::setData(std::vector<Model*>* models, std::vector<QImage*>* te
}
}
m_vertexBuffer.bind();
m_vertexBuffer.allocate(tmp_bufferData.data(), sizeof(Vertex) * tmp_bufferData.size());
m_vertexBuffer.release();
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);
glBufferData(
GL_ARRAY_BUFFER,
sizeof(Vertex) * tmp_bufferData.size(),
tmp_bufferData.data(),
GL_STATIC_DRAW
);
glBindBuffer(GL_ARRAY_BUFFER, 0);
tmp_bufferData.clear();
}