still trying to fix the problem
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user