3
0

UiImageSequenceComponent.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. #pragma once
  9. #include "EditorPropertyTypes.h"
  10. #include <LyShine/Bus/UiVisualBus.h>
  11. #include <LyShine/Bus/UiRenderBus.h>
  12. #include <LyShine/Bus/UiImageSequenceBus.h>
  13. #include <LyShine/Bus/UiCanvasBus.h>
  14. #include <LyShine/Bus/UiTransformBus.h>
  15. #include <LyShine/Bus/UiIndexableImageBus.h>
  16. #include <LyShine/Bus/UiEditorChangeNotificationBus.h>
  17. #include <LyShine/UiComponentTypes.h>
  18. #include <LyShine/UiRenderFormats.h>
  19. #include <AzCore/Component/Component.h>
  20. #include <AzCore/Serialization/SerializeContext.h>
  21. #include <LmbrCentral/Rendering/TextureAsset.h>
  22. //! \brief Image component capable of indexing and displaying from multiple image files in a directory.
  23. //!
  24. //! This component offers functionality similar to a sprite-sheet being used with
  25. //! an image component. Instead of indexing multiple images mapped within a single
  26. //! sprite-sheet, this component indexes multiple image files.
  27. //!
  28. //! Note that this only supports fixed image types - the image component is more
  29. //! fully featured for rendering images.
  30. class UiImageSequenceComponent
  31. : public AZ::Component
  32. , public UiVisualBus::Handler
  33. , public UiRenderBus::Handler
  34. , public UiImageSequenceBus::Handler
  35. , public UiIndexableImageBus::Handler
  36. , public UiTransformChangeNotificationBus::Handler
  37. , public UiCanvasPixelAlignmentNotificationBus::Handler
  38. , public UiEditorRefreshDirectoryNotificationBus::Handler
  39. {
  40. public: // types
  41. using TextureAssetRef = AzFramework::SimpleAssetReference<LmbrCentral::TextureAsset>;
  42. using ImageList = AZStd::vector<TextureAssetRef>;
  43. using SpriteList = AZStd::vector<ISprite*>;
  44. public: // member functions
  45. AZ_COMPONENT(UiImageSequenceComponent, LyShine::UiImageSequenceComponentUuid, AZ::Component);
  46. UiImageSequenceComponent();
  47. ~UiImageSequenceComponent() override;
  48. // UiEditorRefreshDirectoryNotificationInterface
  49. void OnRefreshDirectory() override { OnImageSequenceDirectoryChange(); }
  50. // ~UiEditorRefreshDirectoryNotificationInterface
  51. // UiVisualInterface
  52. void ResetOverrides() override {}
  53. void SetOverrideColor(const AZ::Color& /* color */) override {}
  54. void SetOverrideAlpha(float /* alpha */) override {}
  55. void SetOverrideSprite(ISprite* /* sprite */, AZ::u32 /*cellIndex = 0 */) override {}
  56. // ~UiVisualInterface
  57. // UiRenderInterface
  58. void Render(LyShine::IRenderGraph* renderGraph) override;
  59. // ~UiRenderInterface
  60. // UiImageSequenceInterface
  61. ImageType GetImageType() override;
  62. void SetImageType(ImageType imageType) override;
  63. // ~UiImageSequenceInterface
  64. // UiIndexableImageBus
  65. void SetImageIndex(AZ::u32 index) override;
  66. const AZ::u32 GetImageIndex() override;
  67. const AZ::u32 GetImageIndexCount() override;
  68. AZStd::string GetImageIndexAlias(AZ::u32 index) override;
  69. void SetImageIndexAlias(AZ::u32 index, const AZStd::string& alias) override;
  70. AZ::u32 GetImageIndexFromAlias(const AZStd::string& alias) override;
  71. // ~UiIndexableImageBus
  72. // UiTransformChangeNotification
  73. void OnCanvasSpaceRectChanged(AZ::EntityId entityId, const UiTransformInterface::Rect& oldRect, const UiTransformInterface::Rect& newRect) override;
  74. void OnTransformToViewportChanged() override;
  75. // ~UiTransformChangeNotification
  76. // UiCanvasPixelAlignmentNotification
  77. void OnCanvasPixelAlignmentChange() override;
  78. // ~UiCanvasPixelAlignmentNotification
  79. public: // static member functions
  80. static void Reflect(AZ::ReflectContext* context);
  81. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  82. {
  83. provided.push_back(AZ_CRC("UiVisualService", 0xa864fdf8));
  84. provided.push_back(AZ_CRC("UiIndexableImageService"));
  85. }
  86. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  87. {
  88. incompatible.push_back(AZ_CRC("UiVisualService", 0xa864fdf8));
  89. }
  90. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  91. {
  92. required.push_back(AZ_CRC("UiElementService", 0x3dca7ad4));
  93. required.push_back(AZ_CRC("UiTransformService", 0x3a838e34));
  94. }
  95. protected: // member functions
  96. // AZ::Component
  97. void Init() override;
  98. void Activate() override;
  99. void Deactivate() override;
  100. // ~AZ::Component
  101. private: // member functions
  102. AZ_DISABLE_COPY_MOVE(UiImageSequenceComponent);
  103. LyShine::AZu32ComboBoxVec PopulateIndexStringList();
  104. void OnImageTypeChange();
  105. void OnImageSequenceDirectoryChange();
  106. void OnImageSequenceIndexChange();
  107. void RenderStretchedSprite(ISprite* sprite, int cellIndex, uint32 packedColor);
  108. void RenderFixedSprite(ISprite* sprite, int cellIndex, uint32 packedColor);
  109. void RenderStretchedToFitOrFillSprite(ISprite* sprite, int cellIndex, uint32 packedColor, bool toFit);
  110. void RenderSingleQuad(const AZ::Vector2* positions, const AZ::Vector2* uvs, uint32 packedColor);
  111. bool IsPixelAligned();
  112. void RenderTriangleList(const LyShine::UiPrimitiveVertex* vertices, const uint16* indices, int numVertices, int numIndices);
  113. void ClearCachedVertices();
  114. void ClearCachedIndices();
  115. void MarkRenderCacheDirty();
  116. private: // static member functions
  117. static bool VersionConverter(AZ::SerializeContext& context,
  118. AZ::SerializeContext::DataElementNode& classElement);
  119. private: // data
  120. ImageList m_imageList; //!< List of image files to load
  121. SpriteList m_spriteList; //!< List of loaded sprites
  122. AZStd::string m_imageSequenceDirectory; //!< Used to populate m_imageList, only populated from the editor
  123. AZ::u32 m_sequenceIndex = 0; //!< Index of image currently displayed
  124. ImageType m_imageType = ImageType::Fixed; //!< Affects how the texture/sprite is mapped to the image rectangle
  125. // cached rendering data for performance optimization
  126. LyShine::UiPrimitive m_cachedPrimitive;
  127. bool m_isRenderCacheDirty = true;
  128. };