CollisionGroupWidget.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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 <AzCore/Interface/Interface.h>
  9. #include <AzFramework/Physics/CollisionBus.h>
  10. #include <AzFramework/Physics/Configuration/CollisionConfiguration.h>
  11. #include <AzFramework/Physics/PhysicsSystem.h>
  12. #include <AzFramework/Physics/PropertyTypes.h>
  13. #include <AzToolsFramework/API/ToolsApplicationAPI.h>
  14. #include <Editor/CollisionGroupWidget.h>
  15. #include <Editor/ConfigurationWindowBus.h>
  16. #include <LyViewPaneNames.h>
  17. namespace PhysX
  18. {
  19. namespace Editor
  20. {
  21. CollisionGroupWidget::CollisionGroupWidget()
  22. {
  23. }
  24. AZ::u32 CollisionGroupWidget::GetHandlerName() const
  25. {
  26. return Physics::Edit::CollisionGroupSelector;
  27. }
  28. QWidget* CollisionGroupWidget::CreateGUI(QWidget* parent)
  29. {
  30. widget_t* picker = new widget_t(parent);
  31. picker->GetEditButton()->setVisible(true);
  32. picker->GetEditButton()->setToolTip("Edit Collision Groups");
  33. connect(picker->GetComboBox(), &QComboBox::currentTextChanged, this, [picker]()
  34. {
  35. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(
  36. &AzToolsFramework::PropertyEditorGUIMessages::Bus::Events::RequestWrite, picker);
  37. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(
  38. &AzToolsFramework::PropertyEditorGUIMessages::Bus::Handler::OnEditingFinished, picker);
  39. });
  40. connect(picker->GetEditButton(), &QToolButton::clicked, this, &CollisionGroupWidget::OnEditButtonClicked);
  41. return picker;
  42. }
  43. bool CollisionGroupWidget::IsDefaultHandler() const
  44. {
  45. return true;
  46. }
  47. void CollisionGroupWidget::ConsumeAttribute(widget_t* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName)
  48. {
  49. if (attrib == AZ::Edit::Attributes::ReadOnly)
  50. {
  51. bool value = false;
  52. if (attrValue->Read<bool>(value))
  53. {
  54. GUI->setEnabled(!value);
  55. }
  56. }
  57. }
  58. void CollisionGroupWidget::WriteGUIValuesIntoProperty([[maybe_unused]] size_t index, widget_t* GUI, property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  59. {
  60. instance = GetGroupFromName(GUI->GetComboBox()->currentText().toUtf8().data());
  61. }
  62. bool CollisionGroupWidget::ReadValuesIntoGUI([[maybe_unused]] size_t index, widget_t* GUI, const property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  63. {
  64. GUI->clearElements();
  65. auto groupNames = GetGroupNames();
  66. for (auto& layerName : groupNames)
  67. {
  68. GUI->Add(layerName);
  69. }
  70. GUI->setValue(GetNameFromGroup(instance));
  71. return false;
  72. }
  73. void CollisionGroupWidget::OnEditButtonClicked()
  74. {
  75. // Open configuration window
  76. AzToolsFramework::EditorRequestBus::Broadcast(&AzToolsFramework::EditorRequests::OpenViewPane, LyViewPane::PhysXConfigurationEditor);
  77. // Set to collision groups tab
  78. ConfigurationWindowRequestBus::Broadcast(&ConfigurationWindowRequests::ShowCollisionGroupsTab);
  79. }
  80. AzPhysics::CollisionGroups::Id CollisionGroupWidget::GetGroupFromName(const AZStd::string& groupName)
  81. {
  82. const AzPhysics::CollisionConfiguration& configuration = AZ::Interface<AzPhysics::SystemInterface>::Get()->GetConfiguration()->m_collisionConfig;
  83. return configuration.m_collisionGroups.FindGroupIdByName(groupName);
  84. }
  85. AZStd::string CollisionGroupWidget::GetNameFromGroup(const AzPhysics::CollisionGroups::Id& collisionGroup)
  86. {
  87. const AzPhysics::CollisionConfiguration& configuration = AZ::Interface<AzPhysics::SystemInterface>::Get()->GetConfiguration()->m_collisionConfig;
  88. return configuration.m_collisionGroups.FindGroupNameById(collisionGroup);
  89. }
  90. AZStd::vector<AZStd::string> CollisionGroupWidget::GetGroupNames()
  91. {
  92. const AzPhysics::CollisionConfiguration& configuration = AZ::Interface<AzPhysics::SystemInterface>::Get()->GetConfiguration()->m_collisionConfig;
  93. const AZStd::vector<AzPhysics::CollisionGroups::Preset>& collisionGroupPresets = configuration.m_collisionGroups.GetPresets();
  94. AZStd::vector<AZStd::string> groupNames;
  95. groupNames.reserve(collisionGroupPresets.size());
  96. for (const auto& preset : collisionGroupPresets)
  97. {
  98. groupNames.push_back(preset.m_name);
  99. }
  100. return groupNames;
  101. }
  102. } // namespace Editor
  103. } // namespace PhysX
  104. #include <Editor/moc_CollisionGroupWidget.cpp>