Fix segfault binding unloaded texture.
This commit is contained in:
parent
c5e21bd731
commit
fb9c320633
@ -22,18 +22,7 @@ ExampleScene::~ExampleScene() = default;
|
|||||||
|
|
||||||
void ExampleScene::init()
|
void ExampleScene::init()
|
||||||
{
|
{
|
||||||
setSkybox(new Qtk::Skybox(":/textures/skybox/right.png",
|
setSkybox(new Qtk::Skybox);
|
||||||
":/textures/skybox/top.png",
|
|
||||||
":/textures/skybox/front.png",
|
|
||||||
":/textures/skybox/left.png",
|
|
||||||
":/textures/skybox/bottom.png",
|
|
||||||
":/textures/skybox/back.png",
|
|
||||||
"Skybox"));
|
|
||||||
|
|
||||||
std::string spartanPath = QTK_EXAMPLE_SOURCE_DIR;
|
|
||||||
spartanPath += "/../resources/models/spartan/spartan.obj";
|
|
||||||
auto spartan = addObject(new Model("spartan", spartanPath.c_str()));
|
|
||||||
spartan->getTransform().setTranslation(-4.0f, 0.0f, 0.0f);
|
|
||||||
|
|
||||||
auto mesh = addObject(
|
auto mesh = addObject(
|
||||||
new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
new Qtk::MeshRenderer("rightTriangle", Triangle(QTK_DRAW_ELEMENTS)));
|
||||||
|
@ -121,9 +121,7 @@ void MeshRenderer::draw()
|
|||||||
bindShaders();
|
bindShaders();
|
||||||
mVAO.bind();
|
mVAO.bind();
|
||||||
|
|
||||||
if (mTexture.hasTexture()) {
|
mTexture.bind();
|
||||||
mTexture.getOpenGLTexture().bind();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Automate uniforms some other way
|
// TODO: Automate uniforms some other way
|
||||||
setUniformMVP();
|
setUniformMVP();
|
||||||
@ -138,9 +136,7 @@ void MeshRenderer::draw()
|
|||||||
mShape.mIndices.data());
|
mShape.mIndices.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mTexture.hasTexture()) {
|
mTexture.bind();
|
||||||
mTexture.getOpenGLTexture().release();
|
|
||||||
}
|
|
||||||
|
|
||||||
mVAO.release();
|
mVAO.release();
|
||||||
releaseShaders();
|
releaseShaders();
|
||||||
|
@ -17,9 +17,28 @@ using namespace Qtk;
|
|||||||
* Constructors / Destructors
|
* Constructors / Destructors
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
Skybox::Skybox(QOpenGLTexture * cubeMap, const std::string & name)
|
Skybox::Skybox(const std::string & name) :
|
||||||
|
mVBO(QOpenGLBuffer::VertexBuffer),
|
||||||
|
mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
|
||||||
|
mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
|
||||||
{
|
{
|
||||||
mTexture.setTexture(cubeMap);
|
QImage image({1024, 1024}, QImage::Format_RGBA8888);
|
||||||
|
image.fill(Qt::darkGray);
|
||||||
|
mTexture.setCubeMap(image, image, image, image, image, image);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
Skybox::Skybox(QOpenGLTexture * cubeMap, const std::string & name) :
|
||||||
|
mVBO(QOpenGLBuffer::VertexBuffer),
|
||||||
|
mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
|
||||||
|
mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
|
||||||
|
{
|
||||||
|
if (cubeMap == Q_NULLPTR) {
|
||||||
|
qDebug()
|
||||||
|
<< "[Qtk] Failed to set cubemap for skybox with null QOpenGLTexture.";
|
||||||
|
} else {
|
||||||
|
mTexture.setTexture(cubeMap);
|
||||||
|
}
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,13 +53,13 @@ Skybox::Skybox(const std::string & right,
|
|||||||
mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
|
mVertices(Cube(QTK_DRAW_ELEMENTS).getVertices()),
|
||||||
mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
|
mIndices(Cube(QTK_DRAW_ELEMENTS).getIndexData())
|
||||||
{
|
{
|
||||||
init();
|
|
||||||
mTexture.setCubeMap(QImage(right.c_str()).mirrored(),
|
mTexture.setCubeMap(QImage(right.c_str()).mirrored(),
|
||||||
QImage(top.c_str()),
|
QImage(top.c_str()),
|
||||||
QImage(front.c_str()),
|
QImage(front.c_str()),
|
||||||
QImage(left.c_str()),
|
QImage(left.c_str()),
|
||||||
QImage(bottom.c_str()),
|
QImage(bottom.c_str()),
|
||||||
QImage(back.c_str()));
|
QImage(back.c_str()));
|
||||||
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
@ -54,7 +73,7 @@ void Skybox::draw()
|
|||||||
|
|
||||||
mVAO.bind();
|
mVAO.bind();
|
||||||
mProgram.bind();
|
mProgram.bind();
|
||||||
mTexture.getOpenGLTexture().bind();
|
mTexture.bind();
|
||||||
|
|
||||||
mProgram.setUniformValue("uProjectionMatrix", Scene::getProjectionMatrix());
|
mProgram.setUniformValue("uProjectionMatrix", Scene::getProjectionMatrix());
|
||||||
mProgram.setUniformValue("uViewMatrix", Scene::getCamera().toMatrix());
|
mProgram.setUniformValue("uViewMatrix", Scene::getCamera().toMatrix());
|
||||||
@ -62,7 +81,7 @@ void Skybox::draw()
|
|||||||
glDrawElements(
|
glDrawElements(
|
||||||
GL_TRIANGLES, mIndices.size(), GL_UNSIGNED_INT, mIndices.data());
|
GL_TRIANGLES, mIndices.size(), GL_UNSIGNED_INT, mIndices.data());
|
||||||
|
|
||||||
mTexture.getOpenGLTexture().bind();
|
mTexture.bind();
|
||||||
mProgram.release();
|
mProgram.release();
|
||||||
mVAO.release();
|
mVAO.release();
|
||||||
|
|
||||||
|
@ -34,7 +34,12 @@ namespace Qtk
|
|||||||
* Constructors / Destructors
|
* Constructors / Destructors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
// Delegate this constructor to use default skybox images
|
/**
|
||||||
|
* Construct a skybox with a default texture.
|
||||||
|
*
|
||||||
|
* @param name The objectName to use for the Skybox.
|
||||||
|
*/
|
||||||
|
explicit Skybox(const std::string & name = "Skybox");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a skybox with an existing QOpenGLTexture.
|
* Construct a skybox with an existing QOpenGLTexture.
|
||||||
|
@ -104,9 +104,9 @@ QOpenGLTexture * OpenGLTextureFactory::initCubeMap(const QImage & right,
|
|||||||
QOpenGLTexture::CubeMapNegativeZ};
|
QOpenGLTexture::CubeMapNegativeZ};
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (const auto & face : faces) {
|
for (const auto & face : faces) {
|
||||||
QImage faceImage(faceTextures[i]);
|
QImage & faceImage = faceTextures[i];
|
||||||
if (faceImage.isNull()) {
|
if (faceImage.isNull()) {
|
||||||
qDebug() << "Error loading cube map image\n";
|
qDebug() << "[libqtk] Error loading cube map image\n";
|
||||||
faceImage = defaultTexture();
|
faceImage = defaultTexture();
|
||||||
}
|
}
|
||||||
faceImage = faceImage.convertToFormat(QImage::Format_RGBA8888);
|
faceImage = faceImage.convertToFormat(QImage::Format_RGBA8888);
|
||||||
|
@ -217,6 +217,20 @@ namespace Qtk
|
|||||||
return mOpenGLTexture != Q_NULLPTR;
|
return mOpenGLTexture != Q_NULLPTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bind the OpenGL texture if it exists, avoiding segmentation faults.
|
||||||
|
*/
|
||||||
|
bool bind() const
|
||||||
|
{
|
||||||
|
if (hasTexture()) {
|
||||||
|
// TODO: It would be nice to warn here but some objects may not have
|
||||||
|
// a texture. Factor Texture out of those objects so we don't bind.
|
||||||
|
mOpenGLTexture->bind();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* Accessors
|
* Accessors
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
@ -300,12 +314,12 @@ namespace Qtk
|
|||||||
/**
|
/**
|
||||||
* Sets this Texture to be a cube map with provided sides.
|
* Sets this Texture to be a cube map with provided sides.
|
||||||
*
|
*
|
||||||
* @param right Path to texture to use for right cube map side.
|
* @param right QImage texture to use for right cube map side.
|
||||||
* @param top Path to texture to use for top cube map side.
|
* @param top QImage texture to use for top cube map side.
|
||||||
* @param front Path to texture to use for front cube map side.
|
* @param front QImage texture to use for front cube map side.
|
||||||
* @param left Path to texture to use for left cube map side.
|
* @param left QImage texture to use for left cube map side.
|
||||||
* @param bottom Path to texture to use for bottom cube map side.
|
* @param bottom QImage texture to use for bottom cube map side.
|
||||||
* @param back Path to texture to use for back cube map side.
|
* @param back QImage texture to use for back cube map side.
|
||||||
*/
|
*/
|
||||||
virtual inline void setCubeMap(const QImage & right,
|
virtual inline void setCubeMap(const QImage & right,
|
||||||
const QImage & top,
|
const QImage & top,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user