diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-02-03 12:40:49 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-02-08 15:02:37 +0000 |
commit | d01efde5c22b5bd16c091c7277db717b7ff3cfc3 (patch) | |
tree | e27db67d08cd69b1c0e47c3363d6e863b7f7e35c /src/plugins | |
parent | 6cdceede825fd215a9addd191efd217919a3074a (diff) |
Assimparser updated to use new Texture API
Change-Id: I4c030458ecf15d9620d071573f911052fb5a6973
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/sceneparsers/assimp/assimpparser.cpp | 96 |
1 files changed, 75 insertions, 21 deletions
diff --git a/src/plugins/sceneparsers/assimp/assimpparser.cpp b/src/plugins/sceneparsers/assimp/assimpparser.cpp index aeb27a3ab..6be509016 100644 --- a/src/plugins/sceneparsers/assimp/assimpparser.cpp +++ b/src/plugins/sceneparsers/assimp/assimpparser.cpp @@ -65,7 +65,7 @@ namespace Qt3D { /*! * \class AssimpParser * \namespace Qt3D - * \since 5.3 + * \since 5.5 * * \brief Provides a generic way of loading various 3D assets * format into a Qt3D scene. @@ -205,6 +205,33 @@ private: }; }; +class AssimpRawTextureImage : public QAbstractTextureImage +{ + Q_OBJECT +public: + explicit AssimpRawTextureImage(QNode *parent = 0); + + QTextureDataFunctorPtr dataFunctor() const Q_DECL_FINAL; + + void setData(const QByteArray &data); + +private: + QByteArray m_data; + QT3D_CLONEABLE(AssimpRawTextureImage) + + class AssimpRawTextureImageFunctor : public QTextureDataFunctor + { + public: + explicit AssimpRawTextureImageFunctor(const QByteArray &data); + + TexImageDataPtr operator()() Q_DECL_FINAL; + bool operator ==(const QTextureDataFunctor &other) const Q_DECL_FINAL; + + private: + QByteArray m_data; + }; +}; + /*! * Initialized a new instance of AssimpParser. */ @@ -594,7 +621,7 @@ void AssimpParser::loadEmbeddedTexture(uint textureIndex) { aiTexture *assimpTexture = m_scene->m_aiScene->mTextures[textureIndex]; QAbstractTextureProvider *texture = new QTexture2D(); - TexImageDataPtr textureData(new TexImageData()); + AssimpRawTextureImage *imageData = new AssimpRawTextureImage(); bool isCompressed = assimpTexture->mHeight == 0; uint textureSize = assimpTexture->mWidth * @@ -609,10 +636,8 @@ void AssimpParser::loadEmbeddedTexture(uint textureIndex) textureContent[idx + 2] = texel.b; textureContent[idx + 3] = texel.a; } - textureData->setData(QByteArray(textureContent, textureSize * 4), - QOpenGLTexture::RGBA, - QOpenGLTexture::UInt8); - texture->addImageData(textureData); + imageData->setData(QByteArray(textureContent, textureSize * 4)); + texture->addTextureImage(imageData); m_scene->m_embeddedTextures[textureIndex] = texture; } @@ -771,24 +796,16 @@ void AssimpParser::copyMaterialTextures(QMaterial *material, aiMaterial *assimpM if (assimpMaterial->GetTexture(textureType[i], 0, &path) == AI_SUCCESS) { QString fullPath = m_sceneDir.absoluteFilePath(QString::fromUtf8(path.data)); // Load texture if not already loaded - bool textureLoaded = true; if (!m_scene->m_materialTextures.contains(fullPath)) { QAbstractTextureProvider *tex = new QTexture2D(); - QImage textureImage; - if (!textureImage.load(fullPath) || !textureImage.isNull()) { - tex->setFromQImage(textureImage); - m_scene->m_materialTextures.insert(fullPath, tex); - qCWarning(AssimpParserLog) << Q_FUNC_INFO << " Loaded Texture " << fullPath; - } - else { - qCWarning(AssimpParserLog) << Q_FUNC_INFO << " Invalid Texture " << fullPath; - textureLoaded = false; - } - } - if (textureLoaded) { - material->addParameter(new QParameter(m_scene->m_textureToParameterName[textureType[i]], - m_scene->m_materialTextures[fullPath])); + QTextureImage *texImage = new QTextureImage(); + texImage->setSource(fullPath); + tex->addTextureImage(texImage); + m_scene->m_materialTextures.insert(fullPath, tex); + qCDebug(AssimpParserLog) << Q_FUNC_INFO << " Loaded Texture " << fullPath; } + material->addParameter(new QParameter(m_scene->m_textureToParameterName[textureType[i]], + m_scene->m_materialTextures[fullPath])); } } } @@ -852,6 +869,43 @@ bool AssimpMesh::AssimpMeshFunctor::operator ==(const QAbstractMeshFunctor &) co return false; } +AssimpRawTextureImage::AssimpRawTextureImage(QNode *parent) + : QAbstractTextureImage(parent) +{ +} + +QTextureDataFunctorPtr AssimpRawTextureImage::dataFunctor() const +{ + return QTextureDataFunctorPtr(new AssimpRawTextureImageFunctor(m_data)); +} + +void AssimpRawTextureImage::setData(const QByteArray &data) +{ + if (data != m_data) { + m_data = data; + update(); + } +} + +AssimpRawTextureImage::AssimpRawTextureImageFunctor::AssimpRawTextureImageFunctor(const QByteArray &data) + : QTextureDataFunctor() + , m_data(data) +{ +} + +TexImageDataPtr AssimpRawTextureImage::AssimpRawTextureImageFunctor::operator()() +{ + TexImageDataPtr dataPtr; + dataPtr->setData(m_data, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8); + return dataPtr; +} + +bool AssimpRawTextureImage::AssimpRawTextureImageFunctor::operator ==(const QTextureDataFunctor &other) const +{ + const AssimpRawTextureImageFunctor *otherFunctor = dynamic_cast<const AssimpRawTextureImageFunctor *>(&other); + return (otherFunctor != Q_NULLPTR && otherFunctor->m_data == m_data); +} + AssimpParser::SceneImporter::SceneImporter() : m_importer(new Assimp::Importer()) , m_aiScene(Q_NULLPTR) |