ColliderComponentMode.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  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 <Editor/ColliderComponentMode.h>
  9. #include <AzFramework/Physics/ShapeConfiguration.h>
  10. #include <AzToolsFramework/API/ComponentModeCollectionInterface.h>
  11. #include <AzToolsFramework/API/ToolsApplicationAPI.h>
  12. #include <AzToolsFramework/ActionManager/Action/ActionManagerInterface.h>
  13. #include <AzToolsFramework/ActionManager/HotKey/HotKeyManagerInterface.h>
  14. #include <AzToolsFramework/ActionManager/Menu/MenuManagerInterface.h>
  15. #include <AzToolsFramework/ComponentModes/BoxComponentMode.h>
  16. #include <AzToolsFramework/ComponentModes/BoxViewportEdit.h>
  17. #include <AzToolsFramework/Editor/ActionManagerIdentifiers/EditorContextIdentifiers.h>
  18. #include <AzToolsFramework/Editor/ActionManagerIdentifiers/EditorMenuIdentifiers.h>
  19. #include <Editor/ColliderAssetScaleMode.h>
  20. #include <Editor/ColliderBoxMode.h>
  21. #include <Editor/ColliderCapsuleMode.h>
  22. #include <Editor/ColliderCylinderMode.h>
  23. #include <Editor/ColliderOffsetMode.h>
  24. #include <Editor/ColliderRotationMode.h>
  25. #include <Editor/ColliderSphereMode.h>
  26. #include <Editor/Source/ComponentModes/PhysXSubComponentModeBase.h>
  27. #include <PhysX/EditorColliderComponentRequestBus.h>
  28. namespace PhysX
  29. {
  30. namespace
  31. {
  32. //! Uri's for shortcut actions.
  33. const AZ::Crc32 SetDimensionsSubModeActionUri = AZ_CRC_CE("org.o3de.action.physx.setdimensionssubmode");
  34. const AZ::Crc32 SetOffsetSubModeActionUri = AZ_CRC_CE("org.o3de.action.physx.setoffsetsubmode");
  35. const AZ::Crc32 SetRotationSubModeActionUri = AZ_CRC_CE("org.o3de.action.physx.setrotationsubmode");
  36. const AZ::Crc32 ResetSubModeActionUri = AZ_CRC_CE("org.o3de.action.physx.resetsubmode");
  37. } // namespace
  38. AZ_CLASS_ALLOCATOR_IMPL(ColliderComponentMode, AZ::SystemAllocator);
  39. void ColliderComponentMode::Reflect(AZ::ReflectContext* context)
  40. {
  41. AzToolsFramework::ComponentModeFramework::ReflectEditorBaseComponentModeDescendant<ColliderComponentMode>(context);
  42. }
  43. void ColliderComponentMode::RegisterActions()
  44. {
  45. auto actionManagerInterface = AZ::Interface<AzToolsFramework::ActionManagerInterface>::Get();
  46. AZ_Assert(actionManagerInterface, "ColliderComponentMode - could not get ActionManagerInterface on RegisterActions.");
  47. auto hotKeyManagerInterface = AZ::Interface<AzToolsFramework::HotKeyManagerInterface>::Get();
  48. AZ_Assert(hotKeyManagerInterface, "ColliderComponentMode - could not get HotKeyManagerInterface on RegisterActions.");
  49. // Set Offset Sub-Mode
  50. {
  51. constexpr AZStd::string_view actionIdentifier = "o3de.action.colliderComponentMode.setOffsetSubMode";
  52. AzToolsFramework::ActionProperties actionProperties;
  53. actionProperties.m_name = "Set Offset Mode";
  54. actionProperties.m_description = "Set Offset Mode";
  55. actionProperties.m_category = "Collider Component Mode";
  56. actionManagerInterface->RegisterAction(
  57. EditorIdentifiers::MainWindowActionContextIdentifier,
  58. actionIdentifier,
  59. actionProperties,
  60. []
  61. {
  62. auto componentModeCollectionInterface = AZ::Interface<AzToolsFramework::ComponentModeCollectionInterface>::Get();
  63. AZ_Assert(componentModeCollectionInterface, "Could not retrieve component mode collection.");
  64. componentModeCollectionInterface->EnumerateActiveComponents(
  65. [](const AZ::EntityComponentIdPair& entityComponentIdPair, const AZ::Uuid&)
  66. {
  67. ColliderComponentModeRequestBus::Event(
  68. entityComponentIdPair, &ColliderComponentModeRequests::SetCurrentMode, SubMode::Offset);
  69. }
  70. );
  71. }
  72. );
  73. hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "1");
  74. }
  75. // Set Rotation Sub-Mode
  76. {
  77. constexpr AZStd::string_view actionIdentifier = "o3de.action.colliderComponentMode.setRotationSubMode";
  78. AzToolsFramework::ActionProperties actionProperties;
  79. actionProperties.m_name = "Set Rotation Mode";
  80. actionProperties.m_description = "Set Rotation Mode";
  81. actionProperties.m_category = "Collider Component Mode";
  82. actionManagerInterface->RegisterAction(
  83. EditorIdentifiers::MainWindowActionContextIdentifier,
  84. actionIdentifier,
  85. actionProperties,
  86. []
  87. {
  88. auto componentModeCollectionInterface = AZ::Interface<AzToolsFramework::ComponentModeCollectionInterface>::Get();
  89. AZ_Assert(componentModeCollectionInterface, "Could not retrieve component mode collection.");
  90. componentModeCollectionInterface->EnumerateActiveComponents(
  91. [](const AZ::EntityComponentIdPair& entityComponentIdPair, const AZ::Uuid&)
  92. {
  93. ColliderComponentModeRequestBus::Event(
  94. entityComponentIdPair, &ColliderComponentModeRequests::SetCurrentMode, SubMode::Rotation);
  95. }
  96. );
  97. }
  98. );
  99. hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "2");
  100. }
  101. // Set Resize Sub-Mode
  102. {
  103. constexpr AZStd::string_view actionIdentifier = "o3de.action.colliderComponentMode.setResizeSubMode";
  104. AzToolsFramework::ActionProperties actionProperties;
  105. actionProperties.m_name = "Set Resize Mode";
  106. actionProperties.m_description = "Set Resize Mode";
  107. actionProperties.m_category = "Collider Component Mode";
  108. actionManagerInterface->RegisterAction(
  109. EditorIdentifiers::MainWindowActionContextIdentifier,
  110. actionIdentifier,
  111. actionProperties,
  112. []
  113. {
  114. auto componentModeCollectionInterface = AZ::Interface<AzToolsFramework::ComponentModeCollectionInterface>::Get();
  115. AZ_Assert(componentModeCollectionInterface, "Could not retrieve component mode collection.");
  116. componentModeCollectionInterface->EnumerateActiveComponents(
  117. [](const AZ::EntityComponentIdPair& entityComponentIdPair, const AZ::Uuid&)
  118. {
  119. ColliderComponentModeRequestBus::Event(
  120. entityComponentIdPair, &ColliderComponentModeRequests::SetCurrentMode, SubMode::Dimensions);
  121. }
  122. );
  123. }
  124. );
  125. hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "3");
  126. }
  127. // Reset Current Mode
  128. {
  129. constexpr AZStd::string_view actionIdentifier = "o3de.action.colliderComponentMode.resetCurrentMode";
  130. AzToolsFramework::ActionProperties actionProperties;
  131. actionProperties.m_name = "Reset Current Mode";
  132. actionProperties.m_description = "Reset Current Mode";
  133. actionProperties.m_category = "Collider Component Mode";
  134. actionManagerInterface->RegisterAction(
  135. EditorIdentifiers::MainWindowActionContextIdentifier,
  136. actionIdentifier,
  137. actionProperties,
  138. []
  139. {
  140. auto componentModeCollectionInterface = AZ::Interface<AzToolsFramework::ComponentModeCollectionInterface>::Get();
  141. AZ_Assert(componentModeCollectionInterface, "Could not retrieve component mode collection.");
  142. componentModeCollectionInterface->EnumerateActiveComponents(
  143. [](const AZ::EntityComponentIdPair& entityComponentIdPair, const AZ::Uuid&)
  144. {
  145. ColliderComponentModeRequestBus::Event(
  146. entityComponentIdPair, &ColliderComponentModeRequests::ResetCurrentMode);
  147. }
  148. );
  149. }
  150. );
  151. hotKeyManagerInterface->SetActionHotKey(actionIdentifier, "R");
  152. }
  153. }
  154. void ColliderComponentMode::BindActionsToModes()
  155. {
  156. auto actionManagerInterface = AZ::Interface<AzToolsFramework::ActionManagerInterface>::Get();
  157. AZ_Assert(actionManagerInterface, "ColliderComponentMode - could not get ActionManagerInterface on BindActionsToModes.");
  158. AZ::SerializeContext* serializeContext = nullptr;
  159. AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext);
  160. AZStd::string modeIdentifier = AZStd::string::format(
  161. "o3de.context.mode.%s", serializeContext->FindClassData(azrtti_typeid<ColliderComponentMode>())->m_name);
  162. actionManagerInterface->AssignModeToAction(modeIdentifier, "o3de.action.colliderComponentMode.setOffsetSubMode");
  163. actionManagerInterface->AssignModeToAction(modeIdentifier, "o3de.action.colliderComponentMode.setRotationSubMode");
  164. actionManagerInterface->AssignModeToAction(modeIdentifier, "o3de.action.colliderComponentMode.setResizeSubMode");
  165. actionManagerInterface->AssignModeToAction(modeIdentifier, "o3de.action.colliderComponentMode.resetCurrentMode");
  166. }
  167. void ColliderComponentMode::BindActionsToMenus()
  168. {
  169. auto menuManagerInterface = AZ::Interface<AzToolsFramework::MenuManagerInterface>::Get();
  170. AZ_Assert(menuManagerInterface, "ColliderComponentMode - could not get MenuManagerInterface on BindActionsToMenus.");
  171. menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditMenuIdentifier, "o3de.action.colliderComponentMode.setOffsetSubMode", 6000);
  172. menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditMenuIdentifier, "o3de.action.colliderComponentMode.setRotationSubMode", 6001);
  173. menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditMenuIdentifier, "o3de.action.colliderComponentMode.setResizeSubMode", 6002);
  174. menuManagerInterface->AddActionToMenu(EditorIdentifiers::EditMenuIdentifier, "o3de.action.colliderComponentMode.resetCurrentMode", 6003);
  175. }
  176. ColliderComponentMode::ColliderComponentMode(const AZ::EntityComponentIdPair& entityComponentIdPair, AZ::Uuid componentType)
  177. : AzToolsFramework::ComponentModeFramework::EditorBaseComponentMode(entityComponentIdPair, componentType)
  178. {
  179. CreateSubModes();
  180. CreateSubModeSelectionCluster();
  181. ColliderComponentModeRequestBus::Handler::BusConnect(entityComponentIdPair);
  182. ColliderComponentModeUiRequestBus::Handler::BusConnect(entityComponentIdPair);
  183. }
  184. ColliderComponentMode::~ColliderComponentMode()
  185. {
  186. ColliderComponentModeUiRequestBus::Handler::BusDisconnect();
  187. ColliderComponentModeRequestBus::Handler::BusDisconnect();
  188. RemoveSubModeSelectionCluster();
  189. m_subModes[m_subMode]->Teardown(GetEntityComponentIdPair());
  190. }
  191. void ColliderComponentMode::Refresh()
  192. {
  193. m_subModes[m_subMode]->Refresh(GetEntityComponentIdPair());
  194. }
  195. AZStd::vector<AzToolsFramework::ActionOverride> ColliderComponentMode::PopulateActionsImpl()
  196. {
  197. AzToolsFramework::ActionOverride setOffsetModeAction;
  198. setOffsetModeAction.SetUri(SetOffsetSubModeActionUri);
  199. setOffsetModeAction.SetKeySequence(QKeySequence(Qt::Key_1));
  200. setOffsetModeAction.SetTitle("Set Offset Mode");
  201. setOffsetModeAction.SetTip("Set offset mode");
  202. setOffsetModeAction.SetEntityComponentIdPair(GetEntityComponentIdPair());
  203. setOffsetModeAction.SetCallback(
  204. [this]()
  205. {
  206. SetCurrentMode(SubMode::Offset);
  207. });
  208. AzToolsFramework::ActionOverride setRotationModeAction;
  209. setRotationModeAction.SetUri(SetRotationSubModeActionUri);
  210. setRotationModeAction.SetKeySequence(QKeySequence(Qt::Key_2));
  211. setRotationModeAction.SetTitle("Set Rotation Mode");
  212. setRotationModeAction.SetTip("Set rotation mode");
  213. setRotationModeAction.SetEntityComponentIdPair(GetEntityComponentIdPair());
  214. setRotationModeAction.SetCallback(
  215. [this]()
  216. {
  217. SetCurrentMode(SubMode::Rotation);
  218. });
  219. AzToolsFramework::ActionOverride setDimensionsModeAction;
  220. setDimensionsModeAction.SetUri(SetDimensionsSubModeActionUri);
  221. setDimensionsModeAction.SetKeySequence(QKeySequence(Qt::Key_3));
  222. setDimensionsModeAction.SetTitle("Set Resize Mode");
  223. setDimensionsModeAction.SetTip("Set resize mode");
  224. setDimensionsModeAction.SetEntityComponentIdPair(GetEntityComponentIdPair());
  225. setDimensionsModeAction.SetCallback(
  226. [this]()
  227. {
  228. SetCurrentMode(SubMode::Dimensions);
  229. });
  230. AzToolsFramework::ActionOverride resetModeAction;
  231. resetModeAction.SetUri(ResetSubModeActionUri);
  232. resetModeAction.SetKeySequence(QKeySequence(Qt::Key_R));
  233. resetModeAction.SetTitle("Reset Current Mode");
  234. resetModeAction.SetTip("Reset current mode");
  235. resetModeAction.SetEntityComponentIdPair(GetEntityComponentIdPair());
  236. resetModeAction.SetCallback(
  237. [this]()
  238. {
  239. ResetCurrentMode();
  240. });
  241. return { setDimensionsModeAction, setOffsetModeAction, setRotationModeAction, resetModeAction };
  242. }
  243. void ColliderComponentMode::CreateSubModes()
  244. {
  245. Physics::ShapeType shapeType = Physics::ShapeType::Box;
  246. EditorColliderComponentRequestBus::EventResult(
  247. shapeType, GetEntityComponentIdPair(), &EditorColliderComponentRequests::GetShapeType);
  248. switch (shapeType)
  249. {
  250. case Physics::ShapeType::Box:
  251. m_subModes[SubMode::Dimensions] = AZStd::make_unique<ColliderBoxMode>();
  252. break;
  253. case Physics::ShapeType::Sphere:
  254. m_subModes[SubMode::Dimensions] = AZStd::make_unique<ColliderSphereMode>();
  255. break;
  256. case Physics::ShapeType::Capsule:
  257. m_subModes[SubMode::Dimensions] = AZStd::make_unique<ColliderCapsuleMode>();
  258. break;
  259. case Physics::ShapeType::Cylinder:
  260. m_subModes[SubMode::Dimensions] = AZStd::make_unique<ColliderCylinderMode>();
  261. break;
  262. case Physics::ShapeType::CookedMesh:
  263. m_subModes[SubMode::Dimensions] = AZStd::make_unique<NullColliderComponentMode>();
  264. break;
  265. case Physics::ShapeType::PhysicsAsset:
  266. m_subModes[SubMode::Dimensions] = AZStd::make_unique<ColliderAssetScaleMode>();
  267. break;
  268. }
  269. m_subModes[SubMode::Offset] = AZStd::make_unique<ColliderOffsetMode>();
  270. m_subModes[SubMode::Rotation] = AZStd::make_unique<ColliderRotationMode>();
  271. m_subModes[m_subMode]->Setup(GetEntityComponentIdPair());
  272. }
  273. bool ColliderComponentMode::HandleMouseInteraction(const AzToolsFramework::ViewportInteraction::MouseInteractionEvent& mouseInteraction)
  274. {
  275. if (mouseInteraction.m_mouseEvent == AzToolsFramework::ViewportInteraction::MouseEvent::Wheel &&
  276. mouseInteraction.m_mouseInteraction.m_keyboardModifiers.Ctrl())
  277. {
  278. const int direction = MouseWheelDelta(mouseInteraction) > 0.0f ? -1 : 1;
  279. AZ::u32 currentModeIndex = static_cast<AZ::u32>(m_subMode);
  280. AZ::u32 numSubModes = static_cast<AZ::u32>(SubMode::NumModes);
  281. AZ::u32 nextModeIndex = (currentModeIndex + numSubModes + direction) % m_subModes.size();
  282. SubMode nextMode = static_cast<SubMode>(nextModeIndex);
  283. SetCurrentMode(nextMode);
  284. return true;
  285. }
  286. return false;
  287. }
  288. ColliderComponentMode::SubMode ColliderComponentMode::GetCurrentMode()
  289. {
  290. return m_subMode;
  291. }
  292. void ColliderComponentMode::SetCurrentMode(SubMode newMode)
  293. {
  294. AZ_Assert(m_subModes.find(newMode) != m_subModes.end(), "Submode not found:%d", newMode);
  295. m_subModes[m_subMode]->Teardown(GetEntityComponentIdPair());
  296. m_subMode = newMode;
  297. m_subModes[m_subMode]->Setup(GetEntityComponentIdPair());
  298. const auto modeIndex = static_cast<size_t>(newMode);
  299. AZ_Assert(modeIndex < m_buttonIds.size(), "Invalid mode index %i.", modeIndex);
  300. AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event(
  301. AzToolsFramework::ViewportUi::DefaultViewportId,
  302. &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::SetClusterActiveButton, m_modeSelectionClusterId,
  303. m_buttonIds[modeIndex]);
  304. }
  305. AzToolsFramework::ViewportUi::ClusterId ColliderComponentMode::GetClusterId() const
  306. {
  307. return m_modeSelectionClusterId;
  308. }
  309. AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetOffsetButtonId() const
  310. {
  311. return m_buttonIds[static_cast<size_t>(SubMode::Offset)];
  312. }
  313. AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetRotationButtonId() const
  314. {
  315. return m_buttonIds[static_cast<size_t>(SubMode::Rotation)];
  316. }
  317. AzToolsFramework::ViewportUi::ButtonId ColliderComponentMode::GetDimensionsButtonId() const
  318. {
  319. return m_buttonIds[static_cast<size_t>(SubMode::Dimensions)];
  320. }
  321. AZStd::string ColliderComponentMode::GetComponentModeName() const
  322. {
  323. return "Collider Edit Mode";
  324. }
  325. AZ::Uuid ColliderComponentMode::GetComponentModeType() const
  326. {
  327. return azrtti_typeid<ColliderComponentMode>();
  328. }
  329. void RefreshUI()
  330. {
  331. /// The reason this is in a free function is because ColliderComponentMode
  332. /// privately inherits from ToolsApplicationNotificationBus. Trying to invoke
  333. /// the bus inside the class scope causes the compiler to complain it's not accessible
  334. /// to due private inheritence.
  335. /// Using the global namespace operator :: should have fixed that, except there
  336. /// is a bug in the microsoft compiler meaning it doesn't work. So this is a work around.
  337. AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(
  338. &AzToolsFramework::ToolsApplicationNotificationBus::Events::InvalidatePropertyDisplay, AzToolsFramework::Refresh_Values);
  339. }
  340. void ColliderComponentMode::ResetCurrentMode()
  341. {
  342. m_subModes[m_subMode]->ResetValues(GetEntityComponentIdPair());
  343. m_subModes[m_subMode]->Refresh(GetEntityComponentIdPair());
  344. RefreshUI();
  345. }
  346. AZStd::vector<AzToolsFramework::ViewportUi::ClusterId> ColliderComponentMode::PopulateViewportUiImpl()
  347. {
  348. return AZStd::vector<AzToolsFramework::ViewportUi::ClusterId>{ m_modeSelectionClusterId };
  349. }
  350. static AzToolsFramework::ViewportUi::ButtonId RegisterClusterButton(
  351. AzToolsFramework::ViewportUi::ClusterId clusterId, const char* iconName, const char* tooltip)
  352. {
  353. AzToolsFramework::ViewportUi::ButtonId buttonId;
  354. AzToolsFramework::ViewportUi::ViewportUiRequestBus::EventResult(
  355. buttonId, AzToolsFramework::ViewportUi::DefaultViewportId,
  356. &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::CreateClusterButton, clusterId,
  357. AZStd::string::format(":/stylesheet/img/UI20/toolbar/%s.svg", iconName));
  358. AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event(
  359. AzToolsFramework::ViewportUi::DefaultViewportId,
  360. &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::SetClusterButtonTooltip,
  361. clusterId,
  362. buttonId,
  363. tooltip);
  364. return buttonId;
  365. }
  366. void ColliderComponentMode::RemoveSubModeSelectionCluster()
  367. {
  368. AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event(
  369. AzToolsFramework::ViewportUi::DefaultViewportId, &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::RemoveCluster,
  370. m_modeSelectionClusterId);
  371. }
  372. void ColliderComponentMode::CreateSubModeSelectionCluster()
  373. {
  374. // create the cluster for changing transform mode
  375. AzToolsFramework::ViewportUi::ViewportUiRequestBus::EventResult(
  376. m_modeSelectionClusterId, AzToolsFramework::ViewportUi::DefaultViewportId,
  377. &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::CreateCluster, AzToolsFramework::ViewportUi::Alignment::TopLeft);
  378. // create and register the buttons
  379. m_buttonIds.resize(static_cast<size_t>(SubMode::NumModes));
  380. m_buttonIds[static_cast<size_t>(SubMode::Offset)] =
  381. RegisterClusterButton(m_modeSelectionClusterId, "Move", "Switch to translation offset mode (1)");
  382. m_buttonIds[static_cast<size_t>(SubMode::Rotation)] =
  383. RegisterClusterButton(m_modeSelectionClusterId, "Rotate", "Switch to rotation offset mode (2)");
  384. m_buttonIds[static_cast<size_t>(SubMode::Dimensions)] =
  385. RegisterClusterButton(m_modeSelectionClusterId, "Scale", "Switch to dimensions mode (3)");
  386. SetCurrentMode(SubMode::Offset);
  387. const auto onButtonClicked = [this](AzToolsFramework::ViewportUi::ButtonId buttonId)
  388. {
  389. if (buttonId == m_buttonIds[static_cast<size_t>(SubMode::Offset)])
  390. {
  391. SetCurrentMode(SubMode::Offset);
  392. }
  393. else if (buttonId == m_buttonIds[static_cast<size_t>(SubMode::Rotation)])
  394. {
  395. SetCurrentMode(SubMode::Rotation);
  396. }
  397. else if (buttonId == m_buttonIds[static_cast<size_t>(SubMode::Dimensions)])
  398. {
  399. SetCurrentMode(SubMode::Dimensions);
  400. }
  401. else
  402. {
  403. AZ_Error("PhysX Collider Component Mode", false, "Unrecognized button ID.");
  404. }
  405. };
  406. m_modeSelectionHandler = AZ::Event<AzToolsFramework::ViewportUi::ButtonId>::Handler(onButtonClicked);
  407. AzToolsFramework::ViewportUi::ViewportUiRequestBus::Event(
  408. AzToolsFramework::ViewportUi::DefaultViewportId,
  409. &AzToolsFramework::ViewportUi::ViewportUiRequestBus::Events::RegisterClusterEventHandler, m_modeSelectionClusterId,
  410. m_modeSelectionHandler);
  411. }
  412. } // namespace PhysX