3
0

SlideAlongAxisBasedOnAngle.cpp 5.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 "SlideAlongAxisBasedOnAngle.h"
  9. #include "StartingPointCamera/StartingPointCameraUtilities.h"
  10. #include <AzCore/Math/Quaternion.h>
  11. #include <AzCore/Math/Transform.h>
  12. #include <AzCore/Serialization/EditContext.h>
  13. namespace Camera
  14. {
  15. void SlideAlongAxisBasedOnAngle::Reflect(AZ::ReflectContext* reflection)
  16. {
  17. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(reflection);
  18. if (serializeContext)
  19. {
  20. serializeContext->Class<SlideAlongAxisBasedOnAngle>()
  21. ->Version(2)
  22. ->Field("Axis to slide along", &SlideAlongAxisBasedOnAngle::m_axisToSlideAlong)
  23. ->Field("Angle Type", &SlideAlongAxisBasedOnAngle::m_angleTypeToChangeFor)
  24. ->Field("Ignore X Component", &SlideAlongAxisBasedOnAngle::m_ignoreX)
  25. ->Field("Ignore Y Component", &SlideAlongAxisBasedOnAngle::m_ignoreY)
  26. ->Field("Ignore Z Component", &SlideAlongAxisBasedOnAngle::m_ignoreZ)
  27. ->Field("Max Positive Slide Distance", &SlideAlongAxisBasedOnAngle::m_maximumPositiveSlideDistance)
  28. ->Field("Max Negative Slide Distance", &SlideAlongAxisBasedOnAngle::m_maximumNegativeSlideDistance);
  29. AZ::EditContext* editContext = serializeContext->GetEditContext();
  30. if (editContext)
  31. {
  32. editContext->Class<SlideAlongAxisBasedOnAngle>("SlideAlongAxisBasedOnAngle",
  33. "Slide 0..SlideDistance along Axis based on Angle Type. Maps from 90..-90 degrees")
  34. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  35. ->DataElement(AZ::Edit::UIHandlers::ComboBox, &SlideAlongAxisBasedOnAngle::m_axisToSlideAlong, "Axis to slide along",
  36. "The Axis to slide along")
  37. ->EnumAttribute(RelativeAxisType::ForwardBackward, "Forwards and Backwards")
  38. ->EnumAttribute(RelativeAxisType::LeftRight, "Right and Left")
  39. ->EnumAttribute(RelativeAxisType::UpDown, "Up and Down")
  40. ->DataElement(AZ::Edit::UIHandlers::ComboBox, &SlideAlongAxisBasedOnAngle::m_angleTypeToChangeFor, "Angle Type",
  41. "The angle type to base the slide off of")
  42. ->EnumAttribute(EulerAngleType::Pitch, "Pitch")
  43. ->EnumAttribute(EulerAngleType::Roll, "Roll")
  44. ->EnumAttribute(EulerAngleType::Yaw, "Yaw")
  45. ->DataElement(0, &SlideAlongAxisBasedOnAngle::m_maximumPositiveSlideDistance, "Max Positive Slide Distance",
  46. "The maximum distance to slide in the positive")
  47. ->Attribute(AZ::Edit::Attributes::Suffix, "m")
  48. ->DataElement(0, &SlideAlongAxisBasedOnAngle::m_maximumNegativeSlideDistance, "Max Negative Slide Distance",
  49. "The maximum distance to slide in the negative")
  50. ->Attribute(AZ::Edit::Attributes::Suffix, "m")
  51. ->ClassElement(AZ::Edit::ClassElements::Group, "Vector Components To Ignore")
  52. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  53. ->DataElement(0, &SlideAlongAxisBasedOnAngle::m_ignoreX, "X", "When active, the X Component will be ignored.")
  54. ->Attribute(AZ::Edit::Attributes::ReadOnly, &SlideAlongAxisBasedOnAngle::YAndZIgnored)
  55. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues)
  56. ->DataElement(0, &SlideAlongAxisBasedOnAngle::m_ignoreY, "Y", "When active, the Y Component will be ignored.")
  57. ->Attribute(AZ::Edit::Attributes::ReadOnly, &SlideAlongAxisBasedOnAngle::XAndZIgnored)
  58. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues)
  59. ->DataElement(0, &SlideAlongAxisBasedOnAngle::m_ignoreZ, "Z", "When active, the Z Component will be ignored.")
  60. ->Attribute(AZ::Edit::Attributes::ReadOnly, &SlideAlongAxisBasedOnAngle::XAndYIgnored)
  61. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues)
  62. ;
  63. }
  64. }
  65. }
  66. void SlideAlongAxisBasedOnAngle::AdjustLookAtTarget(
  67. [[maybe_unused]] float deltaTime, [[maybe_unused]] const AZ::Transform& targetTransform, AZ::Transform& outLookAtTargetTransform)
  68. {
  69. float angle = GetEulerAngleFromTransform(outLookAtTargetTransform, m_angleTypeToChangeFor);
  70. float currentPositionOnRange = -angle / AZ::Constants::HalfPi;
  71. float slideScale = currentPositionOnRange > 0.0f ? m_maximumPositiveSlideDistance : m_maximumNegativeSlideDistance;
  72. AZ::Vector3 basis = outLookAtTargetTransform.GetBasis(m_axisToSlideAlong);
  73. MaskComponentFromNormalizedVector(basis, m_ignoreX, m_ignoreY, m_ignoreZ);
  74. outLookAtTargetTransform.SetTranslation(outLookAtTargetTransform.GetTranslation() + basis * currentPositionOnRange * slideScale);
  75. }
  76. bool SlideAlongAxisBasedOnAngle::XAndYIgnored() const
  77. {
  78. return m_ignoreX && m_ignoreY;
  79. }
  80. bool SlideAlongAxisBasedOnAngle::XAndZIgnored() const
  81. {
  82. return m_ignoreX && m_ignoreZ;
  83. }
  84. bool SlideAlongAxisBasedOnAngle::YAndZIgnored() const
  85. {
  86. return m_ignoreY && m_ignoreZ;
  87. }
  88. } // namespace Camera