/**************************************************************************** ** ** Copyright (C) 1993-2009 NVIDIA Corporation. ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt 3D Studio. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "Qt3DSDMPrefix.h" #include "StudioFullSystem.h" #include "StudioCoreSystem.h" #include "StudioPropertySystem.h" #include "SlideSystem.h" #include "StudioAnimationSystem.h" #include "ActionSystem.h" #include "SignalsImpl.h" #include "SimpleDataCore.h" #include "SimpleSlideCore.h" #include "SimpleSlideGraphCore.h" #include "SimpleAnimationCore.h" #include "DataCoreProducer.h" #include "SlideCoreProducer.h" #include "SlideGraphCoreProducer.h" #include "ActionCoreProducer.h" using namespace std; namespace qt3dsdm { template inline void NotifyConsumer(TTransactionConsumerPtr inConsumer, TDoTransaction inDoNotification, TUndoTransaction inUndoNotification) { if (inConsumer) { inConsumer->OnDoNotification(inDoNotification); inConsumer->OnUndoNotification(inUndoNotification); } else { inDoNotification(); // No consumer, send notification right away } } void NotifySlideCreated(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendSlideCreated, inSender, inSlide), bind(&IStudioFullSystemSignalSender::SendSlideDeleted, inSender, inSlide)); } void NotifySlideDeleted(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendSlideDeleted, inSender, inSlide), bind(&IStudioFullSystemSignalSender::SendSlideCreated, inSender, inSlide)); } void NotifySlideRearranged(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide, int inOldIndex, int inNewIndex) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendSlideRearranged, inSender, inSlide, inOldIndex, inNewIndex), bind(&IStudioFullSystemSignalSender::SendSlideRearranged, inSender, inSlide, inNewIndex, inOldIndex)); } void SendInstancePropertyValueChanged(TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) { // Ignore when the instance is not an instance (undoing an add operation may create this, as // transactions are run first and notifications second). if (inCore->IsInstance(inInstance)) inSender->SendInstancePropertyValue(inInstance, inProperty); } void NotifyInstancePropertyChanged(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, bool inIsAggregate) { if (inConsumer) { if (inIsAggregate == false) { NotifyConsumer( inConsumer, bind(SendInstancePropertyValueChanged, inCore, inSender, inInstance, inProperty), bind(SendInstancePropertyValueChanged, inCore, inSender, inInstance, inProperty)); } } else { SendInstancePropertyValueChanged(inCore, inSender, inInstance, inProperty); } } void RunAnimations(IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, Qt3DSDMSlideHandle inSlide, TAnimationCorePtr inAnimationCore, TDataCorePtr inDataCore, TTransactionConsumerPtr &inConsumer) { TAnimationInfoList theAnimations; inAnimationCore->GetAnimations(theAnimations, inMaster, inSlide); size_t theEnd = theAnimations.size(); for (size_t theIndex = 0; theIndex < theEnd; ++theIndex) { SAnimationInfo &theInfo(theAnimations[theIndex]); NotifyInstancePropertyChanged(inConsumer, inDataCore, inSender, theInfo.m_Instance, theInfo.m_Property, false); } } void NotifyComponentSeconds(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide, TDataCorePtr inCore, TAnimationCorePtr inAnimationCore, TStudioAnimationSystemPtr inAnimationSystem, TSlideSystemPtr inSlideSystem) { Qt3DSDMSlideHandle theMaster = inSlideSystem->GetMasterSlide(inSlide); NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendBeginComponentSeconds, inSender, theMaster), bind(&IStudioFullSystemSignalSender::SendComponentSeconds, inSender, theMaster)); RunAnimations(inSender, theMaster, inSlide, inAnimationCore, inCore, inConsumer); dynamic_cast(inAnimationSystem.get()) ->ClearTemporaryAnimationValues(); NotifyConsumer( inConsumer, bind(&IStudioFullSystemSignalSender::SendComponentSeconds, inSender, theMaster), bind(&IStudioFullSystemSignalSender::SendBeginComponentSeconds, inSender, theMaster)); } void NotifyPropertyLinked(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, bool inAggregate) { if (inAggregate == false) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendPropertyLinked, inSender, inMaster, inInstance, inProperty), bind(&IStudioFullSystemSignalSender::SendPropertyUnlinked, inSender, inMaster, inInstance, inProperty)); NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty, inAggregate); } } void NotifyPropertyUnlinked(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, bool inAggregate) { if (inAggregate == false) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendPropertyUnlinked, inSender, inMaster, inInstance, inProperty), bind(&IStudioFullSystemSignalSender::SendPropertyLinked, inSender, inMaster, inInstance, inProperty)); NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty, inAggregate); } } void NotifyActiveSlide(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, int /*inIndex*/, Qt3DSDMSlideHandle inOldSlide, Qt3DSDMSlideHandle inNewSlide, TAnimationCorePtr inAnimationCore, TSlideSystemPtr inSlideSystem) { TInstancePropertyPairList thePropertyList; inSlideSystem->GetUnionOfProperties(inOldSlide, inNewSlide, thePropertyList); for (size_t idx = 0, end = thePropertyList.size(); idx < end; ++idx) NotifyInstancePropertyChanged(inConsumer, inCore, inSender, thePropertyList[idx].first, thePropertyList[idx].second, false); RunAnimations(inSender, inMaster, inNewSlide, inAnimationCore, inCore, inConsumer); } void NotifyAnimationCreated(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMAnimationHandle inAnimation, Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, bool inIsAggregate) { if (!inIsAggregate) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendAnimationCreated, inSender, inAnimation, inInstance, inProperty), bind(&IStudioFullSystemSignalSender::SendAnimationDeleted, inSender, inAnimation, inInstance, inProperty)); } } void NotifyAnimationDeleted(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMAnimationHandle inAnimation, Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendAnimationDeleted, inSender, inAnimation, inInstance, inProperty), bind(&IStudioFullSystemSignalSender::SendAnimationCreated, inSender, inAnimation, inInstance, inProperty)); NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty, false); } void NotifyAnimationChanged(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMAnimationHandle inAnimation, TAnimationCorePtr inAnimationCore, bool inIsAggregate) { if (!inIsAggregate) { SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation)); NotifyInstancePropertyChanged(inConsumer, inCore, inSender, theInfo.m_Instance, theInfo.m_Property, inIsAggregate); } } void NotifyKeyframeInserted(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe, TAnimationCorePtr inAnimationCore, bool inIsAggregate) { if (!inIsAggregate) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, inSender, inAnimation, inKeyframe), bind(&IStudioFullSystemSignalSender::SendKeyframeErased, inSender, inAnimation, inKeyframe)); NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false); } } void NotifyKeyframeErased(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe, TAnimationCorePtr inAnimationCore) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendKeyframeErased, inSender, inAnimation, inKeyframe), bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, inSender, inAnimation, inKeyframe)); NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false); } void NotifyKeyframeUpdated(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMKeyframeHandle inKeyframe, TAnimationCorePtr inAnimationCore) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendKeyframeUpdated, inSender, inKeyframe), bind(&IStudioFullSystemSignalSender::SendKeyframeUpdated, inSender, inKeyframe)); Qt3DSDMAnimationHandle theAnimation(inAnimationCore->GetAnimationForKeyframe(inKeyframe)); NotifyAnimationChanged(inConsumer, inCore, inSender, theAnimation, inAnimationCore, false); } void NotifyConnectFirstKeyframeDynamicSet(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, Qt3DSDMAnimationHandle inAnimation, bool inDynamic, TAnimationCorePtr inAnimationCore) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendConnectFirstKeyframeDynamicSet, inSender, inAnimation, inDynamic), bind(&IStudioFullSystemSignalSender::SendConnectFirstKeyframeDynamicSet, inSender, inAnimation, inDynamic)); NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false); } inline ISlideCoreSignalProvider *GetSlideSignaller(TSlideCorePtr inSlideCore) { return dynamic_cast(inSlideCore.get()); } void NotifyInstanceCreated(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle instance) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendInstanceCreated, inSender, instance), bind(&IStudioFullSystemSignalSender::SendInstanceDeleted, inSender, instance)); } void NotifyInstanceDeleted(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle instance) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendInstanceDeleted, inSender, instance), bind(&IStudioFullSystemSignalSender::SendInstanceCreated, inSender, instance)); } void NotifyActionCreated(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendActionCreated, inSender, inAction, inSlide, inInstance), bind(&IStudioFullSystemSignalSender::SendActionDeleted, inSender, inAction, inSlide, inInstance)); } void NotifyActionDestroyed(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance) { NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendActionDeleted, inSender, inAction, inSlide, inInstance), bind(&IStudioFullSystemSignalSender::SendActionCreated, inSender, inAction, inSlide, inInstance)); } void SendActionEvent(Qt3DSDMActionHandle inAction, TActionCorePtr inCore, function inFunction) { if (inCore->HandleValid(inAction)) inFunction(); } void NotifyTriggerObjectSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, TActionCorePtr inCore) { function theFunc( bind(&IStudioFullSystemSignalSender::SendTriggerObjectSet, inSender, inAction)); NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), bind(SendActionEvent, inAction, inCore, theFunc)); } void NotifyTargetObjectSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, TActionCorePtr inCore) { function theFunc( bind(&IStudioFullSystemSignalSender::SendTargetObjectSet, inSender, inAction)); NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), bind(SendActionEvent, inAction, inCore, theFunc)); } void NotifyEventSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, TActionCorePtr inCore) { function theFunc( bind(&IStudioFullSystemSignalSender::SendEventSet, inSender, inAction)); NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), bind(SendActionEvent, inAction, inCore, theFunc)); } void NotifyHandlerSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, TActionCorePtr inCore) { function theFunc( bind(&IStudioFullSystemSignalSender::SendHandlerSet, inSender, inAction)); NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), bind(SendActionEvent, inAction, inCore, theFunc)); } void NotifyHandlerArgumentValueSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, Qt3DSDMHandlerArgHandle inAction, TActionCorePtr inCore) { function theFunc( bind(&IStudioFullSystemSignalSender::SendHandlerArgumentValueSet, inSender, inAction)); Qt3DSDMActionHandle theActionHdl(inCore->GetHandlerArgumentInfo(inAction).m_Action); NotifyConsumer(inConsumer, bind(SendActionEvent, theActionHdl, inCore, theFunc), bind(SendActionEvent, theActionHdl, inCore, theFunc)); } void NotifyAllKeyframesErased(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, TAnimationCorePtr inAnimationCore, Qt3DSDMAnimationHandle inAnimation) { if (inConsumer) { TKeyframeHandleList theKeyframes; inAnimationCore->GetKeyframes(inAnimation, theKeyframes); for (size_t idx = 0, end = theKeyframes.size(); idx < end; ++idx) { inConsumer->OnDoNotification(bind(&IStudioFullSystemSignalSender::SendKeyframeErased, inSender, inAnimation, theKeyframes[idx])); inConsumer->OnUndoNotification( bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, inSender, inAnimation, theKeyframes[idx])); } } } CStudioFullSystem::CStudioFullSystem(std::shared_ptr inCoreSystem, Qt3DSDMInstanceHandle inSlideInstance, Qt3DSDMPropertyHandle inComponentGuidProperty, Qt3DSDMInstanceHandle inActionInstance, Qt3DSDMPropertyHandle inActionEyeball) : m_CoreSystem(inCoreSystem) , m_SlideSystem(new SSlideSystem(m_CoreSystem->GetDataCore(), m_CoreSystem->GetSlideCore(), m_CoreSystem->GetSlideGraphCore(), m_CoreSystem->GetAnimationCore(), inSlideInstance, inComponentGuidProperty)) , m_ActionSystem(new CActionSystem(m_CoreSystem->GetDataCore(), m_CoreSystem->GetSlideCore(), m_CoreSystem->GetSlideGraphCore(), m_CoreSystem->GetActionCore(), m_SlideSystem, inActionInstance, inActionEyeball)) , m_AggregateOperation(false) { // TODO: Too many parameters passed in to the subsystem. Just make them know about FullSystem so // they can get whatever they want CStudioAnimationSystem *theAnimationSystem = new CStudioAnimationSystem( m_PropertySystem, m_SlideSystem, m_CoreSystem->GetSlideCore(), m_CoreSystem->GetSlideGraphCore(), m_CoreSystem->GetAnimationCore()); m_AnimationSystem = std::shared_ptr(theAnimationSystem); m_PropertySystem = std::shared_ptr( new CStudioPropertySystem(m_CoreSystem->GetNewMetaData(), m_CoreSystem->GetDataCore(), m_SlideSystem, m_AnimationSystem)); theAnimationSystem->SetPropertySystem(m_PropertySystem); TDataCorePtr dataCore(m_CoreSystem->GetDataCore()); static_cast(m_SlideSystem.get())->SetPropertySystem(m_PropertySystem); ISlideSystemSignalProvider *theSlideSignaller = dynamic_cast(m_SlideSystem.get())->GetSignalProvider(); m_Signaller = CreateStudioFullSystemSignaller(theSlideSignaller); IStudioFullSystemSignalSender *theSystemSender = dynamic_cast(m_Signaller.get()); m_Connections.push_back(theSlideSignaller->ConnectSlideRearranged( bind(NotifySlideRearranged, ref(m_Consumer), theSystemSender, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))); m_Connections.push_back(theSlideSignaller->ConnectPropertyLinked( bind(NotifyPropertyLinked, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::cref(m_AggregateOperation)))); m_Connections.push_back(theSlideSignaller->ConnectPropertyUnlinked( bind(NotifyPropertyUnlinked, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::cref(m_AggregateOperation)))); m_Connections.push_back(theSlideSignaller->ConnectActiveSlide( bind(NotifyActiveSlide, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, GetAnimationCore(), GetSlideSystem()))); IDataCoreSignalProvider *theDataSignals = dynamic_cast(m_CoreSystem->GetDataCore().get()); m_Connections.push_back(theDataSignals->ConnectInstanceCreated( bind(NotifyInstanceCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1))); m_Connections.push_back(theDataSignals->ConnectInstanceDeleted( bind(NotifyInstanceDeleted, ref(m_Consumer), theSystemSender, std::placeholders::_1))); ISlideCoreSignalProvider *theSlideCoreSignaller = dynamic_cast(m_CoreSystem->GetSlideCore().get()); m_Connections.push_back(theSlideCoreSignaller->ConnectInstancePropertyValueSet( bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_2, std::placeholders::_3, std::cref(m_AggregateOperation)))); m_Connections.push_back(theSlideCoreSignaller->ConnectSlideTimeChanged( bind(NotifyComponentSeconds, ref(m_Consumer), theSystemSender, std::placeholders::_1, dataCore, GetAnimationCore(), GetAnimationSystem(), GetSlideSystem()))); m_Connections.push_back(theSlideCoreSignaller->ConnectSlideCreated( bind(NotifySlideCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1))); m_Connections.push_back(theSlideCoreSignaller->ConnectSlideDeleted( bind(NotifySlideDeleted, ref(m_Consumer), theSystemSender, std::placeholders::_1))); IAnimationCoreSignalProvider *theAnimationSignals = dynamic_cast(GetAnimationCore().get()); m_Connections.push_back(theAnimationSignals->ConnectAnimationCreated( bind(NotifyAnimationCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1, std::placeholders::_3, std::placeholders::_4, std::cref(m_AggregateOperation)))); m_Connections.push_back(theAnimationSignals->ConnectAnimationDeleted( bind(NotifyAnimationDeleted, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_3, std::placeholders::_4))); m_Connections.push_back(theAnimationSignals->ConnectKeyframeInserted( bind(NotifyKeyframeInserted, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, GetAnimationCore(), std::cref(m_AggregateOperation)))); m_Connections.push_back(theAnimationSignals->ConnectKeyframeErased( bind(NotifyKeyframeErased, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, GetAnimationCore()))); m_Connections.push_back(theAnimationSignals->ConnectKeyframeUpdated( bind(NotifyKeyframeUpdated, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, GetAnimationCore()))); m_Connections.push_back(theAnimationSignals->ConnectFirstKeyframeDynamicSet( bind(NotifyConnectFirstKeyframeDynamicSet, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, GetAnimationCore()))); m_Connections.push_back(theAnimationSignals->ConnectBeforeAllKeyframesErased( bind(NotifyAllKeyframesErased, ref(m_Consumer), theSystemSender, GetAnimationCore(), std::placeholders::_1))); IInstancePropertyCoreSignalProvider *thePropertyCoreSignaller = dynamic_cast(m_PropertySystem.get()) ->GetPropertyCoreSignalProvider(); m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue( bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, std::cref(m_AggregateOperation)))); thePropertyCoreSignaller = dynamic_cast(m_PropertySystem.get()) ->GetImmediatePropertyCoreSignalProvider(); m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue( bind(&IStudioFullSystemSignalSender::SendInstancePropertyValue, theSystemSender, std::placeholders::_1, std::placeholders::_2))); thePropertyCoreSignaller = dynamic_cast(m_CoreSystem->GetDataCore().get()); m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue( bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender, std::placeholders::_1, std::placeholders::_2, std::cref(m_AggregateOperation)))); IActionCoreSignalProvider *theActionSignals = dynamic_cast(m_CoreSystem->GetActionCore().get()); m_Connections.push_back(theActionSignals->ConnectTriggerObjectSet( bind(NotifyTriggerObjectSet, ref(m_Consumer), theSystemSender, std::placeholders::_1, GetActionCore()))); m_Connections.push_back(theActionSignals->ConnectTargetObjectSet( bind(NotifyTargetObjectSet, ref(m_Consumer), theSystemSender, std::placeholders::_1, GetActionCore()))); m_Connections.push_back(theActionSignals->ConnectEventSet( bind(NotifyEventSet, ref(m_Consumer), theSystemSender, std::placeholders::_1, GetActionCore()))); m_Connections.push_back(theActionSignals->ConnectHandlerSet( bind(NotifyHandlerSet, ref(m_Consumer), theSystemSender, std::placeholders::_1, GetActionCore()))); m_Connections.push_back(theActionSignals->ConnectHandlerArgumentValueSet(bind( NotifyHandlerArgumentValueSet, ref(m_Consumer), theSystemSender, std::placeholders::_1, GetActionCore()))); IActionSystemSignalProvider *theActionSystemSignals = dynamic_cast(m_ActionSystem.get())->GetSignalProvider(); m_Connections.push_back(theActionSystemSignals->ConnectActionCreated( bind(NotifyActionCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))); m_Connections.push_back(theActionSystemSignals->ConnectActionDeleted( bind(NotifyActionDestroyed, ref(m_Consumer), theSystemSender, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))); } CStudioFullSystem::~CStudioFullSystem() { } std::shared_ptr CStudioFullSystem::GetPropertySystem() { return m_PropertySystem; } std::shared_ptr CStudioFullSystem::GetSlideSystem() { return m_SlideSystem; } std::shared_ptr CStudioFullSystem::GetSlideCore() { return m_CoreSystem->GetSlideCore(); } std::shared_ptr CStudioFullSystem::GetAnimationCore() { return m_CoreSystem->GetAnimationCore(); } std::shared_ptr CStudioFullSystem::GetAnimationSystem() { return m_AnimationSystem; } std::shared_ptr CStudioFullSystem::GetActionCore() { return m_CoreSystem->GetActionCore(); } std::shared_ptr CStudioFullSystem::GetActionSystem() { return m_ActionSystem; } std::shared_ptr CStudioFullSystem::GetPropertySystem() const { return m_PropertySystem; } std::shared_ptr CStudioFullSystem::GetSlideSystem() const { return m_SlideSystem; } std::shared_ptr CStudioFullSystem::GetSlideCore() const { return m_CoreSystem->GetSlideCore(); } std::shared_ptr CStudioFullSystem::GetAnimationCore() const { return m_CoreSystem->GetAnimationCore(); } std::shared_ptr CStudioFullSystem::GetAnimationSystem() const { return m_AnimationSystem; } std::shared_ptr CStudioFullSystem::GetActionCore() const { return m_CoreSystem->GetActionCore(); } std::shared_ptr CStudioFullSystem::GetActionSystem() const { return m_ActionSystem; } std::shared_ptr CStudioFullSystem::GetCoreSystem() { return m_CoreSystem; } bool CStudioFullSystem::GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, SValue &outValue) const { SValue theTemp; bool retval = dynamic_cast(m_PropertySystem.get()) ->GetCanonicalInstancePropertyValue(inInstance, inProperty, theTemp); if (retval) outValue = theTemp.toOldSkool(); return retval; } Qt3DSDMInstanceHandle CStudioFullSystem::FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty, const TCharStr &inName) const { return m_CoreSystem->FindInstanceByName(inNameProperty, inName); } void CStudioFullSystem::SetConsumer(TTransactionConsumerPtr inConsumer) { m_CoreSystem->SetConsumer(inConsumer); DoSetConsumer(inConsumer, m_AnimationSystem); m_Consumer = inConsumer; } IStudioFullSystemSignalProvider *CStudioFullSystem::GetSignalProvider() { return dynamic_cast(m_Signaller.get()); } IStudioFullSystemSignalSender *CStudioFullSystem::GetSignalSender() { return dynamic_cast(m_Signaller.get()); } }