123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- /*
- * 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 "EditorDefs.h"
- #include "KeyUIControls.h"
- #include "Controls/ReflectedPropertyControl/ReflectedPropertyItem.h"
- #include "TrackViewKeyPropertiesDlg.h"
- ///////////////////////////////////////////////////////
- template<class V>
- IAnimTrack* CVectorKeyUIControlsBase<V>::GetCompoundTrackFromKeys(const CTrackViewKeyBundle& selectedKeys)
- {
- if ((selectedKeys.GetKeyCount() < 1) || !selectedKeys.AreAllKeysOfSameType())
- {
- return nullptr;
- }
- const CTrackViewKeyHandle& keyHandle = selectedKeys.GetKey(0);
- auto pTrack = keyHandle.GetTrack();
- if (!pTrack)
- {
- return nullptr;
- }
- if (!pTrack->IsCompoundTrack())
- {
- if (!pTrack->IsSubTrack())
- {
- return nullptr; // Simple track
- }
- if (const auto pParentNode = pTrack->GetParentNode())
- {
- if (pParentNode->GetNodeType() == ETrackViewNodeType::eTVNT_Track)
- {
- pTrack = static_cast<CTrackViewTrack*>(pParentNode);
- }
- }
- }
- if ((pTrack->GetValueType() != m_valueType) || !pTrack->GetAnimTrack())
- {
- return nullptr;
- }
- return pTrack->GetAnimTrack();
- }
- ////////////////////////////////////////////////////////////////
- bool CVectorKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
- {
- auto pAnimTrack = GetCompoundTrackFromKeys(selectedKeys);
- if (!pAnimTrack)
- {
- return false;
- }
- const auto keyTime = selectedKeys.GetKey(0).GetTime();
- m_vector = AZ::Vector3::CreateZero();
- pAnimTrack->GetValue(keyTime, m_vector, false);
- float fMin = -1.0f;
- float fMax = 1.0f;
- // Don't trigger an OnUIChange event, since this code is the one
- // updating the start/end ui elements, not the user setting new values.
- m_skipOnUIChange = true;
- mv_x = m_vector.GetX();
- pAnimTrack->GetSubTrack(0)->GetKeyValueRange(fMin, fMax);
- float step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_x->SetLimits(fMin, fMax, step, false, false);
- mv_y = m_vector.GetY();
- pAnimTrack->GetSubTrack(1)->GetKeyValueRange(fMin, fMax);
- step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_y->SetLimits(fMin, fMax, step, false, false);
- mv_z = m_vector.GetZ();
- pAnimTrack->GetSubTrack(2)->GetKeyValueRange(fMin, fMax);
- step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_z->SetLimits(fMin, fMax, step, false, false);
- m_skipOnUIChange = false;
- return true;
- }
- void CVectorKeyUIControls::OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys)
- {
- auto pSequence = GetIEditor()->GetAnimation()->GetSequence();
- if (m_skipOnUIChange || !pSequence || !selectedKeys.AreAllKeysOfSameType())
- {
- return;
- }
- auto pAnimTrack = GetCompoundTrackFromKeys(selectedKeys);
- if (!pAnimTrack)
- {
- return;
- }
- const auto keyTime = selectedKeys.GetKey(0).GetTime();
- m_vector = AZ::Vector3::CreateZero();
- pAnimTrack->GetValue(keyTime, m_vector, false);
- AZ::Vector3 newVector(m_vector);
- if (pVar == mv_x.GetVar())
- {
- newVector.SetX(mv_x);
- }
- else if (pVar == mv_y.GetVar())
- {
- newVector.SetY(mv_y);
- }
- else if (pVar == mv_z.GetVar())
- {
- newVector.SetZ(mv_z);
- }
- if (newVector.IsClose(m_vector, AZ::Constants::Tolerance))
- {
- return;
- }
- bool isDuringUndo = false;
- AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(isDuringUndo, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::IsDuringUndoRedo);
- if (isDuringUndo)
- {
- pAnimTrack->SetValue(keyTime, newVector, false);
- }
- else
- {
- AzToolsFramework::ScopedUndoBatch undoBatch("Set Key Value");
- pAnimTrack->SetValue(keyTime, newVector, false);
- undoBatch.MarkEntityDirty(pSequence->GetSequenceComponentEntityId());
- }
- }
- ///////////////////////////////////////////////////
- bool CRgbKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
- {
- auto pAnimTrack = GetCompoundTrackFromKeys(selectedKeys);
- if (!pAnimTrack)
- {
- return false;
- }
- const auto keyTime = selectedKeys.GetKey(0).GetTime();
- m_vector = AZ::Vector3::CreateZero();
- pAnimTrack->GetValue(keyTime, m_vector, false);
- float fMin = -1.0f;
- float fMax = 1.0f;
- pAnimTrack->GetKeyValueRange(fMin, fMax);
- float step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- // Don't trigger an OnUIChange event, since this code is the one
- // updating the start/end ui elements, not the user setting new values.
- m_skipOnUIChange = true;
- mv_x = m_vector.GetX();
- mv_x.GetVar()->SetLimits(fMin, fMax, step, true, true);
- mv_y = m_vector.GetY();
- mv_y.GetVar()->SetLimits(fMin, fMax, step, true, true);
- mv_z = m_vector.GetZ();
- mv_z.GetVar()->SetLimits(fMin, fMax, step, true, true);
- m_skipOnUIChange = false;
- return true;
- }
- ///////////////////////////////////////////////////
- bool CQuatKeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
- {
- auto pAnimTrack = GetCompoundTrackFromKeys(selectedKeys);
- if (!pAnimTrack)
- {
- return false;
- }
- const auto keyTime = selectedKeys.GetKey(0).GetTime();
- m_vector = AZ::Vector3::CreateZero();
- pAnimTrack->GetValue(keyTime, m_vector, false);
- float fMin = -1.0f;
- float fMax = 1.0f;
- // Don't trigger an OnUIChange event, since this code is the one
- // updating the start/end ui elements, not the user setting new values.
- m_skipOnUIChange = true;
- mv_x = m_vector.GetX();
- pAnimTrack->GetSubTrack(0)->GetKeyValueRange(fMin, fMax);
- float step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_x->SetLimits(fMin, fMax, step, true, true);
- mv_y = m_vector.GetY();
- pAnimTrack->GetSubTrack(1)->GetKeyValueRange(fMin, fMax);
- step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_y->SetLimits(fMin, fMax, step, true, true);
- mv_z = m_vector.GetZ();
- pAnimTrack->GetSubTrack(2)->GetKeyValueRange(fMin, fMax);
- step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_y->SetLimits(fMin, fMax, step, true, true);
- m_skipOnUIChange = false;
- return true;
- }
- ///////////////////////////////////////////////////
- bool CVector4KeyUIControls::OnKeySelectionChange(const CTrackViewKeyBundle& selectedKeys)
- {
- auto pAnimTrack = GetCompoundTrackFromKeys(selectedKeys);
- if (!pAnimTrack)
- {
- return false;
- }
- const auto keyTime = selectedKeys.GetKey(0).GetTime();
- m_vector = AZ::Vector4::CreateZero();
- pAnimTrack->GetValue(keyTime, m_vector, false);
- float fMin = -1.0f;
- float fMax = 1.0f;
- // Don't trigger an OnUIChange event, since this code is the one
- // updating the start/end ui elements, not the user setting new values.
- m_skipOnUIChange = true;
- mv_x = m_vector.GetX();
- pAnimTrack->GetSubTrack(0)->GetKeyValueRange(fMin, fMax);
- float step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_x->SetLimits(fMin, fMax, step, false, false);
- mv_y = m_vector.GetY();
- pAnimTrack->GetSubTrack(1)->GetKeyValueRange(fMin, fMax);
- step = AZStd::max((fMax - fMin) / 100.f, 0.01f);
- mv_y->SetLimits(fMin, fMax, step, false, false);
- mv_z = m_vector.GetZ();
- pAnimTrack->GetSubTrack(2)->GetKeyValueRange(fMin, fMax);
- step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_z->SetLimits(fMin, fMax, step, false, false);
- mv_w = m_vector.GetW();
- pAnimTrack->GetSubTrack(3)->GetKeyValueRange(fMin, fMax);
- step = ReflectedPropertyItem::ComputeSliderStep(fMin, fMax);
- mv_w->SetLimits(fMin, fMax, step, false, false);
- m_skipOnUIChange = false;
- return true;
- }
- void CVector4KeyUIControls::OnUIChange(IVariable* pVar, CTrackViewKeyBundle& selectedKeys)
- {
- auto pSequence = GetIEditor()->GetAnimation()->GetSequence();
- if (m_skipOnUIChange || !pSequence || !selectedKeys.AreAllKeysOfSameType())
- {
- return;
- }
- auto pAnimTrack = GetCompoundTrackFromKeys(selectedKeys);
- if (!pAnimTrack)
- {
- return;
- }
- const auto keyTime = selectedKeys.GetKey(0).GetTime();
- m_vector = AZ::Vector4::CreateZero();
- pAnimTrack->GetValue(keyTime, m_vector, false);
- AZ::Vector4 newVector(m_vector);
- if (pVar == mv_x.GetVar())
- {
- newVector.SetX(mv_x);
- }
- else if (pVar == mv_y.GetVar())
- {
- newVector.SetY(mv_y);
- }
- else if (pVar == mv_z.GetVar())
- {
- newVector.SetZ(mv_z);
- }
- else if (pVar == mv_w.GetVar())
- {
- newVector.SetW(mv_w);
- }
- if (newVector.IsClose(m_vector, AZ::Constants::Tolerance))
- {
- return;
- }
- bool isDuringUndo = false;
- AzToolsFramework::ToolsApplicationRequests::Bus::BroadcastResult(
- isDuringUndo, &AzToolsFramework::ToolsApplicationRequests::Bus::Events::IsDuringUndoRedo);
- if (isDuringUndo)
- {
- pAnimTrack->SetValue(keyTime, newVector, false);
- }
- else
- {
- AzToolsFramework::ScopedUndoBatch undoBatch("Set Key Value");
- pAnimTrack->SetValue(keyTime, newVector, false);
- undoBatch.MarkEntityDirty(pSequence->GetSequenceComponentEntityId());
- }
- }
|