12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include "UiEditorAnimationBus.h"
- #include "UiAnimViewSequence.h"
- #include "UiAnimViewSequenceManager.h"
- #include "UiAnimViewAnimNode.h"
- #include "UiAnimViewUndo.h"
- #include "UiAnimViewTrack.h"
- #include "UiAnimViewNodeFactories.h"
- #include "UiAnimViewSequence.h"
- #include "AnimationContext.h"
- #if UI_ANIMATION_REMOVED
- #include "Objects/EntityObject.h"
- #endif
- #include "Clipboard.h"
- #include "UiEditorAnimationBus.h"
- #include <Util/EditorUtils.h>
- #include <QApplication>
- //////////////////////////////////////////////////////////////////////////
- CUiAnimViewSequence::CUiAnimViewSequence(IUiAnimSequence* pSequence)
- : CUiAnimViewAnimNode(pSequence, nullptr, nullptr)
- , m_pAnimSequence(pSequence)
- , m_bBoundToEditorObjects(false)
- , m_selectionRecursionLevel(0)
- , m_bQueueNotifications(false)
- , m_bKeySelectionChanged(false)
- , m_bKeysChanged(false)
- , m_bForceUiAnimation(false)
- , m_bNodeSelectionChanged(false)
- , m_time(0.0f)
- , m_bNoNotifications(false)
- {
- assert(m_pAnimSequence);
- SetExpanded(true);
- }
- //////////////////////////////////////////////////////////////////////////
- CUiAnimViewSequence::~CUiAnimViewSequence()
- {
- // For safety. Should be done by sequence manager
- UiAnimUndoManager::Get()->RemoveListener(this);
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::Load()
- {
- const int nodeCount = m_pAnimSequence->GetNodeCount();
- for (int i = 0; i < nodeCount; ++i)
- {
- IUiAnimNode* pNode = m_pAnimSequence->GetNode(i);
- // Only add top level nodes to sequence
- if (!pNode->GetParent())
- {
- CUiAnimViewAnimNodeFactory animNodeFactory;
- CUiAnimViewAnimNode* pNewTVAnimNode = animNodeFactory.BuildAnimNode(m_pAnimSequence.get(), pNode, this);
- m_childNodes.push_back(std::unique_ptr<CUiAnimViewNode>(pNewTVAnimNode));
- }
- }
- SortNodes();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::BindToEditorObjects()
- {
- m_bBoundToEditorObjects = true;
- CUiAnimViewAnimNode::BindToEditorObjects();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::UnBindFromEditorObjects()
- {
- m_bBoundToEditorObjects = false;
- CUiAnimViewAnimNode::UnBindFromEditorObjects();
- }
- //////////////////////////////////////////////////////////////////////////
- bool CUiAnimViewSequence::IsBoundToEditorObjects() const
- {
- return m_bBoundToEditorObjects;
- }
- //////////////////////////////////////////////////////////////////////////
- CUiAnimViewKeyHandle CUiAnimViewSequence::FindSingleSelectedKey()
- {
- CUiAnimViewSequence* pSequence = nullptr;
- UiEditorAnimationBus::BroadcastResult(pSequence, &UiEditorAnimationBus::Events::GetCurrentSequence);
- if (!pSequence)
- {
- return CUiAnimViewKeyHandle();
- }
- CUiAnimViewKeyBundle selectedKeys = pSequence->GetSelectedKeys();
- if (selectedKeys.GetKeyCount() != 1)
- {
- return CUiAnimViewKeyHandle();
- }
- return selectedKeys.GetKey(0);
- }
- //////////////////////////////////////////////////////////////////////////
- bool CUiAnimViewSequence::IsAncestorOf(CUiAnimViewSequence* pSequence) const
- {
- return m_pAnimSequence->IsAncestorOf(pSequence->m_pAnimSequence.get());
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::BeginCutScene([[maybe_unused]] const bool bResetFx) const
- {
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::EndCutScene() const
- {
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::Render(const SUiAnimContext& animContext)
- {
- for (auto iter = m_childNodes.begin(); iter != m_childNodes.end(); ++iter)
- {
- CUiAnimViewNode* pChildNode = (*iter).get();
- if (pChildNode->GetNodeType() == eUiAVNT_AnimNode)
- {
- CUiAnimViewAnimNode* pChildAnimNode = (CUiAnimViewAnimNode*)pChildNode;
- pChildAnimNode->Render(animContext);
- }
- }
- m_pAnimSequence->Render();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::Animate(const SUiAnimContext& animContext)
- {
- if (!m_pAnimSequence->IsActivated())
- {
- return;
- }
- m_time = animContext.time;
- m_pAnimSequence->Animate(animContext);
- CUiAnimViewSequenceNoNotificationContext context(this);
- for (auto iter = m_childNodes.begin(); iter != m_childNodes.end(); ++iter)
- {
- CUiAnimViewNode* pChildNode = (*iter).get();
- if (pChildNode->GetNodeType() == eUiAVNT_AnimNode)
- {
- CUiAnimViewAnimNode* pChildAnimNode = (CUiAnimViewAnimNode*)pChildNode;
- pChildAnimNode->Animate(animContext);
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::AddListener(IUiAnimViewSequenceListener* pListener)
- {
- stl::push_back_unique(m_sequenceListeners, pListener);
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::RemoveListener(IUiAnimViewSequenceListener* pListener)
- {
- stl::find_and_erase(m_sequenceListeners, pListener);
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::OnNodeSelectionChanged()
- {
- if (m_bNoNotifications)
- {
- return;
- }
- if (m_bQueueNotifications)
- {
- m_bNodeSelectionChanged = true;
- }
- else
- {
- CUiAnimViewSequenceNoNotificationContext context(this);
- for (auto iter = m_sequenceListeners.begin(); iter != m_sequenceListeners.end(); ++iter)
- {
- (*iter)->OnNodeSelectionChanged(this);
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::ForceAnimation()
- {
- if (m_bNoNotifications)
- {
- return;
- }
- if (m_bQueueNotifications)
- {
- m_bForceUiAnimation = true;
- }
- else
- {
- if (IsActive())
- {
- CUiAnimationContext* pAnimationContext = nullptr;
- UiEditorAnimationBus::BroadcastResult(pAnimationContext, &UiEditorAnimationBus::Events::GetAnimationContext);
- pAnimationContext->ForceAnimation();
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::OnKeySelectionChanged()
- {
- if (m_bNoNotifications)
- {
- return;
- }
- if (m_bQueueNotifications)
- {
- m_bKeySelectionChanged = true;
- }
- else
- {
- CUiAnimViewSequenceNoNotificationContext context(this);
- for (auto iter = m_sequenceListeners.begin(); iter != m_sequenceListeners.end(); ++iter)
- {
- (*iter)->OnKeySelectionChanged(this);
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::OnKeysChanged()
- {
- if (m_bNoNotifications)
- {
- return;
- }
- if (m_bQueueNotifications)
- {
- m_bKeysChanged = true;
- }
- else
- {
- CUiAnimViewSequenceNoNotificationContext context(this);
- for (auto iter = m_sequenceListeners.begin(); iter != m_sequenceListeners.end(); ++iter)
- {
- (*iter)->OnKeysChanged(this);
- }
- if (IsActive())
- {
- CUiAnimationContext* pAnimationContext = nullptr;
- UiEditorAnimationBus::BroadcastResult(pAnimationContext, &UiEditorAnimationBus::Events::GetAnimationContext);
- pAnimationContext->ForceAnimation();
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::OnNodeChanged(CUiAnimViewNode* pNode, IUiAnimViewSequenceListener::ENodeChangeType type)
- {
- #if UI_ANIMATION_REMOVED // UI_ANIMATION_REVISIT do we need any of this?
- if (pNode && pNode->GetNodeType() == eUiAVNT_AnimNode)
- {
- CUiAnimViewAnimNode* pAnimNode = static_cast<CUiAnimViewAnimNode*>(pNode);
- CEntityObject* pNodeEntity = pAnimNode->GetNodeEntity();
- if (pAnimNode->IsActive() && pNodeEntity)
- {
- switch (type)
- {
- case IUiAnimViewSequenceListener::eNodeChangeType_Added:
- pNodeEntity->SetTransformDelegate(pAnimNode);
- pNodeEntity->RegisterListener(pAnimNode);
- ForceAnimation();
- break;
- case IUiAnimViewSequenceListener::eNodeChangeType_Removed:
- pNodeEntity->SetTransformDelegate(nullptr);
- pNodeEntity->UnregisterListener(pAnimNode);
- ForceAnimation();
- break;
- }
- }
- switch (type)
- {
- case IUiAnimViewSequenceListener::eNodeChangeType_Enabled:
- // Fall through
- case IUiAnimViewSequenceListener::eNodeChangeType_Hidden:
- // Fall through
- case IUiAnimViewSequenceListener::eNodeChangeType_SetAsActiveDirector:
- // Fall through
- case IUiAnimViewSequenceListener::eNodeChangeType_NodeOwnerChanged:
- ForceAnimation();
- break;
- }
- }
- #endif
- if (m_bNoNotifications)
- {
- return;
- }
- CUiAnimViewSequenceNoNotificationContext context(this);
- for (auto iter = m_sequenceListeners.begin(); iter != m_sequenceListeners.end(); ++iter)
- {
- (*iter)->OnNodeChanged(pNode, type);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::OnNodeRenamed(CUiAnimViewNode* pNode, const char* pOldName)
- {
- bool bLightAnimationSetActive = GetFlags() & IUiAnimSequence::eSeqFlags_LightAnimationSet;
- if (bLightAnimationSetActive)
- {
- UpdateLightAnimationRefs(pOldName, pNode->GetName().c_str());
- }
- if (m_bNoNotifications)
- {
- return;
- }
- CUiAnimViewSequenceNoNotificationContext context(this);
- for (auto iter = m_sequenceListeners.begin(); iter != m_sequenceListeners.end(); ++iter)
- {
- (*iter)->OnNodeRenamed(pNode, pOldName);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::OnSequenceSettingsChanged()
- {
- if (m_bNoNotifications)
- {
- return;
- }
- CUiAnimViewSequenceNoNotificationContext context(this);
- for (auto iter = m_sequenceListeners.begin(); iter != m_sequenceListeners.end(); ++iter)
- {
- (*iter)->OnSequenceSettingsChanged(this);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::QueueNotifications()
- {
- m_bQueueNotifications = true;
- ++m_selectionRecursionLevel;
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::SubmitPendingNotifcations()
- {
- assert(m_selectionRecursionLevel > 0);
- if (m_selectionRecursionLevel > 0)
- {
- --m_selectionRecursionLevel;
- }
- if (m_selectionRecursionLevel == 0)
- {
- m_bQueueNotifications = false;
- if (m_bNodeSelectionChanged)
- {
- OnNodeSelectionChanged();
- }
- if (m_bKeysChanged)
- {
- OnKeysChanged();
- }
- if (m_bKeySelectionChanged)
- {
- OnKeySelectionChanged();
- }
- if (m_bForceUiAnimation)
- {
- ForceAnimation();
- }
- m_bForceUiAnimation = false;
- m_bKeysChanged = false;
- m_bNodeSelectionChanged = false;
- m_bKeySelectionChanged = false;
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::DeleteSelectedNodes()
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewSequenceNotificationContext context(this);
- if (IsSelected())
- {
- CUiAnimViewSequenceManager::GetSequenceManager()->DeleteSequence(this);
- return;
- }
- CUiAnimViewAnimNodeBundle selectedNodes = GetSelectedAnimNodes();
- const unsigned int numSelectedNodes = selectedNodes.GetCount();
- #if UI_ANIMATION_REMOVED // lights
- // Check if any reference to the light animation to be deleted exists, and abort the removal, if any.
- const bool bLightAnimationSetActive = GetFlags() & IUiAnimSequence::eSeqFlags_LightAnimationSet;
- if (bLightAnimationSetActive)
- {
- QStringList lightNodes;
- // Construct set of selected light nodes
- for (unsigned int i = 0; i < numSelectedNodes; ++i)
- {
- CUiAnimViewAnimNode* pCurrentNode = selectedNodes.GetNode(i);
- if (pCurrentNode->GetType() == eUiAnimNodeType_Light)
- {
- stl::push_back_unique(lightNodes, pCurrentNode->GetName());
- }
- }
- // Check all entities if any is referencing any selected light node
- std::vector<CBaseObject*> entityObjects;
- GetIEditor()->GetObjectManager()->FindObjectsOfType(&CEntityObject::staticMetaObject, entityObjects);
- for (size_t i = 0; i < entityObjects.size(); ++i)
- {
- QString lightAnimationName = static_cast<CEntityObject*>(entityObjects[i])->GetLightAnimation();
- if (stl::find(lightNodes, lightAnimationName))
- {
- QMessageBox::critical(QApplication::activeWindow(), QString(), QObject::tr("The node '%1' cannot be removed since there is a light entity still using it.").arg(lightAnimationName));
- return;
- }
- }
- }
- #endif
- CUiAnimViewTrackBundle selectedTracks = GetSelectedTracks();
- const unsigned int numSelectedTracks = selectedTracks.GetCount();
- for (unsigned int i = 0; i < numSelectedTracks; ++i)
- {
- CUiAnimViewTrack* pTrack = selectedTracks.GetTrack(i);
- // Ignore sub tracks
- if (!pTrack->IsSubTrack())
- {
- pTrack->GetAnimNode()->RemoveTrack(pTrack);
- }
- }
- for (unsigned int i = 0; i < numSelectedNodes; ++i)
- {
- CUiAnimViewAnimNode* pNode = selectedNodes.GetNode(i);
- CUiAnimViewAnimNode* pParentNode = static_cast<CUiAnimViewAnimNode*>(pNode->GetParentNode());
- pParentNode->RemoveSubNode(pNode);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::SelectSelectedNodesInViewport()
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewAnimNodeBundle selectedNodes = GetSelectedAnimNodes();
- std::vector<CBaseObject*> entitiesToBeSelected;
- #if UI_ANIMATION_REMOVED // lights
- const unsigned int numSelectedNodes = selectedNodes.GetCount();
- // Also select objects that refer to light animation
- const bool bLightAnimationSetActive = GetFlags() & IUiAnimSequence::eSeqFlags_LightAnimationSet;
- if (bLightAnimationSetActive)
- {
- QStringList lightNodes;
- // Construct set of selected light nodes
- for (unsigned int i = 0; i < numSelectedNodes; ++i)
- {
- CUiAnimViewAnimNode* pCurrentNode = selectedNodes.GetNode(i);
- if (pCurrentNode->GetType() == eUiAnimNodeType_Light)
- {
- stl::push_back_unique(lightNodes, pCurrentNode->GetName());
- }
- }
- // Check all entities if any is referencing any selected light node
- std::vector<CBaseObject*> entityObjects;
- GetIEditor()->GetObjectManager()->FindObjectsOfType(&CEntityObject::staticMetaObject, entityObjects);
- for (size_t i = 0; i < entityObjects.size(); ++i)
- {
- QString lightAnimationName = static_cast<CEntityObject*>(entityObjects[i])->GetLightAnimation();
- if (stl::find(lightNodes, lightAnimationName))
- {
- stl::push_back_unique(entitiesToBeSelected, entityObjects[i]);
- }
- }
- }
- else
- {
- for (unsigned int i = 0; i < numSelectedNodes; ++i)
- {
- CUiAnimViewAnimNode* pNode = selectedNodes.GetNode(i);
- CEntityObject* pEntity = pNode->GetNodeEntity();
- if (pEntity)
- {
- stl::push_back_unique(entitiesToBeSelected, pEntity);
- }
- }
- }
- #endif
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::SyncSelectedTracksToBase()
- {
- CUiAnimViewAnimNodeBundle selectedNodes = GetSelectedAnimNodes();
- bool bNothingWasSynced = true;
- const unsigned int numSelectedNodes = selectedNodes.GetCount();
- if (numSelectedNodes > 0)
- {
- UiAnimUndo undo("Sync selected tracks to base");
- for (unsigned int i = 0; i < numSelectedNodes; ++i)
- {
- #if UI_ANIMATION_REMOVED // don't support CEntityObject
- CUiAnimViewAnimNode* pAnimNode = selectedNodes.GetNode(i);
- CEntityObject* pEntityObject = pAnimNode->GetNodeEntity();
- if (pEntityObject)
- {
- CUiAnimViewAnimNode* pAnimNode = CUiAnimViewSequenceManager::GetSequenceManager()->GetActiveAnimNode(pEntityObject);
- if (pAnimNode)
- {
- ITransformDelegate* pDelegate = pEntityObject->GetTransformDelegate();
- pEntityObject->SetTransformDelegate(nullptr);
- const Vec3 position = pAnimNode->GetPos();
- pEntityObject->SetPos(position);
- const Quat rotation = pAnimNode->GetRotation();
- pEntityObject->SetRotation(rotation);
- const Vec3 scale = pAnimNode->GetScale();
- pEntityObject->SetScale(scale);
- pEntityObject->SetTransformDelegate(pDelegate);
- bNothingWasSynced = false;
- }
- }
- #endif
- }
- if (bNothingWasSynced)
- {
- undo.Cancel();
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::SyncSelectedTracksFromBase()
- {
- CUiAnimViewAnimNodeBundle selectedNodes = GetSelectedAnimNodes();
- bool bNothingWasSynced = true;
- const unsigned int numSelectedNodes = selectedNodes.GetCount();
- if (numSelectedNodes > 0)
- {
- UiAnimUndo undo("Sync selected tracks to base");
- #if UI_ANIMATION_REMOVED // don't support CEntityObject
- for (unsigned int i = 0; i < numSelectedNodes; ++i)
- {
- CUiAnimViewAnimNode* pAnimNode = selectedNodes.GetNode(i);
- CEntityObject* pEntityObject = pAnimNode->GetNodeEntity();
- if (pEntityObject)
- {
- CUiAnimViewAnimNode* pAnimNode = CUiAnimViewSequenceManager::GetSequenceManager()->GetActiveAnimNode(pEntityObject);
- if (pAnimNode)
- {
- ITransformDelegate* pDelegate = pEntityObject->GetTransformDelegate();
- pEntityObject->SetTransformDelegate(nullptr);
- const Vec3 position = pEntityObject->GetPos();
- pAnimNode->SetPos(position);
- const Quat rotation = pEntityObject->GetRotation();
- pAnimNode->SetRotation(rotation);
- const Vec3 scale = pEntityObject->GetScale();
- pEntityObject->SetScale(scale);
- pEntityObject->SetTransformDelegate(pDelegate);
- bNothingWasSynced = false;
- }
- }
- }
- #endif
- if (bNothingWasSynced)
- {
- undo.Cancel();
- }
- }
- if (IsActive())
- {
- CUiAnimationContext* pAnimationContext = nullptr;
- UiEditorAnimationBus::BroadcastResult(pAnimationContext, &UiEditorAnimationBus::Events::GetAnimationContext);
- pAnimationContext->ForceAnimation();
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::UpdateLightAnimationRefs([[maybe_unused]] const char* pOldName, [[maybe_unused]] const char* pNewName)
- {
- #if UI_ANIMATION_REMOVED // lights
- std::vector<CBaseObject*> entityObjects;
- GetIEditor()->GetObjectManager()->FindObjectsOfType(&CEntityObject::staticMetaObject, entityObjects);
- std::for_each(std::begin(entityObjects), std::end(entityObjects),
- [&pOldName, &pNewName](CBaseObject* pBaseObject)
- {
- CEntityObject* pEntityObject = static_cast<CEntityObject*>(pBaseObject);
- bool bLight = pEntityObject && pEntityObject->GetEntityClass().Compare("Light") == 0;
- if (bLight)
- {
- string lightAnimation = pEntityObject->GetEntityPropertyString("lightanimation_LightAnimation");
- if (lightAnimation == pOldName)
- {
- pEntityObject->SetEntityPropertyString("lightanimation_LightAnimation", pNewName);
- }
- }
- });
- #endif
- }
- //////////////////////////////////////////////////////////////////////////
- bool CUiAnimViewSequence::SetName(const char* pName)
- {
- // Check if there is already a sequence with that name
- const CUiAnimViewSequenceManager* pSequenceManager = CUiAnimViewSequenceManager::GetSequenceManager();
- if (pSequenceManager->GetSequenceByName(pName))
- {
- return false;
- }
- AZStd::string oldName = GetName();
- m_pAnimSequence->SetName(pName);
- if (UiAnimUndo::IsRecording())
- {
- UiAnimUndo::Record(new CUndoAnimNodeRename(this, oldName));
- }
- GetSequence()->OnNodeRenamed(this, oldName.c_str());
- return true;
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::DeleteSelectedKeys()
- {
- assert(UiAnimUndo::IsRecording());
- StoreUndoForTracksWithSelectedKeys();
- CUiAnimViewSequenceNotificationContext context(this);
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- for (int k = (int)selectedKeys.GetKeyCount() - 1; k >= 0; --k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(k);
- skey.Delete();
- }
- // The selected keys are deleted, so notify the selection was just changed.
- OnKeySelectionChanged();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::StoreUndoForTracksWithSelectedKeys()
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- // Construct the set of tracks that have selected keys
- std::set<CUiAnimViewTrack*> tracks;
- for (int k = 0; k < (int)selectedKeys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(k);
- tracks.insert(skey.GetTrack());
- }
- // Store one key selection undo before...
- UiAnimUndo::Record(new CUndoAnimKeySelection(this));
- // For each of those tracks store an undo object
- for (auto iter = tracks.begin(); iter != tracks.end(); ++iter)
- {
- UiAnimUndo::Record(new CUndoTrackObject(*iter, false));
- }
- // ... and one after key changes
- UiAnimUndo::Record(new CUndoAnimKeySelection(this));
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::CopyKeysToClipboard(const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks)
- {
- XmlNodeRef copyNode = XmlHelpers::CreateXmlNode("CopyKeysNode");
- CopyKeysToClipboard(copyNode, bOnlySelectedKeys, bOnlyFromSelectedTracks);
- CClipboard clip(nullptr);
- clip.Put(copyNode, "Track view keys");
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::CopyKeysToClipboard(XmlNodeRef& xmlNode, const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks)
- {
- for (auto iter = m_childNodes.begin(); iter != m_childNodes.end(); ++iter)
- {
- CUiAnimViewNode* pChildNode = (*iter).get();
- pChildNode->CopyKeysToClipboard(xmlNode, bOnlySelectedKeys, bOnlyFromSelectedTracks);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::PasteKeysFromClipboard(CUiAnimViewAnimNode* pTargetNode, CUiAnimViewTrack* pTargetTrack, const float timeOffset)
- {
- assert(UiAnimUndo::IsRecording());
- CClipboard clipboard(nullptr);
- XmlNodeRef clipboardContent = clipboard.Get();
- if (clipboardContent)
- {
- std::vector<TMatchedTrackLocation> matchedLocations = GetMatchedPasteLocations(clipboardContent, pTargetNode, pTargetTrack);
- for (auto iter = matchedLocations.begin(); iter != matchedLocations.end(); ++iter)
- {
- const TMatchedTrackLocation& location = *iter;
- CUiAnimViewTrack* pTrack = location.first;
- const XmlNodeRef& trackNode = location.second;
- pTrack->PasteKeys(trackNode, timeOffset);
- }
- OnKeysChanged();
- }
- }
- //////////////////////////////////////////////////////////////////////////
- std::vector<CUiAnimViewSequence::TMatchedTrackLocation>
- CUiAnimViewSequence::GetMatchedPasteLocations(XmlNodeRef clipboardContent, CUiAnimViewAnimNode* pTargetNode, CUiAnimViewTrack* pTargetTrack)
- {
- std::vector<TMatchedTrackLocation> matchedLocations;
- bool bPastingSingleNode = false;
- XmlNodeRef singleNode;
- bool bPastingSingleTrack = false;
- XmlNodeRef singleTrack;
- // Check if the XML tree only contains one node and if so if that node only contains one track
- for (XmlNodeRef currentNode = clipboardContent; currentNode->getChildCount() > 0; currentNode = currentNode->getChild(0))
- {
- bool bAllChildsAreTracks = true;
- const unsigned int numChilds = currentNode->getChildCount();
- for (unsigned int i = 0; i < numChilds; ++i)
- {
- XmlNodeRef childNode = currentNode->getChild(i);
- if (strcmp(currentNode->getChild(0)->getTag(), "Track") != 0)
- {
- bAllChildsAreTracks = false;
- break;
- }
- }
- if (bAllChildsAreTracks)
- {
- bPastingSingleNode = true;
- singleNode = currentNode;
- if (currentNode->getChildCount() == 1)
- {
- bPastingSingleTrack = true;
- singleTrack = currentNode->getChild(0);
- }
- }
- else if (currentNode->getChildCount() != 1)
- {
- break;
- }
- }
- if (bPastingSingleTrack && pTargetNode && pTargetTrack)
- {
- // We have a target node & track, so try to match the value type
- unsigned int valueType = 0;
- if (singleTrack->getAttr("valueType", valueType))
- {
- if (pTargetTrack->GetValueType() == valueType)
- {
- matchedLocations.push_back(TMatchedTrackLocation(pTargetTrack, singleTrack));
- return matchedLocations;
- }
- }
- }
- if (bPastingSingleNode && pTargetNode)
- {
- // Set of tracks that were already matched
- std::vector<CUiAnimViewTrack*> matchedTracks;
- // We have a single node to paste and have been given a target node
- // so try to match the tracks by param type
- const unsigned int numTracks = singleNode->getChildCount();
- for (unsigned int i = 0; i < numTracks; ++i)
- {
- XmlNodeRef trackNode = singleNode->getChild(i);
- // Try to match the track
- auto matchingTracks = GetMatchingTracks(pTargetNode, trackNode);
- for (auto iter = matchingTracks.begin(); iter != matchingTracks.end(); ++iter)
- {
- CUiAnimViewTrack* pMatchedTrack = *iter;
- // Pick the first track that was matched *and* was not already matched
- if (!stl::find(matchedTracks, pMatchedTrack))
- {
- stl::push_back_unique(matchedTracks, pMatchedTrack);
- matchedLocations.push_back(TMatchedTrackLocation(pMatchedTrack, trackNode));
- break;
- }
- }
- }
- // Return if matching succeeded
- if (matchedLocations.size() > 0)
- {
- return matchedLocations;
- }
- }
- if (!bPastingSingleNode)
- {
- // Ok, we're pasting keys from multiple nodes, haven't been given any target
- // or matching the targets failed. Ignore given target pointers and start
- // a recursive match at the sequence root.
- GetMatchedPasteLocationsRec(matchedLocations, this, clipboardContent);
- }
- return matchedLocations;
- }
- //////////////////////////////////////////////////////////////////////////
- std::deque<CUiAnimViewTrack*> CUiAnimViewSequence::GetMatchingTracks(CUiAnimViewAnimNode* pAnimNode, XmlNodeRef trackNode)
- {
- std::deque<CUiAnimViewTrack*> matchingTracks;
- const AZStd::string trackName = trackNode->getAttr("name");
- IUiAnimationSystem* animationSystem = nullptr;
- UiEditorAnimationBus::BroadcastResult(animationSystem, &UiEditorAnimationBus::Events::GetAnimationSystem);
- CUiAnimParamType animParamType;
- animParamType.Serialize(animationSystem, trackNode, true);
- unsigned int valueType;
- if (!trackNode->getAttr("valueType", valueType))
- {
- return matchingTracks;
- }
- CUiAnimViewTrackBundle tracks = pAnimNode->GetTracksByParam(animParamType);
- const unsigned int trackCount = tracks.GetCount();
- if (trackCount > 0)
- {
- // Search for a track with the given name and value type
- for (unsigned int i = 0; i < trackCount; ++i)
- {
- CUiAnimViewTrack* pTrack = tracks.GetTrack(i);
- if (pTrack->GetValueType() == valueType)
- {
- if (pTrack->GetName() == trackName)
- {
- matchingTracks.push_back(pTrack);
- }
- }
- }
- // Then with lower precedence add the tracks that only match the value
- for (unsigned int i = 0; i < trackCount; ++i)
- {
- CUiAnimViewTrack* pTrack = tracks.GetTrack(i);
- if (pTrack->GetValueType() == valueType)
- {
- stl::push_back_unique(matchingTracks, pTrack);
- }
- }
- }
- return matchingTracks;
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::GetMatchedPasteLocationsRec(std::vector<TMatchedTrackLocation>& locations, CUiAnimViewNode* pCurrentNode, XmlNodeRef clipboardNode)
- {
- if (pCurrentNode->GetNodeType() == eUiAVNT_Sequence)
- {
- if (strcmp(clipboardNode->getTag(), "CopyKeysNode") != 0)
- {
- return;
- }
- }
- const unsigned int numChildNodes = clipboardNode->getChildCount();
- for (unsigned int nodeIndex = 0; nodeIndex < numChildNodes; ++nodeIndex)
- {
- XmlNodeRef xmlChildNode = clipboardNode->getChild(nodeIndex);
- const AZStd::string tagName = xmlChildNode->getTag();
- if (tagName == "Node")
- {
- const AZStd::string nodeName = xmlChildNode->getAttr("name");
- int nodeType = eUiAnimNodeType_Invalid;
- xmlChildNode->getAttr("type", nodeType);
- const unsigned int childCount = pCurrentNode->GetChildCount();
- for (unsigned int i = 0; i < childCount; ++i)
- {
- CUiAnimViewNode* pChildNode = pCurrentNode->GetChild(i);
- if (pChildNode->GetNodeType() == eUiAVNT_AnimNode)
- {
- CUiAnimViewAnimNode* pAnimNode = static_cast<CUiAnimViewAnimNode*>(pChildNode);
- if (pAnimNode->GetName() == nodeName && pAnimNode->GetType() == nodeType)
- {
- GetMatchedPasteLocationsRec(locations, pChildNode, xmlChildNode);
- }
- }
- }
- }
- else if (tagName == "Track")
- {
- const AZStd::string trackName = xmlChildNode->getAttr("name");
- IUiAnimationSystem* animationSystem = nullptr;
- UiEditorAnimationBus::BroadcastResult(animationSystem, &UiEditorAnimationBus::Events::GetAnimationSystem);
- CUiAnimParamType trackParamType;
- trackParamType.Serialize(animationSystem, xmlChildNode, true);
- int trackParamValue = eUiAnimValue_Unknown;
- xmlChildNode->getAttr("valueType", trackParamValue);
- const unsigned int childCount = pCurrentNode->GetChildCount();
- for (unsigned int i = 0; i < childCount; ++i)
- {
- CUiAnimViewNode* pNode = pCurrentNode->GetChild(i);
- if (pNode->GetNodeType() == eUiAVNT_Track)
- {
- CUiAnimViewTrack* pTrack = static_cast<CUiAnimViewTrack*>(pNode);
- if (pTrack->GetName() == trackName && pTrack->GetParameterType() == trackParamType)
- {
- locations.push_back(TMatchedTrackLocation(pTrack, xmlChildNode));
- }
- }
- }
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::AdjustKeysToTimeRange(Range newTimeRange)
- {
- assert (UiAnimUndo::IsRecording());
- // Store one key selection undo before...
- UiAnimUndo::Record(new CUndoAnimKeySelection(this));
- // Store key undo for each track
- CUiAnimViewTrackBundle tracks = GetAllTracks();
- const unsigned int numTracks = tracks.GetCount();
- for (unsigned int i = 0; i < numTracks; ++i)
- {
- CUiAnimViewTrack* pTrack = tracks.GetTrack(i);
- UiAnimUndo::Record(new CUndoTrackObject(pTrack, false));
- }
- // ... and one after key changes
- UiAnimUndo::Record(new CUndoAnimKeySelection(this));
- // Set new time range
- Range oldTimeRange = GetTimeRange();
- float offset = newTimeRange.start - oldTimeRange.start;
- // Calculate scale ratio.
- float scale = newTimeRange.Length() / oldTimeRange.Length();
- SetTimeRange(newTimeRange);
- CUiAnimViewKeyBundle keyBundle = GetAllKeys();
- const unsigned int numKeys = keyBundle.GetKeyCount();
- for (unsigned int i = 0; i < numKeys; ++i)
- {
- CUiAnimViewKeyHandle keyHandle = keyBundle.GetKey(i);
- keyHandle.SetTime(offset + keyHandle.GetTime() * scale);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::SetTimeRange(Range timeRange)
- {
- if (UiAnimUndo::IsRecording())
- {
- // Store old sequence settings
- UiAnimUndo::Record(new CUndoSequenceSettings(this));
- }
- m_pAnimSequence->SetTimeRange(timeRange);
- OnSequenceSettingsChanged();
- }
- //////////////////////////////////////////////////////////////////////////
- Range CUiAnimViewSequence::GetTimeRange() const
- {
- return m_pAnimSequence->GetTimeRange();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::SetFlags(IUiAnimSequence::EUiAnimSequenceFlags flags)
- {
- if (UiAnimUndo::IsRecording())
- {
- // Store old sequence settings
- UiAnimUndo::Record(new CUndoSequenceSettings(this));
- }
- m_pAnimSequence->SetFlags(flags);
- OnSequenceSettingsChanged();
- }
- //////////////////////////////////////////////////////////////////////////
- IUiAnimSequence::EUiAnimSequenceFlags CUiAnimViewSequence::GetFlags() const
- {
- return (IUiAnimSequence::EUiAnimSequenceFlags)m_pAnimSequence->GetFlags();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::DeselectAllKeys()
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewSequenceNotificationContext context(this);
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- for (unsigned int i = 0; i < selectedKeys.GetKeyCount(); ++i)
- {
- CUiAnimViewKeyHandle keyHandle = selectedKeys.GetKey(i);
- keyHandle.Select(false);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::OffsetSelectedKeys(const float timeOffset)
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewSequenceNotificationContext context(this);
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- for (int k = 0; k < (int)selectedKeys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(k);
- skey.Offset(timeOffset);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- float CUiAnimViewSequence::ClipTimeOffsetForOffsetting(const float timeOffset)
- {
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- float newTimeOffset = timeOffset;
- for (int k = 0; k < (int)selectedKeys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(k);
- const float keyTime = skey.GetTime();
- float newKeyTime = keyTime + timeOffset;
- Range extendedTimeRange(0.0f, GetTimeRange().end);
- extendedTimeRange.ClipValue(newKeyTime);
- float offset = newKeyTime - keyTime;
- if (fabs(offset) < fabs(newTimeOffset))
- {
- newTimeOffset = offset;
- }
- }
- return newTimeOffset;
- }
- //////////////////////////////////////////////////////////////////////////
- float CUiAnimViewSequence::ClipTimeOffsetForScaling(float timeOffset)
- {
- if (timeOffset <= 0)
- {
- return timeOffset;
- }
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- float newTimeOffset = timeOffset;
- for (int k = 0; k < (int)selectedKeys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(k);
- float keyTime = skey.GetTime();
- float newKeyTime = keyTime * timeOffset;
- GetTimeRange().ClipValue(newKeyTime);
- float offset = newKeyTime / keyTime;
- if (offset < newTimeOffset)
- {
- newTimeOffset = offset;
- }
- }
- return newTimeOffset;
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::ScaleSelectedKeys(const float timeOffset)
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewSequenceNotificationContext context(this);
- if (timeOffset <= 0)
- {
- return;
- }
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- const CUiAnimViewTrack* pTrack = nullptr;
- for (int k = 0; k < (int)selectedKeys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(k);
- if (pTrack != skey.GetTrack())
- {
- pTrack = skey.GetTrack();
- }
- float keyt = skey.GetTime() * timeOffset;
- skey.SetTime(keyt);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- float CUiAnimViewSequence::ClipTimeOffsetForSliding(const float timeOffset)
- {
- CUiAnimViewKeyBundle keys = GetSelectedKeys();
- std::set<CUiAnimViewTrack*> tracks;
- std::set<CUiAnimViewTrack*>::const_iterator pTrackIter;
- Range timeRange = GetTimeRange();
- // Get the first key in the timeline among selected and
- // also gather tracks.
- float time0 = timeRange.end;
- for (int k = 0; k < (int)keys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = keys.GetKey(k);
- tracks.insert(skey.GetTrack());
- float keyTime = skey.GetTime();
- if (keyTime < time0)
- {
- time0 = keyTime;
- }
- }
- // If 'bAll' is true, slide all tracks.
- // (Otherwise, slide only selected tracks.)
- bool bAll = Qt::AltModifier & QApplication::queryKeyboardModifiers();
- if (bAll)
- {
- keys = GetKeysInTimeRange(time0, timeRange.end);
- // Gather tracks again.
- tracks.clear();
- for (int k = 0; k < (int)keys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = keys.GetKey(k);
- tracks.insert(skey.GetTrack());
- }
- }
- float newTimeOffset = timeOffset;
- for (pTrackIter = tracks.begin(); pTrackIter != tracks.end(); ++pTrackIter)
- {
- CUiAnimViewTrack* pTrack = *pTrackIter;
- for (unsigned int i = 0; i < pTrack->GetKeyCount(); ++i)
- {
- CUiAnimViewKeyHandle keyHandle = pTrack->GetKey(i);
- const float keyTime = keyHandle.GetTime();
- if (keyTime >= time0)
- {
- float newKeyTime = keyTime + timeOffset;
- timeRange.ClipValue(newKeyTime);
- float offset = newKeyTime - keyTime;
- if (fabs(offset) < fabs(newTimeOffset))
- {
- newTimeOffset = offset;
- }
- }
- }
- }
- return newTimeOffset;
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::SlideKeys(float timeOffset)
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewSequenceNotificationContext context(this);
- CUiAnimViewKeyBundle keys = GetSelectedKeys();
- std::set<CUiAnimViewTrack*> tracks;
- std::set<CUiAnimViewTrack*>::const_iterator pTrackIter;
- Range timeRange = GetTimeRange();
- // Get the first key in the timeline among selected and
- // also gather tracks.
- float time0 = timeRange.end;
- for (int k = 0; k < (int)keys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = keys.GetKey(k);
- tracks.insert(skey.GetTrack());
- float keyTime = skey.GetTime();
- if (keyTime < time0)
- {
- time0 = keyTime;
- }
- }
- // If 'bAll' is true, slide all tracks.
- // (Otherwise, slide only selected tracks.)
- bool bAll = Qt::AltModifier & QApplication::queryKeyboardModifiers();
- if (bAll)
- {
- keys = GetKeysInTimeRange(time0, timeRange.end);
- // Gather tracks again.
- tracks.clear();
- for (int k = 0; k < (int)keys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = keys.GetKey(k);
- tracks.insert(skey.GetTrack());
- }
- }
- for (pTrackIter = tracks.begin(); pTrackIter != tracks.end(); ++pTrackIter)
- {
- CUiAnimViewTrack* pTrack = *pTrackIter;
- pTrack->SlideKeys(time0, timeOffset);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::CloneSelectedKeys()
- {
- assert(UiAnimUndo::IsRecording());
- CUiAnimViewSequenceNotificationContext context(this);
- CUiAnimViewKeyBundle selectedKeys = GetSelectedKeys();
- const CUiAnimViewTrack* pTrack = nullptr;
- // In case of multiple cloning, indices cannot be used as a solid pointer to the original.
- // So use the time of keys as an identifier, instead.
- std::vector<float> selectedKeyTimes;
- for (size_t k = 0; k < selectedKeys.GetKeyCount(); ++k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(static_cast<unsigned int>(k));
- if (pTrack != skey.GetTrack())
- {
- pTrack = skey.GetTrack();
- }
- selectedKeyTimes.push_back(skey.GetTime());
- }
- // Now, do the actual cloning.
- for (size_t k = 0; k < selectedKeyTimes.size(); ++k)
- {
- CUiAnimViewKeyHandle skey = selectedKeys.GetKey(static_cast<unsigned int>(k));
- skey = skey.GetTrack()->GetKeyByTime(selectedKeyTimes[k]);
- assert(skey.IsValid());
- if (!skey.IsValid())
- {
- continue;
- }
- CUiAnimViewKeyHandle newKey = skey.Clone();
- // Select new key.
- newKey.Select(true);
- // Deselect cloned key.
- skey.Select(false);
- }
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::BeginUndoTransaction()
- {
- QueueNotifications();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::EndUndoTransaction()
- {
- SubmitPendingNotifcations();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::BeginRestoreTransaction()
- {
- QueueNotifications();
- }
- //////////////////////////////////////////////////////////////////////////
- void CUiAnimViewSequence::EndRestoreTransaction()
- {
- SubmitPendingNotifcations();
- }
- //////////////////////////////////////////////////////////////////////////
- bool CUiAnimViewSequence::IsActiveSequence() const
- {
- CUiAnimViewSequence* pSequence = nullptr;
- UiEditorAnimationBus::BroadcastResult(pSequence, &UiEditorAnimationBus::Events::GetCurrentSequence);
- return pSequence == this;
- }
- //////////////////////////////////////////////////////////////////////////
- const float CUiAnimViewSequence::GetTime() const
- {
- return m_time;
- }
|