FollowTargetFromDistance.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "FollowTargetFromDistance.h"
  9. #include <AzCore/Math/Transform.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <AzCore/Math/Crc.h>
  12. #include <AzCore/Serialization/EditContext.h>
  13. #include <AzCore/Component/ComponentApplicationBus.h>
  14. #include "StartingPointCamera/StartingPointCameraConstants.h"
  15. #include "StartingPointCamera/StartingPointCameraUtilities.h"
  16. namespace Camera
  17. {
  18. void FollowTargetFromDistance::Reflect(AZ::ReflectContext* reflection)
  19. {
  20. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection);
  21. if (serializeContext)
  22. {
  23. serializeContext->Class<FollowTargetFromDistance>()
  24. ->Version(2)
  25. ->Field("Follow Distance", &FollowTargetFromDistance::m_followDistance)
  26. ->Field("Minimum Follow Distance", &FollowTargetFromDistance::m_minFollowDistance)
  27. ->Field("Maximum Follow Distance", &FollowTargetFromDistance::m_maxFollowDistance)
  28. ->Field("Zoom In Event Name", &FollowTargetFromDistance::m_zoomInEventName)
  29. ->Field("Zoom Out Event Name", &FollowTargetFromDistance::m_zoomOutEventName)
  30. ->Field("Zoom Speed Scale", &FollowTargetFromDistance::m_zoomSpeedScale)
  31. ->Field("Input Source Entity", &FollowTargetFromDistance::m_channelId);
  32. AZ::EditContext* editContext = serializeContext->GetEditContext();
  33. if (editContext)
  34. {
  35. editContext->Class<FollowTargetFromDistance>("FollowTargetFromDistance", "Follows behind the target by Follow Distance meters")
  36. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  37. ->DataElement(0, &FollowTargetFromDistance::m_followDistance, "Follow Distance", "The distance to follow behind the target in meters")
  38. ->Attribute(AZ::Edit::Attributes::Suffix, "m")
  39. ->Attribute(AZ::Edit::Attributes::Min, &FollowTargetFromDistance::GetMinimumFollowDistance)
  40. ->Attribute(AZ::Edit::Attributes::Max, &FollowTargetFromDistance::GetMaximumFollowDistance)
  41. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ_CRC_CE("RefreshAttributesAndValues"))
  42. ->DataElement(0, &FollowTargetFromDistance::m_minFollowDistance, "Minimum Follow Distance", "The MINIMUM distance to follow the behind the target in meters")
  43. ->Attribute(AZ::Edit::Attributes::Suffix, "m")
  44. ->Attribute(AZ::Edit::Attributes::Min, 0.f)
  45. ->Attribute(AZ::Edit::Attributes::Max, &FollowTargetFromDistance::GetMaximumFollowDistance)
  46. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ_CRC_CE("RefreshAttributesAndValues"))
  47. ->DataElement(0, &FollowTargetFromDistance::m_maxFollowDistance, "Maximum Follow Distance", "The MAXIMUM distance to follow the behind the target in meters")
  48. ->Attribute(AZ::Edit::Attributes::Suffix, "m")
  49. ->Attribute(AZ::Edit::Attributes::Min, &FollowTargetFromDistance::GetMinimumFollowDistance)
  50. ->Attribute(AZ::Edit::Attributes::Max, std::numeric_limits<float>::max())
  51. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ_CRC_CE("RefreshAttributesAndValues"))
  52. ->DataElement(0, &FollowTargetFromDistance::m_zoomInEventName, "Zoom In Event Name", "The name of the event to trigger a zoom in")
  53. ->DataElement(0, &FollowTargetFromDistance::m_zoomOutEventName, "Zoom Out Event Name", "The name of the event to trigger a zoom out")
  54. ->DataElement(0, &FollowTargetFromDistance::m_zoomSpeedScale, "Zoom Speed Scale", "The amount to scale the incoming zoom event by");
  55. }
  56. }
  57. }
  58. void FollowTargetFromDistance::AdjustCameraTransform(float /*deltaTime*/, const AZ::Transform& /*initialCameraTransform*/, const AZ::Transform& targetTransform, AZ::Transform& inOutCameraTransform)
  59. {
  60. inOutCameraTransform.SetTranslation(targetTransform.GetTranslation() - targetTransform.GetBasis(ForwardBackward) * m_followDistance);
  61. }
  62. void FollowTargetFromDistance::Activate(AZ::EntityId channelId)
  63. {
  64. m_channelId = channelId;
  65. if (!m_zoomInEventName.empty())
  66. {
  67. AZ::GameplayNotificationId busId(m_channelId, AZ_CRC(m_zoomInEventName.c_str()));
  68. AZ::GameplayNotificationBus::MultiHandler::BusConnect(busId);
  69. }
  70. if (!m_zoomOutEventName.empty())
  71. {
  72. AZ::GameplayNotificationId busId(m_channelId, AZ_CRC(m_zoomOutEventName.c_str()));
  73. AZ::GameplayNotificationBus::MultiHandler::BusConnect(busId);
  74. }
  75. }
  76. void FollowTargetFromDistance::Deactivate()
  77. {
  78. if (!m_zoomInEventName.empty())
  79. {
  80. AZ::GameplayNotificationId busId(m_channelId, AZ_CRC(m_zoomInEventName.c_str()));
  81. AZ::GameplayNotificationBus::MultiHandler::BusDisconnect(busId);
  82. }
  83. if (!m_zoomOutEventName.empty())
  84. {
  85. AZ::GameplayNotificationId busId(m_channelId, AZ_CRC(m_zoomOutEventName.c_str()));
  86. AZ::GameplayNotificationBus::MultiHandler::BusDisconnect(busId);
  87. }
  88. }
  89. void FollowTargetFromDistance::OnEventBegin(const AZStd::any& value)
  90. {
  91. float floatValue = 0.0f;
  92. AZ_Warning("FollowTargetFromDistance", AZStd::any_numeric_cast<float>(&value, floatValue), "Received bad value, expected type numerically convertable to float, got type %s", GetNameFromUuid(value.type()));
  93. if (AZStd::any_numeric_cast<float>(&value, floatValue))
  94. {
  95. m_followDistance = AZ::GetClamp(m_followDistance - (floatValue * m_zoomSpeedScale), m_minFollowDistance, m_maxFollowDistance);
  96. }
  97. }
  98. } // namespace Camera