aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTarja Sundqvist <tarja.sundqvist@qt.io>2022-05-19 07:51:27 +0300
committerTarja Sundqvist <tarja.sundqvist@qt.io>2022-05-19 07:51:27 +0300
commitd8345b03d800ff30781f32ed04dcf74758f8869b (patch)
tree7d699bd2db2af93ac9865dc6852bf35051dffab9
parentc8f225c4d61b1fd3afa048db93f2e2294896a36f (diff)
parente4152112a0bec462271472ab975052dfec35c1d0 (diff)
Merge remote-tracking branch 'origin/tqtc/lts-5.15.5' into tqtc/lts-5.15-opensourcev5.15.5-lts-lgpl
-rw-r--r--.qmake.conf2
-rw-r--r--src/assetimport/qssgassetimportmanager.cpp12
-rw-r--r--src/imports/effectlib/designer/IdComboBox.qml6
-rw-r--r--src/imports/quick3d/designer/IdComboBox.qml6
-rw-r--r--src/quick3d/qquick3dcustommaterial.cpp8
-rw-r--r--src/quick3d/qquick3deffect.cpp8
-rw-r--r--src/quick3d/qquick3dscenerenderer.cpp2
-rw-r--r--src/quick3d/qquick3dshaderutils.cpp22
-rw-r--r--src/quick3d/qquick3dshaderutils_p.h50
-rw-r--r--src/quick3d/qquick3dviewport.cpp12
-rw-r--r--src/render/qssgrenderbasetypes_p.h1
-rw-r--r--src/render/qssgrendershaderprogram.cpp4
-rw-r--r--src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp28
-rw-r--r--src/runtimerender/qssgrendershadercache.cpp24
-rw-r--r--src/runtimerender/rendererimpl/qssgrendererimpllayerrenderdata.cpp5
-rw-r--r--src/runtimerender/resourcemanager/qssgrenderloadedtexture.cpp2
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;