diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2017-11-29 11:07:06 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2017-11-29 10:35:55 +0000 |
commit | 75df296197cb333c60a6ce61cc1080ab72d51542 (patch) | |
tree | 234512bc49796a53d609ce65397ce7cd1ce2119c | |
parent | 746138a1c600b1b3ebe6bfe31617627d2c4e16ef (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.cpp | 6 | ||||
-rw-r--r-- | src/Viewer/studio3d/q3dscommandqueue.cpp | 35 |
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) { |