summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/runtime/Qt3DSActivationManager.cpp28
-rw-r--r--src/runtime/Qt3DSActivationManager.h2
-rw-r--r--src/runtime/Qt3DSElementSystem.h13
-rw-r--r--src/runtime/Qt3DSKernelTypes.h1
-rw-r--r--src/runtime/Qt3DSQmlEngine.cpp13
-rw-r--r--src/uipparser/Qt3DSUIPParserImpl.cpp3
6 files changed, 55 insertions, 5 deletions
diff --git a/src/runtime/Qt3DSActivationManager.cpp b/src/runtime/Qt3DSActivationManager.cpp
index a976032..7015a61 100644
--- a/src/runtime/Qt3DSActivationManager.cpp
+++ b/src/runtime/Qt3DSActivationManager.cpp
@@ -190,6 +190,7 @@ struct STimeContext
TTimeEventList m_TimeEventBackingStore;
TTimeEventList m_TimeEvents;
SActivationManagerNodeDirtyList m_DirtyList;
+ SActivationManagerNodeDirtyList m_ControlledList;
QT3DSU32 m_TimeEventBackingStoreIndex;
QT3DSI32 mRefCount;
STimeContext *m_NextSibling;
@@ -207,6 +208,7 @@ struct STimeContext
, m_TimeEventBackingStore(alloc, "TimeEventBackingStore")
, m_TimeEvents(alloc, "TimeEvents")
, m_DirtyList(alloc)
+ , m_ControlledList(alloc)
, m_TimeEventBackingStoreIndex(0)
, mRefCount(0)
, m_NextSibling(NULL)
@@ -493,6 +495,11 @@ struct STimeContext
}
}
+ void setControlled(TActivityItem &item)
+ {
+ m_ControlledList.insert(item);
+ }
+
static void UpdateItemScriptStatus(SElement &inNode, bool activeAndHasScript,
TElementAndSortKeyList &scriptBuffer)
{
@@ -542,7 +549,9 @@ struct STimeContext
static void RunActivateScan(SElement &inNode, TScanBuffer &inScanBuffer,
TElementAndSortKeyList &activateBuffer,
TElementAndSortKeyList &deactivateBuffer,
- TElementAndSortKeyList &scriptBuffer, Mutex &inElementAccessMutex,
+ TElementAndSortKeyList &scriptBuffer,
+ SActivationManagerNodeDirtyList &controlledList,
+ Mutex &inElementAccessMutex,
bool &scriptBufferRequiresSort, bool inRunFullScan)
{
inScanBuffer.clear();
@@ -563,7 +572,10 @@ struct STimeContext
QT3DS_ASSERT(theScanNode->IsIndependent() == false);
bool parentActive = theEntry.IsParentActive();
bool wasActive = theScanNode->IsGlobalActive();
- bool isActive = theScanNode->IsGlobalActive(parentActive);
+
+ // Override visibility for master slide elements that have datainput eyeball controller.
+ bool isActive = (controlledList.contains(*theScanNode) && theScanNode->m_OnMaster)
+ ? theScanNode->IsControlledActive() : theScanNode->IsGlobalActive(parentActive);
bool wasChildDirty = theScanNode->m_ActivationManagerNode.m_Flags.IsChildDirty();
theScanNode->m_ActivationManagerNode.m_Flags.ClearChildDirty();
bool activateChange = isActive != wasActive;
@@ -576,6 +588,10 @@ struct STimeContext
if (checkChildren && theScanNode->m_Child) {
for (SElement *theScanNodeChild = theScanNode->m_Child; theScanNodeChild;
theScanNodeChild = theScanNodeChild->m_Sibling) {
+ // Override visibility for master slide elements that have datainput
+ // eyeball controller.
+ if (controlledList.contains(*theScanNodeChild) && theScanNodeChild->m_OnMaster)
+ theScanNodeChild->SetExplicitActive(theScanNodeChild->IsControlledActive());
if (theScanNodeChild->IsIndependent() == false)
inScanBuffer.push_back(SScanBufferEntry(theScanNodeChild, isActive));
}
@@ -612,7 +628,8 @@ struct STimeContext
// dirty list.
// This case has got to be extremely rare in practice, however.
RunActivateScan(dirtyNode, inScanBuffer, activateBuffer, deactivateBuffer, scriptBuffer,
- m_ElementAccessMutex, scriptBufferRequiresSort, m_AllNodesDirty);
+ m_ControlledList, m_ElementAccessMutex, scriptBufferRequiresSort,
+ m_AllNodesDirty);
}
// Set at end so while debugging you can see if all nodes were dirty on method entry.
m_AllNodesDirty = false;
@@ -995,6 +1012,11 @@ struct SActivityZone : public IActivityZone
{
GetItemTimeContext(inItem).GoToTime(inTime);
}
+
+ void setControlled(TActivityItem inItem) override
+ {
+ GetItemTimeContext(inItem).setControlled(inItem);
+ }
};
struct SActivityZoneManager : public IActivityZoneManager
diff --git a/src/runtime/Qt3DSActivationManager.h b/src/runtime/Qt3DSActivationManager.h
index f343ac9..48f5d4c 100644
--- a/src/runtime/Qt3DSActivationManager.h
+++ b/src/runtime/Qt3DSActivationManager.h
@@ -140,6 +140,8 @@ namespace runtime {
virtual void EndUpdate() = 0;
virtual void GoToTime(TActivityItem item, TTimeUnit inTime) = 0;
+
+ virtual void setControlled(TActivityItem item) = 0;
};
class IActivityZoneManager : public NVRefCounted
diff --git a/src/runtime/Qt3DSElementSystem.h b/src/runtime/Qt3DSElementSystem.h
index 15895c0..2784420 100644
--- a/src/runtime/Qt3DSElementSystem.h
+++ b/src/runtime/Qt3DSElementSystem.h
@@ -201,7 +201,10 @@ namespace runtime {
{
return this->operator&(Q3DStudio::ELEMENTFLAG_EXPLICITACTIVE);
}
-
+ bool IsControlledActive() const
+ {
+ return this->operator&(Q3DStudio::ELEMENTFLAG_CONTROLLED_ACTIVE);
+ }
void SetActive(bool inValue)
{
clearOrSet(inValue, Q3DStudio::ELEMENTFLAG_GLOBALACTIVE);
@@ -283,6 +286,7 @@ namespace runtime {
SElement *m_Parent; ///< Parent element in activity graph
SElement *m_Sibling; ///< Next sibling element in activity graph
SElement *m_Child; ///< First child element in activity graph
+ bool m_OnMaster = false;
void *m_Association; ///< Link to associated asset in scene
Q3DStudio::IPresentation *m_BelongedPresentation;
SActivationManagerNode m_ActivationManagerNode;
@@ -429,6 +433,13 @@ namespace runtime {
}
bool IsExplicitActive() const { return m_Flags.IsExplicitActive(); }
+ void SetControlledActive(bool inValue)
+ {
+ SetFlag(Q3DStudio::ELEMENTFLAG_CONTROLLED_ACTIVE, inValue);
+ }
+
+ bool IsControlledActive() const { return m_Flags.IsControlledActive(); }
+
// Flag set by the activity manager.
void SetActive(bool inValue) { SetFlag(Q3DStudio::ELEMENTFLAG_GLOBALACTIVE, inValue); }
bool GetActive() const { return m_Flags.IsActive(); }
diff --git a/src/runtime/Qt3DSKernelTypes.h b/src/runtime/Qt3DSKernelTypes.h
index 0ad4ec6..bc13230 100644
--- a/src/runtime/Qt3DSKernelTypes.h
+++ b/src/runtime/Qt3DSKernelTypes.h
@@ -143,6 +143,7 @@ enum EElementFlag {
// Flags used by the activation manager
ELEMENTFLAG_AMGR_TIMEACTIVE = 1 << 13, ///< Is the element alive according to time information
+ ELEMENTFLAG_CONTROLLED_ACTIVE = 1 << 14
};
// Four byte aligned time unit structure.
diff --git a/src/runtime/Qt3DSQmlEngine.cpp b/src/runtime/Qt3DSQmlEngine.cpp
index 3ef4b11..0bfddba 100644
--- a/src/runtime/Qt3DSQmlEngine.cpp
+++ b/src/runtime/Qt3DSQmlEngine.cpp
@@ -921,10 +921,21 @@ void CQmlEngineImpl::SetDataInputValue(
<< diDef.type;
break;
}
-
SetAttribute(ctrlElem.elementPath.constData(),
ctrlElem.attributeName.first().constData(),
reinterpret_cast<const char *>(&valueBool));
+
+ // Special case for eyeball (visibility) controller that targets elements
+ // on master slide, and whose visibility setting must be persistent over
+ // slide changes.
+ TElement *element = getTarget(ctrlElem.elementPath.constData());
+ auto hash = CHash::HashAttribute(ctrlElem.attributeName.first().constData());
+
+ if (hash == Q3DStudio::ATTRIBUTE_EYEBALL && element->m_OnMaster) {
+ element->GetActivityZone().setControlled(*element);
+ element->SetControlledActive(valueBool);
+ }
+
break;
}
case ATTRIBUTETYPE_STRING: {
diff --git a/src/uipparser/Qt3DSUIPParserImpl.cpp b/src/uipparser/Qt3DSUIPParserImpl.cpp
index 60e4317..80187bf 100644
--- a/src/uipparser/Qt3DSUIPParserImpl.cpp
+++ b/src/uipparser/Qt3DSUIPParserImpl.cpp
@@ -2148,6 +2148,9 @@ BOOL CUIPParserImpl::LoadSlideElementAttrs(IPresentation &inPresentation, bool m
TPropertyDescAndValueList theAttributeList;
+ if (masterSlide)
+ inElementData.m_Element->m_OnMaster = true;
+
const char8_t *theRef = "";
inReader.Att("ref", theRef);
if (theRef && *theRef && theRef[0] == '#')