ImGuiBus.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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 <AzCore/EBus/EBus.h>
  10. #include <AzCore/EBus/Event.h>
  11. // Forward Declares
  12. struct ImVec2;
  13. struct ImDrawData;
  14. namespace ImGui
  15. {
  16. // Notes: Hidden - ImGui Off, Input goes to Game
  17. // Visible - ImGui Visible, Input goes to ImGui and consumed from game ( iff discrete input mode is on, else it is not consumed )
  18. // VisibleNoMouse - ImGui Visible, Input goes to Game ( only a state iff discrete input mode is on )
  19. enum class DisplayState
  20. {
  21. Hidden,
  22. Visible
  23. };
  24. // Notes: LockToResolution - Lock ImGui Render to a supplied resolution, regardless of LY Render Resolution
  25. // MatchRenderResolution - Render ImGui at Render Resolution
  26. // MatchToMaxRenderResolution - Render ImGui at Render Resolution, up to some maximum resolution, then Render at that max resolution.
  27. enum class ImGuiResolutionMode
  28. {
  29. LockToResolution = 0,
  30. MatchRenderResolution,
  31. MatchToMaxRenderResolution
  32. };
  33. // Notes: Contextual - Use the Controller Stick and buttons to navigate ImGui as a contextual menu
  34. // Mouse - Use the Controller stick and buttons as a virtual mouse within ImGui.
  35. namespace ImGuiControllerModeFlags
  36. {
  37. typedef AZ::u8 FlagType;
  38. constexpr FlagType
  39. Contextual = 1 << 0,
  40. Mouse = 1 << 1;
  41. }
  42. // Bus for getting updates from ImGui manager
  43. class IImGuiUpdateListener : public AZ::EBusTraits
  44. {
  45. public:
  46. static const char* GetUniqueName() { return "IImGuiUpdateListener"; }
  47. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
  48. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
  49. using Bus = AZ::EBus<IImGuiUpdateListener>;
  50. // ImGui Lifecycle Callbacks
  51. virtual void OnImGuiInitialize() {}
  52. virtual void OnImGuiUpdate() {}
  53. virtual void OnImGuiMainMenuUpdate() {}
  54. virtual void OnOpenEditorWindow() {}
  55. };
  56. typedef AZ::EBus<IImGuiUpdateListener> ImGuiUpdateListenerBus;
  57. // Bus for sending events and getting state from the ImGui manager
  58. class IImGuiManager
  59. {
  60. public:
  61. AZ_RTTI(IImGuiManager, "{F5A0F08B-F2DA-43B7-8CD2-C6FC71E1A712}");
  62. virtual ~IImGuiManager() = default;
  63. static const char* GetUniqueName() { return "IImGuiManager"; }
  64. virtual DisplayState GetDisplayState() const = 0;
  65. virtual void SetDisplayState(DisplayState state) = 0;
  66. virtual bool IsControllerSupportModeEnabled(ImGuiControllerModeFlags::FlagType controllerMode) const = 0;
  67. virtual void EnableControllerSupportMode(ImGuiControllerModeFlags::FlagType controllerMode, bool enable) = 0;
  68. virtual void SetControllerMouseSensitivity(float sensitivity) = 0;
  69. virtual float GetControllerMouseSensitivity() const = 0;
  70. virtual bool GetEnableDiscreteInputMode() const = 0;
  71. virtual void SetEnableDiscreteInputMode(bool enabled) = 0;
  72. virtual ImGuiResolutionMode GetResolutionMode() const = 0;
  73. virtual void SetResolutionMode(ImGuiResolutionMode state) = 0;
  74. virtual const ImVec2& GetImGuiRenderResolution() const = 0;
  75. virtual void SetImGuiRenderResolution(const ImVec2& res) = 0;
  76. virtual void OverrideRenderWindowSize(uint32_t width, uint32_t height) = 0;
  77. virtual void RestoreRenderWindowSizeToDefault() = 0;
  78. virtual void ToggleThroughImGuiVisibleState() = 0;
  79. virtual void ToggleToImGuiVisibleState(DisplayState state) = 0;
  80. virtual void SetDpiScalingFactor(float dpiScalingFactor) = 0;
  81. virtual float GetDpiScalingFactor() const = 0;
  82. virtual ImDrawData* GetImguiDrawData() = 0;
  83. using ImGuiSetEnabledEvent = AZ::Event<bool>;
  84. ImGuiSetEnabledEvent m_setEnabledEvent;
  85. // interface
  86. void ConnectImGuiSetEnabledChangedHandler(ImGuiSetEnabledEvent::Handler& handler)
  87. {
  88. handler.Connect(m_setEnabledEvent);
  89. }
  90. };
  91. class IImGuiManagerRequests
  92. : public AZ::EBusTraits
  93. {
  94. public:
  95. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
  96. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
  97. using Bus = AZ::EBus<IImGuiManager>;
  98. };
  99. using ImGuiManagerBus = AZ::EBus<IImGuiManager, IImGuiManagerRequests>;
  100. class IImGuiManagerNotifications : public AZ::EBusTraits
  101. {
  102. public:
  103. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
  104. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
  105. using Bus = AZ::EBus<IImGuiManagerNotifications>;
  106. virtual void ImGuiSetEnabled( [[maybe_unused]] bool enabled) {}
  107. };
  108. using ImGuiManagerNotificationBus = AZ::EBus<IImGuiManagerNotifications>;
  109. // Bus for getting notifications from the IMGUI Entity Outliner
  110. class IImGuiEntityOutlinerNotifications : public AZ::EBusTraits
  111. {
  112. public:
  113. static const char* GetUniqueName() { return "IImGuiEntityOutlinerNotifications"; }
  114. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple;
  115. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
  116. using Bus = AZ::EBus<IImGuiEntityOutlinerNotifications>;
  117. // Callback for game code to handle targetting an IMGUI entity
  118. virtual void OnImGuiEntityOutlinerTarget(AZ::EntityId target) { (void)target; }
  119. };
  120. typedef AZ::EBus<IImGuiEntityOutlinerNotifications> ImGuiEntityOutlinerNotificationBus;
  121. // a pair of an entity id, and a typeid, used to represent component rtti type info
  122. typedef AZStd::pair<AZ::EntityId, AZ::TypeId> ImGuiEntComponentId;
  123. // Bus for requests to the IMGUI Entity Outliner
  124. class IImGuiEntityOutlinerRequests : public AZ::EBusTraits
  125. {
  126. public:
  127. static const char* GetUniqueName() { return "IImGuiEntityOutlinerRequests"; }
  128. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
  129. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
  130. using Bus = AZ::EBus<IImGuiEntityOutlinerRequests>;
  131. // Requests for the ImGui Entity Outliner
  132. virtual void RemoveEntityView(AZ::EntityId entity) = 0;
  133. virtual void RequestEntityView(AZ::EntityId entity) = 0;
  134. virtual void RemoveComponentView(ImGuiEntComponentId component) = 0;
  135. virtual void RequestComponentView(ImGuiEntComponentId component) = 0;
  136. virtual void RequestAllViewsForComponent(const AZ::TypeId& comType) = 0;
  137. virtual void EnableTargetViewMode(bool enabled) = 0;
  138. virtual void EnableComponentDebug(const AZ::TypeId& comType, int priority = 1, bool enableMenuBar = false) = 0;
  139. virtual void SetEnabled(bool enabled) = 0;
  140. virtual void AddAutoEnableSearchString(const AZStd::string& searchString) = 0;
  141. };
  142. typedef AZ::EBus<IImGuiEntityOutlinerRequests> ImGuiEntityOutlinerRequestBus;
  143. // Bus for requests to the IMGUI Asset Explorer
  144. class IImGuiAssetExplorerRequests : public AZ::EBusTraits
  145. {
  146. public:
  147. static const char* GetUniqueName() { return "IImGuiAssetExplorerRequests"; }
  148. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
  149. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
  150. using Bus = AZ::EBus<IImGuiAssetExplorerRequests>;
  151. // Requests for the ImGui Asset Explorer
  152. virtual void SetEnabled(bool enabled) = 0;
  153. };
  154. typedef AZ::EBus<IImGuiAssetExplorerRequests> ImGuiAssetExplorerRequestBus;
  155. // Bus for requests to the IMGUI Camera Monitor
  156. class IImGuiCameraMonitorRequests : public AZ::EBusTraits
  157. {
  158. public:
  159. static const char* GetUniqueName() { return "IImGuiCameraMonitorRequests"; }
  160. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
  161. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
  162. using Bus = AZ::EBus<IImGuiCameraMonitorRequests>;
  163. // Requests for the ImGui Camera Monitor
  164. virtual void SetEnabled(bool enabled) = 0;
  165. };
  166. typedef AZ::EBus<IImGuiCameraMonitorRequests> ImGuiCameraMonitorRequestBus;
  167. // Bus for getting debug Component updates from ImGui manager
  168. class IImGuiUpdateDebugComponentListener : public AZ::EBusTraits
  169. {
  170. public:
  171. static const char* GetUniqueName() { return "IImGuiUpdateDebugComponentListener"; }
  172. static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
  173. using BusIdType = ImGuiEntComponentId;
  174. using Bus = AZ::EBus<IImGuiUpdateDebugComponentListener>;
  175. // AZ_RTTI required on this EBUS, this allows us to iterate through the handlers of this EBUS and deduce their type.
  176. AZ_RTTI(IImGuiUpdateDebugComponentListener, "{825B883F-A806-4304-AF82-C412AC5EC27B}");
  177. // OnImGuiDebugLYComponentUpdate - must implement this, this is the callback for a componenet instance
  178. // to draw it's required debugging information.
  179. virtual void OnImGuiDebugLYComponentUpdate() = 0;
  180. // GetComponentDebugPriority - an optional implementation. The Entity Outliner will ask components what their debug priority
  181. // is, no override on the handler will return the below value of 1, you can optionally override in the handler to give it
  182. // a higher priority. Priority only really matters for giving a shortcut to the highest priority debugging component on a given entity
  183. virtual int GetComponentDebugPriority() { return 1; }
  184. // GetEnableMenuBar - an optional implementation. Components can define if their debug view uses a menu bar. False by default
  185. virtual bool GetEnableMenuBar() { return false; }
  186. // Connection Policy, at component connect time, Ask the component what priority they are via ebus, then
  187. // register that component type with the priority returned with the Entity Outliner
  188. template<class Bus>
  189. struct ConnectionPolicy
  190. : public AZ::EBusConnectionPolicy<Bus>
  191. {
  192. static void Connect(typename Bus::BusPtr& busPtr, typename Bus::Context& context, typename Bus::HandlerNode& handler, typename Bus::Context::ConnectLockGuard& connectLock, const typename Bus::BusIdType& id = 0)
  193. {
  194. AZ::EBusConnectionPolicy<Bus>::Connect(busPtr, context, handler, connectLock, id);
  195. // Get the debug priority for the component
  196. int priority = 1;
  197. AZ::EBus<IImGuiUpdateDebugComponentListener>::EventResult( priority, id, &AZ::EBus<IImGuiUpdateDebugComponentListener>::Events::GetComponentDebugPriority);
  198. // Get the debug priority for the component
  199. bool enableMenuBar = false;
  200. AZ::EBus<IImGuiUpdateDebugComponentListener>::EventResult(enableMenuBar, id, &AZ::EBus<IImGuiUpdateDebugComponentListener>::Events::GetEnableMenuBar);
  201. // Register
  202. ImGuiEntityOutlinerRequestBus::Broadcast(&ImGuiEntityOutlinerRequestBus::Events::EnableComponentDebug, id.second, priority, enableMenuBar);
  203. }
  204. static void Disconnect(typename Bus::Context& context, typename Bus::HandlerNode& handler, typename Bus::BusPtr& busPtr)
  205. {
  206. AZ::EBusConnectionPolicy<Bus>::Disconnect(context, handler, busPtr);
  207. if (busPtr)
  208. {
  209. ImGuiEntityOutlinerRequestBus::Broadcast(&ImGuiEntityOutlinerRequestBus::Events::RemoveComponentView, busPtr->m_busId);
  210. }
  211. }
  212. };
  213. };
  214. typedef AZ::EBus<IImGuiUpdateDebugComponentListener> ImGuiUpdateDebugComponentListenerBus;
  215. }