diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-05-19 07:51:27 +0300 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-05-19 07:51:27 +0300 |
commit | d8345b03d800ff30781f32ed04dcf74758f8869b (patch) | |
tree | 7d699bd2db2af93ac9865dc6852bf35051dffab9 | |
parent | c8f225c4d61b1fd3afa048db93f2e2294896a36f (diff) | |
parent | e4152112a0bec462271472ab975052dfec35c1d0 (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.5' into tqtc/lts-5.15-opensourcev5.15.5-lts-lgpl
Change-Id: I53b2db5ca4ea833fb5a054be8791c556f31a75c9
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/assetimport/qssgassetimportmanager.cpp | 12 | ||||
-rw-r--r-- | src/imports/effectlib/designer/IdComboBox.qml | 6 | ||||
-rw-r--r-- | src/imports/quick3d/designer/IdComboBox.qml | 6 | ||||
-rw-r--r-- | src/quick3d/qquick3dcustommaterial.cpp | 8 | ||||
-rw-r--r-- | src/quick3d/qquick3deffect.cpp | 8 | ||||
-rw-r--r-- | src/quick3d/qquick3dscenerenderer.cpp | 2 | ||||
-rw-r--r-- | src/quick3d/qquick3dshaderutils.cpp | 22 | ||||
-rw-r--r-- | src/quick3d/qquick3dshaderutils_p.h | 50 | ||||
-rw-r--r-- | src/quick3d/qquick3dviewport.cpp | 12 | ||||
-rw-r--r-- | src/render/qssgrenderbasetypes_p.h | 1 | ||||
-rw-r--r-- | src/render/qssgrendershaderprogram.cpp | 4 | ||||
-rw-r--r-- | src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp | 28 | ||||
-rw-r--r-- | src/runtimerender/qssgrendershadercache.cpp | 24 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp | 5 | ||||
-rw-r--r-- | src/runtimerender/resourcemanager/qssgrenderloadedtexture.cpp | 2 |
16 files changed, 122 insertions, 70 deletions
diff --git a/.qmake.conf b/.qmake.conf index 769c11fa..b8e11611 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -3,4 +3,4 @@ load(qt_build_config) CONFIG += warning_clean DEFINES += QT_NO_FOREACH -MODULE_VERSION = 5.15.4 +MODULE_VERSION = 5.15.5 diff --git a/src/assetimport/qssgassetimportmanager.cpp b/src/assetimport/qssgassetimportmanager.cpp index 96238c00..0feb94ff 100644 --- a/src/assetimport/qssgassetimportmanager.cpp +++ b/src/assetimport/qssgassetimportmanager.cpp @@ -43,10 +43,14 @@ QSSGAssetImportManager::QSSGAssetImportManager(QObject *parent) : QObject(parent const QStringList keys = QSSGAssetImporterFactory::keys(); for (const auto &key : keys) { auto importer = QSSGAssetImporterFactory::create(key, QStringList()); - m_assetImporters.append(importer); - // Add to extension map - for (const auto &extension : importer->inputExtensions()) { - m_extensionsMap.insert(extension, importer); + if (importer) { + m_assetImporters.append(importer); + // Add to extension map + for (const auto &extension : importer->inputExtensions()) { + m_extensionsMap.insert(extension, importer); + } + } else { + qWarning() << "Failed to load asset import plugin with key: " << key; } } } diff --git a/src/imports/effectlib/designer/IdComboBox.qml b/src/imports/effectlib/designer/IdComboBox.qml index be341ae4..4111ad0e 100644 --- a/src/imports/effectlib/designer/IdComboBox.qml +++ b/src/imports/effectlib/designer/IdComboBox.qml @@ -28,9 +28,9 @@ ****************************************************************************/ import QtQuick 2.15 -import HelperWidgets 2.0 as HelperWidgets +import HelperWidgets 2.0 -HelperWidgets.ComboBox { +ComboBox { id: comboBox property alias typeFilter: itemFilterModel.typeFilter @@ -41,7 +41,7 @@ HelperWidgets.ComboBox { textInput.validator: RegExpValidator { regExp: /(^$|^[a-z_]\w*)/ } - HelperWidgets.ItemFilterModel { + ItemFilterModel { id: itemFilterModel modelNodeBackendProperty: modelNodeBackend } diff --git a/src/imports/quick3d/designer/IdComboBox.qml b/src/imports/quick3d/designer/IdComboBox.qml index 9020bc0f..1d34d73c 100644 --- a/src/imports/quick3d/designer/IdComboBox.qml +++ b/src/imports/quick3d/designer/IdComboBox.qml @@ -28,9 +28,9 @@ ****************************************************************************/ import QtQuick 2.15 -import HelperWidgets 2.0 as HelperWidgets +import HelperWidgets 2.0 -HelperWidgets.ComboBox { +ComboBox { id: comboBox property alias typeFilter: itemFilterModel.typeFilter @@ -41,7 +41,7 @@ HelperWidgets.ComboBox { textInput.validator: RegExpValidator { regExp: /(^$|^[a-z_]\w*)/ } - HelperWidgets.ItemFilterModel { + ItemFilterModel { id: itemFilterModel modelNodeBackendProperty: modelNodeBackend } diff --git a/src/quick3d/qquick3dcustommaterial.cpp b/src/quick3d/qquick3dcustommaterial.cpp index bbec1150..b0b5377e 100644 --- a/src/quick3d/qquick3dcustommaterial.cpp +++ b/src/quick3d/qquick3dcustommaterial.cpp @@ -456,10 +456,10 @@ QSSGRenderGraphObject *QQuick3DCustomMaterial::updateSpatialNode(QSSGRenderGraph QByteArray vertex, geometry, fragment, shaderCode; if (!m_passes.isEmpty()) { for (const auto &pass : qAsConst(m_passes)) { - QQuick3DShaderUtilsShader *sharedShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Shared)); - QQuick3DShaderUtilsShader *vertShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Vertex)); - QQuick3DShaderUtilsShader *fragShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Fragment)); - QQuick3DShaderUtilsShader *geomShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Geometry)); + QQuick3DShaderUtilsShader *sharedShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Shared); + QQuick3DShaderUtilsShader *vertShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Vertex); + QQuick3DShaderUtilsShader *fragShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Fragment); + QQuick3DShaderUtilsShader *geomShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Geometry); if (!sharedShader && !vertShader && !fragShader && !geomShader) { qWarning("Pass with no shader attatched!"); continue; diff --git a/src/quick3d/qquick3deffect.cpp b/src/quick3d/qquick3deffect.cpp index a6912dc7..37fb0d26 100644 --- a/src/quick3d/qquick3deffect.cpp +++ b/src/quick3d/qquick3deffect.cpp @@ -323,10 +323,10 @@ QSSGRenderGraphObject *QQuick3DEffect::updateSpatialNode(QSSGRenderGraphObject * if (!m_passes.isEmpty()) { QByteArray vertex, geometry, fragment, shaderCode; for (const auto &pass : qAsConst(m_passes)) { - QQuick3DShaderUtilsShader *sharedShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Shared)); - QQuick3DShaderUtilsShader *vertShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Vertex)); - QQuick3DShaderUtilsShader *fragShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Fragment)); - QQuick3DShaderUtilsShader *geomShader = pass->m_shaders.at(int(QQuick3DShaderUtilsShader::Stage::Geometry)); + QQuick3DShaderUtilsShader *sharedShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Shared); + QQuick3DShaderUtilsShader *vertShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Vertex); + QQuick3DShaderUtilsShader *fragShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Fragment); + QQuick3DShaderUtilsShader *geomShader = pass->shader(QQuick3DShaderUtilsShader::Stage::Geometry); if (!sharedShader && !vertShader && !fragShader && !geomShader) { qWarning("Pass with no shader attatched!"); continue; diff --git a/src/quick3d/qquick3dscenerenderer.cpp b/src/quick3d/qquick3dscenerenderer.cpp index 38f123be..cdf266d5 100644 --- a/src/quick3d/qquick3dscenerenderer.cpp +++ b/src/quick3d/qquick3dscenerenderer.cpp @@ -309,8 +309,8 @@ void QQuick3DSceneRenderer::synchronize(QQuick3DViewport *item, const QSize &siz QQuick3DNode *importScene = view3D->importScene(); if (importScene) { auto sceneManager = QQuick3DObjectPrivate::get(importScene)->sceneManager; - sceneManager->updateBoundingBoxes(m_sgContext->bufferManager()); sceneManager->updateDirtyNodes(); + sceneManager->updateBoundingBoxes(m_sgContext->bufferManager()); } // Generate layer node diff --git a/src/quick3d/qquick3dshaderutils.cpp b/src/quick3d/qquick3dshaderutils.cpp index 3b9f5276..122a93a4 100644 --- a/src/quick3d/qquick3dshaderutils.cpp +++ b/src/quick3d/qquick3dshaderutils.cpp @@ -584,11 +584,8 @@ QQmlListProperty<QQuick3DShaderUtilsRenderCommand> QQuick3DShaderUtilsRenderPass void QQuick3DShaderUtilsRenderPass::qmlAppendShader(QQmlListProperty<QQuick3DShaderUtilsShader> *list, QQuick3DShaderUtilsShader *shader) { - if (!shader) - return; - QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object); - that->m_shaders[int(shader->stage)] = shader; + that->m_shaders.append(shader); } QQuick3DShaderUtilsShader *QQuick3DShaderUtilsRenderPass::qmlShaderAt(QQmlListProperty<QQuick3DShaderUtilsShader> *list, @@ -607,10 +604,7 @@ int QQuick3DShaderUtilsRenderPass::qmlShaderCount(QQmlListProperty<QQuick3DShade void QQuick3DShaderUtilsRenderPass::qmlShaderClear(QQmlListProperty<QQuick3DShaderUtilsShader> *list) { QQuick3DShaderUtilsRenderPass *that = qobject_cast<QQuick3DShaderUtilsRenderPass *>(list->object); - auto it = that->m_shaders.begin(); - const auto end = that->m_shaders.end(); - for (;it != end; ++it) - *it = nullptr; + that->m_shaders.clear(); } QQmlListProperty<QQuick3DShaderUtilsShader> QQuick3DShaderUtilsRenderPass::shaders() @@ -620,7 +614,17 @@ QQmlListProperty<QQuick3DShaderUtilsShader> QQuick3DShaderUtilsRenderPass::shade QQuick3DShaderUtilsRenderPass::qmlAppendShader, QQuick3DShaderUtilsRenderPass::qmlShaderCount, QQuick3DShaderUtilsRenderPass::qmlShaderAt, - QQuick3DShaderUtilsRenderPass::qmlShaderClear); + QQuick3DShaderUtilsRenderPass::qmlShaderClear); +} + +QQuick3DShaderUtilsShader *QQuick3DShaderUtilsRenderPass::shader( + QQuick3DShaderUtilsShader::Stage stage) const +{ + for (QQuick3DShaderUtilsShader *shader : m_shaders) { + if (shader && shader->stage == stage) + return shader; + } + return nullptr; } void QQuick3DShaderUtilsTextureInput::setTexture(QQuick3DTexture *texture) diff --git a/src/quick3d/qquick3dshaderutils_p.h b/src/quick3d/qquick3dshaderutils_p.h index 7b3c7fd7..ac212d5a 100644 --- a/src/quick3d/qquick3dshaderutils_p.h +++ b/src/quick3d/qquick3dshaderutils_p.h @@ -52,7 +52,6 @@ QT_BEGIN_NAMESPACE -class QQuick3DShaderUtilsShader; namespace QSSGShaderUtils { @@ -446,6 +445,28 @@ public: QByteArray &target = command.m_propertyName; }; +class Q_QUICK3D_EXPORT QQuick3DShaderUtilsShader : public QObject +{ + Q_OBJECT + Q_PROPERTY(QByteArray shader MEMBER shader) + Q_PROPERTY(Stage stage MEMBER stage) +public: + QQuick3DShaderUtilsShader() = default; + virtual ~QQuick3DShaderUtilsShader() = default; + enum class Stage : quint8 + { + Shared, + Vertex, + Fragment, + Geometry, + Compute + }; + Q_ENUM(Stage) + + QByteArray shader; + Stage stage = Stage::Shared; +}; + class Q_QUICK3D_EXPORT QQuick3DShaderUtilsRenderPass : public QObject { Q_OBJECT @@ -470,7 +491,10 @@ public: QVector<QQuick3DShaderUtilsRenderCommand *> m_commands; QQuick3DShaderUtilsBuffer *outputBuffer = nullptr; QQmlListProperty<QQuick3DShaderUtilsShader> shaders(); - QVarLengthArray<QQuick3DShaderUtilsShader *, 5> m_shaders { nullptr, nullptr, nullptr, nullptr, nullptr }; + QQuick3DShaderUtilsShader *shader(QQuick3DShaderUtilsShader::Stage stage) const; + +private: + QVarLengthArray<QQuick3DShaderUtilsShader *, 5> m_shaders; }; class Q_QUICK3D_EXPORT QQuick3DShaderUtilsShaderInfo : public QObject @@ -503,28 +527,6 @@ public: bool isValid() const { return !(version.isEmpty() && type.isEmpty()); } }; -class Q_QUICK3D_EXPORT QQuick3DShaderUtilsShader : public QObject -{ - Q_OBJECT - Q_PROPERTY(QByteArray shader MEMBER shader) - Q_PROPERTY(Stage stage MEMBER stage) -public: - QQuick3DShaderUtilsShader() = default; - virtual ~QQuick3DShaderUtilsShader() = default; - enum class Stage : quint8 - { - Shared, - Vertex, - Fragment, - Geometry, - Compute - }; - Q_ENUM(Stage) - - QByteArray shader; - Stage stage = Stage::Shared; -}; - QT_END_NAMESPACE #endif // QQUICK3DSHADERUTILS_H diff --git a/src/quick3d/qquick3dviewport.cpp b/src/quick3d/qquick3dviewport.cpp index 83d4a894..dec626d7 100644 --- a/src/quick3d/qquick3dviewport.cpp +++ b/src/quick3d/qquick3dviewport.cpp @@ -307,7 +307,7 @@ void QQuick3DViewport::writeShaderCache(const QUrl &shaderCacheFile) QSaveFile file(filePath); QFileInfo(filePath).dir().mkpath(QStringLiteral(".")); bool success = false; - if (file.open(QIODevice::WriteOnly) && file.write(m_shaderCacheData) != -1) { + if (file.open(QIODevice::WriteOnly) && file.write(m_shaderCacheIO) != -1) { file.commit(); success = true; } else { @@ -350,9 +350,13 @@ void QQuick3DViewport::doImportShaderCache() if (!m_shaderCacheData.isNull()) { QByteArray error; auto rci = QSSGRenderContextInterface::getRenderContextInterface(quintptr(window())); - rci->shaderCache()->importShaderCache(m_shaderCacheData, error); - if (!error.isEmpty()) - Q_EMIT shaderCacheLoadErrors(error); + if (!rci.isNull() && !rci->shaderCache().isNull()) { + rci->shaderCache()->importShaderCache(m_shaderCacheData, error); + if (!error.isEmpty()) + Q_EMIT shaderCacheLoadErrors(error); + } else { + qWarning () << "Unable to load shader cache, not initialized."; + } } } diff --git a/src/render/qssgrenderbasetypes_p.h b/src/render/qssgrenderbasetypes_p.h index 9e9236fb..6868fac4 100644 --- a/src/render/qssgrenderbasetypes_p.h +++ b/src/render/qssgrenderbasetypes_p.h @@ -1063,6 +1063,7 @@ struct Q_QUICK3DRENDER_EXPORT QSSGRenderVertFragCompilationResult { const char *m_shaderName = nullptr; QSSGRef<QSSGRenderShaderProgram> m_shader; ///< contains the program + bool m_success = false; QSSGRenderVertFragCompilationResult(); ~QSSGRenderVertFragCompilationResult(); diff --git a/src/render/qssgrendershaderprogram.cpp b/src/render/qssgrendershaderprogram.cpp index bc873290..00278633 100644 --- a/src/render/qssgrendershaderprogram.cpp +++ b/src/render/qssgrendershaderprogram.cpp @@ -1104,6 +1104,7 @@ QSSGRenderVertFragCompilationResult QSSGRenderShaderProgram::create(const QSSGRe result.m_shader->detach(teShader); if (geShader) result.m_shader->detach(geShader); + result.m_success = true; } backend->releaseVertexShader(vtxShader); @@ -1122,7 +1123,7 @@ QSSGRenderVertFragCompilationResult QSSGRenderShaderProgram::create( QSSGRenderVertFragCompilationResult result; result.m_shaderName = programName; result.m_shader = new QSSGRenderShaderProgram(context, programName, false); - result.m_shader->link(format, binary); + result.m_success = result.m_shader->link(format, binary); return result; } @@ -1175,6 +1176,7 @@ QSSGRenderVertFragCompilationResult QSSGRenderShaderProgram::createCompute(const // set program result.m_shader = pProgram; + result.m_success = bProgramIsValid; return result; } diff --git a/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp b/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp index 4be0cdcf..2844fe77 100644 --- a/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp +++ b/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp @@ -792,6 +792,9 @@ struct QSSGShaderGenerator : public QSSGDefaultMaterialShaderGeneratorInterface // translucency map QSSGRenderableImage *translucencyImage = nullptr; quint32 translucencyImageIdx = 0; + // opacity map + QSSGRenderableImage *opacityImage = nullptr; + quint32 opacityImageIdx = 0; // lightmaps QSSGRenderableImage *lightmapIndirectImage = nullptr; quint32 lightmapIndirectImageIdx = 0; @@ -861,6 +864,9 @@ struct QSSGShaderGenerator : public QSSGDefaultMaterialShaderGeneratorInterface } else if (img->m_mapType == QSSGImageMapTypes::Translucency) { translucencyImage = img; translucencyImageIdx = imageIdx; + } else if (img->m_mapType == QSSGImageMapTypes::Opacity) { + opacityImage = img; + opacityImageIdx = imageIdx; } else if (img->m_mapType == QSSGImageMapTypes::Emissive) { hasEmissiveMap = true; } else if (img->m_mapType == QSSGImageMapTypes::LightmapIndirect) { @@ -1416,7 +1422,27 @@ struct QSSGShaderGenerator : public QSSGDefaultMaterialShaderGeneratorInterface // Ensure the rgb colors are in range. fragmentShader.append(" fragOutput = vec4(clamp(global_diffuse_light.rgb + global_specular_light.rgb, 0.0, 1.0), global_diffuse_light.a);"); } else { - fragmentShader.append(" fragOutput = vec4(diffuseColor.rgb, diffuseColor.a * objectOpacity);"); + // NoLighting + // Check if we have opacityMap + if (opacityImage) { + fragmentShader.append(" vec4 texture_opacity;"); + + QByteArray texSwizzle; + QByteArray lookupSwizzle; + + if (identityImages.contains(opacityImage)) + generateImageUVSampler(opacityImageIdx); + else + generateImageUVCoordinates(opacityImageIdx, *opacityImage); + generateTextureSwizzle(opacityImage->m_image.m_textureData.m_texture->textureSwizzleMode(), texSwizzle, lookupSwizzle); + + fragmentShader << " texture_opacity" << texSwizzle << " = texture2D(" << m_imageSampler << ", " << m_imageFragCoords << ")" << lookupSwizzle << ";\n"; + + const auto &channelProps = keyProps.m_textureChannels[QSSGShaderDefaultMaterialKeyProperties::OpacityChannel]; + fragmentShader << " fragOutput = vec4(diffuseColor.rgb, diffuseColor.a * objectOpacity * texture_opacity" << channelStr(channelProps, inKey) << ");"; + } else { + fragmentShader.append(" fragOutput = vec4(diffuseColor.rgb, diffuseColor.a * objectOpacity);"); + } } if (vertexGenerator().hasActiveWireframe()) { diff --git a/src/runtimerender/qssgrendershadercache.cpp b/src/runtimerender/qssgrendershadercache.cpp index b446f901..858e57f9 100644 --- a/src/runtimerender/qssgrendershadercache.cpp +++ b/src/runtimerender/qssgrendershadercache.cpp @@ -690,6 +690,9 @@ void QSSGShaderCache::importShaderCache(const QByteArray &shaderCache, QByteArra if (shaderCache.isEmpty()) BAILOUT("Shader cache Empty") + if (m_renderContext.isNull()) + BAILOUT("Render context is nullptr") + QDataStream data(shaderCache); quint32 type; quint32 version; @@ -745,11 +748,13 @@ void QSSGShaderCache::importShaderCache(const QByteArray &shaderCache, QByteArra qCInfo(TRACE_INFO) << "Loading binary program from shader cache: '<" << key << ">'"; QSSGRenderVertFragCompilationResult result = m_renderContext->compileBinary(key, format, binary); - theShader = result.m_shader; - if (theShader.isNull()) - errors += theShader->errorMessage(); - else + if (result.m_success) { + theShader = result.m_shader; m_shaders.insert(tempKey, theShader); + } else { + if (!theShader.isNull()) + errors += theShader->errorMessage(); + } } else { QByteArray loadVertexData; QByteArray loadFragmentData; @@ -765,16 +770,17 @@ void QSSGShaderCache::importShaderCache(const QByteArray &shaderCache, QByteArra if (!loadVertexData.isEmpty() && (!loadFragmentData.isEmpty() || !loadGeometryData.isEmpty())) { - QByteArray error; QSSGRenderVertFragCompilationResult result = m_renderContext->compileSource(key, QSSGByteView(loadVertexData), QSSGByteView(loadFragmentData), QSSGByteView(loadTessControlData), QSSGByteView(loadTessControlData), QSSGByteView(loadGeometryData)); - theShader = result.m_shader; - if (theShader.isNull()) - errors += theShader->errorMessage(); - else + if (result.m_success) { + theShader = result.m_shader; m_shaders.insert(tempKey, theShader); + } else { + if (!theShader.isNull()) + errors += theShader->errorMessage(); + } } } // If something doesn't save or load correctly, get the runtime to re-generate. diff --git a/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp b/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp index 6fd7ddbd..3bafeddb 100644 --- a/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp +++ b/src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp @@ -432,8 +432,9 @@ void setupCameraForShadowMap(const QVector2D &/*inCameraVec*/, if (scenePoints) { QSSGBounds3 sceneBounds = calculateShadowCameraBoundingBox(scenePoints, forward, up, right); - if (sceneBounds.extents().x() * sceneBounds.extents().y() * sceneBounds.extents().z() - < bounds.extents().x() * bounds.extents().y() * bounds.extents().z()) { + if (sceneBounds.isFinite() && (sceneBounds.extents().x() * sceneBounds.extents().y() + * sceneBounds.extents().z() < bounds.extents().x() + * bounds.extents().y() * bounds.extents().z())) { bounds = sceneBounds; inLightPos = sceneCtr; } diff --git a/src/runtimerender/resourcemanager/qssgrenderloadedtexture.cpp b/src/runtimerender/resourcemanager/qssgrenderloadedtexture.cpp index c46e7a58..ad7c37da 100644 --- a/src/runtimerender/resourcemanager/qssgrenderloadedtexture.cpp +++ b/src/runtimerender/resourcemanager/qssgrenderloadedtexture.cpp @@ -54,6 +54,8 @@ QSSGRef<QSSGLoadedTexture> QSSGLoadedTexture::loadQImage(const QString &inPath, QImage image(inPath); if (inFormat == QSSGRenderTextureFormat::Unknown) { switch (image.format()) { + case QImage::Format_Mono: + case QImage::Format_MonoLSB: case QImage::Format_Indexed8: // Convert palleted images image.convertTo(QImage::Format_RGBA8888_Premultiplied); break; |