summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2017-11-29 11:07:06 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2017-11-29 10:35:55 +0000
commit75df296197cb333c60a6ce61cc1080ab72d51542 (patch)
tree234512bc49796a53d609ce65397ce7cd1ce2119c
parent746138a1c600b1b3ebe6bfe31617627d2c4e16ef (diff)
Make sure queued commands are not lost before processingv1.0.0
Sometimes synchronize would come twice before commands were processed, typically in cases where studio runtime's animation timer triggered the drawing rather than QML update. The second synchronize would overwrite command queue. Now synchronize only appends to command queue and it is cleared only when it is processed. Task-number: QT3DS-580 Change-Id: I252f89f76bc428eb5e0d577f20a2500b2a19f520 Reviewed-by: Janne Koskinen <janne.p.koskinen@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
-rw-r--r--src/Viewer/qmlviewer/Qt3DSRenderer.cpp6
-rw-r--r--src/Viewer/studio3d/q3dscommandqueue.cpp35
2 files changed, 23 insertions, 18 deletions
diff --git a/src/Viewer/qmlviewer/Qt3DSRenderer.cpp b/src/Viewer/qmlviewer/Qt3DSRenderer.cpp
index 2f9f98b9..19293cb9 100644
--- a/src/Viewer/qmlviewer/Qt3DSRenderer.cpp
+++ b/src/Viewer/qmlviewer/Qt3DSRenderer.cpp
@@ -232,8 +232,10 @@ void Q3DSRenderer::onUpdateHandler(void *userData)
*/
void Q3DSRenderer::processCommands()
{
- if (!m_runtime)
+ if (!m_runtime) {
+ m_commands.clear();
return;
+ }
if (m_commands.m_visibleChanged)
m_visibleFlag = m_commands.m_visible;
@@ -325,6 +327,8 @@ void Q3DSRenderer::processCommands()
qWarning() << __FUNCTION__ << "Unrecognized CommandType in command list!";
}
}
+
+ m_commands.clear();
}
QT_END_NAMESPACE
diff --git a/src/Viewer/studio3d/q3dscommandqueue.cpp b/src/Viewer/studio3d/q3dscommandqueue.cpp
index cf7bd3f9..9882fea6 100644
--- a/src/Viewer/studio3d/q3dscommandqueue.cpp
+++ b/src/Viewer/studio3d/q3dscommandqueue.cpp
@@ -138,31 +138,32 @@ ElementCommand &CommandQueue::queueRequest(const QString &elementPath, CommandTy
void CommandQueue::copyCommands(const CommandQueue &fromQueue)
{
- m_visibleChanged = fromQueue.m_visibleChanged;
- m_scaleModeChanged = fromQueue.m_scaleModeChanged;
- m_shadeModeChanged = fromQueue.m_shadeModeChanged;
- m_showRenderStatsChanged = fromQueue.m_showRenderStatsChanged;
- m_matteColorChanged = fromQueue.m_matteColorChanged;
- m_sourceChanged = fromQueue.m_sourceChanged;
- m_globalAnimationTimeChanged = fromQueue.m_globalAnimationTimeChanged;
-
- if (m_visibleChanged)
+ m_visibleChanged = m_visibleChanged || fromQueue.m_visibleChanged;
+ m_scaleModeChanged = m_scaleModeChanged || fromQueue.m_scaleModeChanged;
+ m_shadeModeChanged = m_shadeModeChanged || fromQueue.m_shadeModeChanged;
+ m_showRenderStatsChanged = m_showRenderStatsChanged || fromQueue.m_showRenderStatsChanged;
+ m_matteColorChanged = m_matteColorChanged || fromQueue.m_matteColorChanged;
+ m_sourceChanged = m_sourceChanged || fromQueue.m_sourceChanged;
+ m_globalAnimationTimeChanged
+ = m_globalAnimationTimeChanged || fromQueue.m_globalAnimationTimeChanged;
+
+ if (fromQueue.m_visibleChanged)
m_visible = fromQueue.m_visible;
- if (m_scaleModeChanged)
+ if (fromQueue.m_scaleModeChanged)
m_scaleMode = fromQueue.m_scaleMode;
- if (m_shadeModeChanged)
+ if (fromQueue.m_shadeModeChanged)
m_shadeMode = fromQueue.m_shadeMode;
- if (m_showRenderStatsChanged)
+ if (fromQueue.m_showRenderStatsChanged)
m_showRenderStats = fromQueue.m_showRenderStats;
- if (m_matteColorChanged)
+ if (fromQueue.m_matteColorChanged)
m_matteColor = fromQueue.m_matteColor;
- if (m_sourceChanged)
+ if (fromQueue.m_sourceChanged)
m_source = fromQueue.m_source;
- if (m_globalAnimationTimeChanged)
+ if (fromQueue.m_globalAnimationTimeChanged)
m_globalAnimationTime = fromQueue.m_globalAnimationTime;
- m_size = 0;
-
+ // Pending queue may be synchronized multiple times between queue processing, so let's append
+ // to the existing queue rather than clearing it.
for (int i = 0; i < fromQueue.m_size; i++) {
const ElementCommand &source = fromQueue.commandAt(i);
switch (source.m_commandType) {