CollisionGroupWidget.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. });
  38. connect(picker->GetEditButton(), &QToolButton::clicked, this, &CollisionGroupWidget::OnEditButtonClicked);
  39. return picker;
  40. }
  41. bool CollisionGroupWidget::IsDefaultHandler() const
  42. {
  43. return true;
  44. }
  45. void CollisionGroupWidget::ConsumeAttribute(widget_t* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName)
  46. {
  47. if (attrib == AZ::Edit::Attributes::ReadOnly)
  48. {
  49. bool value = false;
  50. if (attrValue->Read<bool>(value))
  51. {
  52. GUI->setEnabled(!value);
  53. }
  54. }
  55. }
  56. void CollisionGroupWidget::WriteGUIValuesIntoProperty([[maybe_unused]] size_t index, widget_t* GUI, property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  57. {
  58. instance = GetGroupFromName(GUI->GetComboBox()->currentText().toUtf8().data());
  59. }
  60. bool CollisionGroupWidget::ReadValuesIntoGUI([[maybe_unused]] size_t index, widget_t* GUI, const property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  61. {
  62. GUI->clearElements();
  63. auto groupNames = GetGroupNames();
  64. for (auto& layerName : groupNames)
  65. {
  66. GUI->Add(layerName);
  67. }
  68. GUI->setValue(GetNameFromGroup(instance));
  69. return false;
  70. }
  71. void CollisionGroupWidget::OnEditButtonClicked()
  72. {
  73. // Open configuration window
  74. AzToolsFramework::EditorRequestBus::Broadcast(&AzToolsFramework::EditorRequests::OpenViewPane, LyViewPane::PhysXConfigurationEditor);
  75. // Set to collision groups tab
  76. ConfigurationWindowRequestBus::Broadcast(&ConfigurationWindowRequests::ShowCollisionGroupsTab);
  77. }
  78. AzPhysics::CollisionGroups::Id CollisionGroupWidget::GetGroupFromName(const AZStd::string& groupName)
  79. {
  80. const AzPhysics::CollisionConfiguration& configuration = AZ::Interface<AzPhysics::SystemInterface>::Get()->GetConfiguration()->m_collisionConfig;
  81. return configuration.m_collisionGroups.FindGroupIdByName(groupName);
  82. }
  83. AZStd::string CollisionGroupWidget::GetNameFromGroup(const AzPhysics::CollisionGroups::Id& collisionGroup)
  84. {
  85. const AzPhysics::CollisionConfiguration& configuration = AZ::Interface<AzPhysics::SystemInterface>::Get()->GetConfiguration()->m_collisionConfig;
  86. return configuration.m_collisionGroups.FindGroupNameById(collisionGroup);
  87. }
  88. AZStd::vector<AZStd::string> CollisionGroupWidget::GetGroupNames()
  89. {
  90. const AzPhysics::CollisionConfiguration& configuration = AZ::Interface<AzPhysics::SystemInterface>::Get()->GetConfiguration()->m_collisionConfig;
  91. const AZStd::vector<AzPhysics::CollisionGroups::Preset>& collisionGroupPresets = configuration.m_collisionGroups.GetPresets();
  92. AZStd::vector<AZStd::string> groupNames;
  93. groupNames.reserve(collisionGroupPresets.size());
  94. for (const auto& preset : collisionGroupPresets)
  95. {
  96. groupNames.push_back(preset.m_name);
  97. }
  98. return groupNames;
  99. }
  100. } // namespace Editor
  101. } // namespace PhysX
  102. #include <Editor/moc_CollisionGroupWidget.cpp>