Work on Texture class
This commit is contained in:
parent
bc073fbd03
commit
c745da30c6
|
@ -29,9 +29,6 @@ MeshRenderer::MeshRenderer(const char * name, const ShapeBase & shape)
|
||||||
|
|
||||||
MeshRenderer::~MeshRenderer()
|
MeshRenderer::~MeshRenderer()
|
||||||
{
|
{
|
||||||
if (mHasTexture) {
|
|
||||||
mTexture->destroy();
|
|
||||||
}
|
|
||||||
sInstances.remove(mName);
|
sInstances.remove(mName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,8 +93,8 @@ void MeshRenderer::draw()
|
||||||
mProgram.bind();
|
mProgram.bind();
|
||||||
mVAO.bind();
|
mVAO.bind();
|
||||||
|
|
||||||
if(mHasTexture) {
|
if(mTexture.hasTexture()) {
|
||||||
mTexture->bind();
|
mTexture.getOpenGLTexture().bind();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Automate uniforms some other way
|
// TODO: Automate uniforms some other way
|
||||||
|
@ -112,8 +109,8 @@ void MeshRenderer::draw()
|
||||||
GL_UNSIGNED_INT, mShape.mIndices.data());
|
GL_UNSIGNED_INT, mShape.mIndices.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mHasTexture) {
|
if(mTexture.hasTexture()) {
|
||||||
mTexture->release();
|
mTexture.getOpenGLTexture().release();
|
||||||
}
|
}
|
||||||
|
|
||||||
mVAO.release();
|
mVAO.release();
|
||||||
|
@ -148,18 +145,6 @@ void MeshRenderer::setColor(const QVector3D & color)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshRenderer::setTexture(const char * path)
|
|
||||||
{
|
|
||||||
mTexture = new QOpenGLTexture(*OpenGLTextureFactory::initImage(path));
|
|
||||||
mHasTexture = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MeshRenderer::setTexture(QOpenGLTexture * texture)
|
|
||||||
{
|
|
||||||
mTexture = texture;
|
|
||||||
mHasTexture = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Inherited Virtual Member Functions
|
* Inherited Virtual Member Functions
|
||||||
|
|
|
@ -55,11 +55,6 @@ public:
|
||||||
void setUniformMVP(const char * model="uModel", const char * view="uView",
|
void setUniformMVP(const char * model="uModel", const char * view="uView",
|
||||||
const char * projection="uProjection");
|
const char * projection="uProjection");
|
||||||
|
|
||||||
// Sets the texture to the image at the given path
|
|
||||||
// + Sets mHasTexture to enable texture binding in draw()
|
|
||||||
void setTexture(const char * path);
|
|
||||||
void setTexture(QOpenGLTexture * texture);
|
|
||||||
|
|
||||||
// These functions modify data stored in a VBO
|
// These functions modify data stored in a VBO
|
||||||
// + After calling them, the VBO will need to be reallocated
|
// + After calling them, the VBO will need to be reallocated
|
||||||
void setShape(const Shape & value) override;
|
void setShape(const Shape & value) override;
|
||||||
|
|
|
@ -390,12 +390,13 @@ ModelMesh::Textures Model::loadMaterialTextures(
|
||||||
void Model::sortModels()
|
void Model::sortModels()
|
||||||
{
|
{
|
||||||
auto cameraPos = Scene::Camera().transform();
|
auto cameraPos = Scene::Camera().transform();
|
||||||
auto cameraDistance = [&cameraPos](const ModelMesh &a, const ModelMesh &b)
|
auto cameraDistance =
|
||||||
{
|
[&cameraPos](const ModelMesh &a, const ModelMesh &b)
|
||||||
// Sort by the first vertex position, since all transforms will be the same
|
{
|
||||||
return (cameraPos.getTranslation().distanceToPoint(a.mVertices[0].mPosition))
|
// Sort by the first vertex position in the model
|
||||||
< (cameraPos.getTranslation().distanceToPoint(b.mVertices[0].mPosition));
|
return (cameraPos.getTranslation().distanceToPoint(a.mVertices[0].mPosition))
|
||||||
};
|
< (cameraPos.getTranslation().distanceToPoint(b.mVertices[0].mPosition));
|
||||||
|
};
|
||||||
std::sort(mMeshes.begin(), mMeshes.end(), cameraDistance);
|
std::sort(mMeshes.begin(), mMeshes.end(), cameraDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
src/object.h
13
src/object.h
|
@ -14,6 +14,7 @@
|
||||||
#include <QOpenGLVertexArrayObject>
|
#include <QOpenGLVertexArrayObject>
|
||||||
|
|
||||||
#include <mesh.h>
|
#include <mesh.h>
|
||||||
|
#include <texture.h>
|
||||||
|
|
||||||
|
|
||||||
class Object : public QObject {
|
class Object : public QObject {
|
||||||
|
@ -32,15 +33,12 @@ public:
|
||||||
|
|
||||||
~Object() {}
|
~Object() {}
|
||||||
|
|
||||||
// Look to MeshRenderer for wrapped texture functionality
|
|
||||||
// + Object only exposes a QOpenGLTexture object with no wrapped features
|
|
||||||
inline QOpenGLTexture & texture() const { return *mTexture;}
|
|
||||||
// These custom types are wrapped for Qtk
|
|
||||||
inline const Colors & getColors() { return mShape.mColors;}
|
inline const Colors & getColors() { return mShape.mColors;}
|
||||||
inline const Indices & getIndexData() { return mShape.mIndices;}
|
inline const Indices & getIndexData() { return mShape.mIndices;}
|
||||||
inline const Normals & getNormals() { return mShape.mNormals;}
|
inline const Normals & getNormals() { return mShape.mNormals;}
|
||||||
inline const Shape & getShape() { return mShape;}
|
inline const Shape & getShape() { return mShape;}
|
||||||
inline const TexCoords & getTexCoords() { return mShape.mTexCoords;}
|
inline const TexCoords & getTexCoords() { return mShape.mTexCoords;}
|
||||||
|
inline Texture & getTexture() { return mTexture;}
|
||||||
inline const Vertices & getVertices() { return mShape.mVertices;}
|
inline const Vertices & getVertices() { return mShape.mVertices;}
|
||||||
|
|
||||||
virtual inline void setColors(const Colors & value) { mShape.mColors = value;}
|
virtual inline void setColors(const Colors & value) { mShape.mColors = value;}
|
||||||
|
@ -48,8 +46,10 @@ public:
|
||||||
virtual inline void setNormals(const Normals & value) { mShape.mNormals = value;}
|
virtual inline void setNormals(const Normals & value) { mShape.mNormals = value;}
|
||||||
virtual inline void setShape(const Shape & value) { mShape = value;}
|
virtual inline void setShape(const Shape & value) { mShape = value;}
|
||||||
virtual inline void setTexCoords(const TexCoords & value) { mShape.mTexCoords = value;}
|
virtual inline void setTexCoords(const TexCoords & value) { mShape.mTexCoords = value;}
|
||||||
|
virtual inline void setTexture(const char * path, bool flipX=false, bool flipY=false)
|
||||||
|
{ mTexture.setTexture(OpenGLTextureFactory::initTexture2D(path, flipX, flipY));}
|
||||||
|
virtual inline void setTexture(QOpenGLTexture * value) { mTexture.setTexture(value);}
|
||||||
virtual inline void setVertices(const Vertices & value) { mShape.mVertices = value;}
|
virtual inline void setVertices(const Vertices & value) { mShape.mVertices = value;}
|
||||||
// To set mTexture use the accessor and QOpenGLTexture API
|
|
||||||
|
|
||||||
QOpenGLBuffer mVBO, mNBO;
|
QOpenGLBuffer mVBO, mNBO;
|
||||||
QOpenGLVertexArrayObject mVAO;
|
QOpenGLVertexArrayObject mVAO;
|
||||||
|
@ -57,10 +57,9 @@ public:
|
||||||
|
|
||||||
Transform3D mTransform;
|
Transform3D mTransform;
|
||||||
Shape mShape;
|
Shape mShape;
|
||||||
|
Texture mTexture;
|
||||||
|
|
||||||
const char * mName;
|
const char * mName;
|
||||||
private:
|
|
||||||
QOpenGLTexture * mTexture;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QTK_OBJECT_H
|
#endif // QTK_OBJECT_H
|
||||||
|
|
|
@ -196,8 +196,7 @@ void Scene::init()
|
||||||
mMeshes.back()->init();
|
mMeshes.back()->init();
|
||||||
|
|
||||||
mModels.push_back(
|
mModels.push_back(
|
||||||
new Model("alienTest",
|
new Model("alienTest", "../resources/models/alien-hominid/alien.obj",
|
||||||
"../resources/models/alien-hominid/alien.obj",
|
|
||||||
":/model-specular.vert", ":/model-specular.frag"));
|
":/model-specular.vert", ":/model-specular.frag"));
|
||||||
mModels.back()->mTransform.setTranslation(3.0f, -1.0f, 10.0f);
|
mModels.back()->mTransform.setTranslation(3.0f, -1.0f, 10.0f);
|
||||||
mModels.back()->mTransform.scale(0.15f);
|
mModels.back()->mTransform.scale(0.15f);
|
||||||
|
@ -224,8 +223,7 @@ void Scene::init()
|
||||||
mMeshes.back()->init();
|
mMeshes.back()->init();
|
||||||
|
|
||||||
mModels.push_back(
|
mModels.push_back(
|
||||||
new Model("spartanTest",
|
new Model("spartanTest", "../resources/models/spartan/spartan.obj",
|
||||||
"../resources/models/spartan/spartan.obj",
|
|
||||||
":/model-normals.vert", ":/model-normals.frag"));
|
":/model-normals.vert", ":/model-normals.frag"));
|
||||||
mModels.back()->mTransform.setTranslation(0.0f, -1.0f, 10.0f);
|
mModels.back()->mTransform.setTranslation(0.0f, -1.0f, 10.0f);
|
||||||
mModels.back()->mTransform.scale(2.0f);
|
mModels.back()->mTransform.scale(2.0f);
|
||||||
|
@ -516,7 +514,7 @@ void Scene::init()
|
||||||
mMeshes.back()->init();
|
mMeshes.back()->init();
|
||||||
mMeshes.back()->mProgram.bind();
|
mMeshes.back()->mProgram.bind();
|
||||||
|
|
||||||
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
mMeshes.back()->setTexture(":/crate.png");
|
||||||
mMeshes.back()->setUniform("uTexture", 0);
|
mMeshes.back()->setUniform("uTexture", 0);
|
||||||
|
|
||||||
mMeshes.back()->mVAO.bind();
|
mMeshes.back()->mVAO.bind();
|
||||||
|
@ -542,7 +540,8 @@ void Scene::init()
|
||||||
mMeshes.back()->init();
|
mMeshes.back()->init();
|
||||||
mMeshes.back()->mProgram.bind();
|
mMeshes.back()->mProgram.bind();
|
||||||
|
|
||||||
mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
// mMeshes.back()->setTexture(OpenGLTextureFactory::initTexture2D(":/crate.png"));
|
||||||
|
mMeshes.back()->mTexture.setTexture(":/crate.png");
|
||||||
mMeshes.back()->setUniform("uTexture", 0);
|
mMeshes.back()->setUniform("uTexture", 0);
|
||||||
|
|
||||||
mMeshes.back()->mVAO.bind();
|
mMeshes.back()->mVAO.bind();
|
||||||
|
|
|
@ -11,10 +11,9 @@
|
||||||
|
|
||||||
#include <QOpenGLTexture>
|
#include <QOpenGLTexture>
|
||||||
|
|
||||||
|
|
||||||
class OpenGLTextureFactory {
|
class OpenGLTextureFactory {
|
||||||
public:
|
public:
|
||||||
~OpenGLTextureFactory() {}
|
~OpenGLTextureFactory() = default;
|
||||||
|
|
||||||
// QImage
|
// QImage
|
||||||
static QImage * initImage(const char * image,
|
static QImage * initImage(const char * image,
|
||||||
|
@ -36,7 +35,34 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Private ctor to prevent creating instances of this class
|
// Private ctor to prevent creating instances of this class
|
||||||
OpenGLTextureFactory() {}
|
OpenGLTextureFactory() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Texture {
|
||||||
|
public:
|
||||||
|
Texture() = default;
|
||||||
|
Texture(const Texture & value) = delete;
|
||||||
|
// Texture(const Texture & value) {
|
||||||
|
// mOpenGLTexture = OpenGLTextureFactory::initTexture2D(value.mPath);
|
||||||
|
// mPath = value.mPath;
|
||||||
|
// }
|
||||||
|
explicit Texture(const char * path, bool flipX=false, bool flipY=false) :
|
||||||
|
mOpenGLTexture(OpenGLTextureFactory::initTexture2D(path, flipX, flipY)),
|
||||||
|
mPath(path) { }
|
||||||
|
// explicit Texture(QOpenGLTexture * texture) : mOpenGLTexture(texture) { }
|
||||||
|
~Texture() { mOpenGLTexture->destroy();}
|
||||||
|
|
||||||
|
inline QOpenGLTexture & getOpenGLTexture() { return *mOpenGLTexture;}
|
||||||
|
|
||||||
|
void setTexture(const char * path, bool flipX=false, bool flipY=false)
|
||||||
|
{ mOpenGLTexture = OpenGLTextureFactory::initTexture2D(path, flipX, flipY);}
|
||||||
|
inline void setTexture(QOpenGLTexture * texture) { mOpenGLTexture = texture;}
|
||||||
|
|
||||||
|
inline bool hasTexture() const { return mOpenGLTexture != Q_NULLPTR;}
|
||||||
|
|
||||||
|
QOpenGLTexture * mOpenGLTexture = Q_NULLPTR;
|
||||||
|
const char * mPath;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // QTOPENGL_TEXTURE_H
|
#endif // QTOPENGL_TEXTURE_H
|
||||||
|
|
Loading…
Reference in New Issue