3
0

DynamicNodeUtil.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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 <AtomToolsFramework/Graph/DynamicNode/DynamicNodeManagerRequestBus.h>
  9. #include <AtomToolsFramework/Graph/DynamicNode/DynamicNodeUtil.h>
  10. #include <AtomToolsFramework/Util/Util.h>
  11. #include <AzCore/StringFunc/StringFunc.h>
  12. namespace AtomToolsFramework
  13. {
  14. void VisitDynamicNodeSlotConfigs(
  15. DynamicNodeConfig& nodeConfig, const AZStd::function<void(DynamicNodeSlotConfig&)>& visitorFn)
  16. {
  17. for (auto& slotConfig : nodeConfig.m_propertySlots)
  18. {
  19. visitorFn(slotConfig);
  20. }
  21. for (auto& slotConfig : nodeConfig.m_inputSlots)
  22. {
  23. visitorFn(slotConfig);
  24. }
  25. for (auto& slotConfig : nodeConfig.m_outputSlots)
  26. {
  27. visitorFn(slotConfig);
  28. }
  29. }
  30. void VisitDynamicNodeSlotConfigs(
  31. const DynamicNodeConfig& nodeConfig, const AZStd::function<void(const DynamicNodeSlotConfig&)>& visitorFn)
  32. {
  33. for (const auto& slotConfig : nodeConfig.m_propertySlots)
  34. {
  35. visitorFn(slotConfig);
  36. }
  37. for (const auto& slotConfig : nodeConfig.m_inputSlots)
  38. {
  39. visitorFn(slotConfig);
  40. }
  41. for (const auto& slotConfig : nodeConfig.m_outputSlots)
  42. {
  43. visitorFn(slotConfig);
  44. }
  45. }
  46. void VisitDynamicNodeSettings(
  47. DynamicNodeConfig& nodeConfig, const AZStd::function<void(DynamicNodeSettingsMap&)>& visitorFn)
  48. {
  49. visitorFn(nodeConfig.m_settings);
  50. VisitDynamicNodeSlotConfigs(
  51. nodeConfig,
  52. [visitorFn](DynamicNodeSlotConfig& slotConfig)
  53. {
  54. visitorFn(slotConfig.m_settings);
  55. });
  56. }
  57. void VisitDynamicNodeSettings(
  58. const DynamicNodeConfig& nodeConfig, const AZStd::function<void(const DynamicNodeSettingsMap&)>& visitorFn)
  59. {
  60. visitorFn(nodeConfig.m_settings);
  61. VisitDynamicNodeSlotConfigs(
  62. nodeConfig,
  63. [visitorFn](const DynamicNodeSlotConfig& slotConfig)
  64. {
  65. visitorFn(slotConfig.m_settings);
  66. });
  67. }
  68. void CollectDynamicNodeSettings(
  69. const DynamicNodeSettingsMap& settings, const AZStd::string& settingName, AZStd::set<AZStd::string>& container)
  70. {
  71. if (auto settingsItr = settings.find(settingName); settingsItr != settings.end())
  72. {
  73. container.insert(settingsItr->second.begin(), settingsItr->second.end());
  74. }
  75. }
  76. void CollectDynamicNodeSettings(
  77. const DynamicNodeSettingsMap& settings, const AZStd::string& settingName, AZStd::vector<AZStd::string>& container)
  78. {
  79. if (auto settingsItr = settings.find(settingName); settingsItr != settings.end())
  80. {
  81. container.insert(container.end(), settingsItr->second.begin(), settingsItr->second.end());
  82. }
  83. }
  84. AZStd::string GetSettingValueByName(
  85. const DynamicNodeSettingsMap& settings, const AZStd::string& settingName, const AZStd::string& defaultValue)
  86. {
  87. for (const auto& settingsPair : settings)
  88. {
  89. if (AZ::StringFunc::Equal(settingsPair.first, settingName))
  90. {
  91. for (const auto& value : settingsPair.second)
  92. {
  93. if (!value.empty())
  94. {
  95. return value;
  96. }
  97. }
  98. }
  99. }
  100. return defaultValue;
  101. }
  102. bool FindSettingWithValue(const DynamicNodeSettingsMap& settings, const AZStd::string& settingName, const AZStd::string& flag)
  103. {
  104. for (const auto& settingsPair : settings)
  105. {
  106. if (AZ::StringFunc::Equal(settingsPair.first, settingName))
  107. {
  108. for (const auto& value : settingsPair.second)
  109. {
  110. if (AZ::StringFunc::Equal(value, flag))
  111. {
  112. return true;
  113. }
  114. }
  115. }
  116. }
  117. return false;
  118. }
  119. AZStd::vector<AZStd::string> GetRegisteredDataTypeNames()
  120. {
  121. GraphModel::DataTypeList registeredDataTypes;
  122. DynamicNodeManagerRequestBus::BroadcastResult(registeredDataTypes, &DynamicNodeManagerRequestBus::Events::GetRegisteredDataTypes);
  123. AZStd::vector<AZStd::string> names;
  124. names.reserve(registeredDataTypes.size());
  125. for (const auto& dataType : registeredDataTypes)
  126. {
  127. names.push_back(dataType->GetDisplayName());
  128. }
  129. return names;
  130. }
  131. bool AddRegisteredSettingGroupsToMap(DynamicNodeSettingsMap& settings)
  132. {
  133. AZStd::vector<AZStd::string> availableStrings;
  134. DynamicNodeManagerRequestBus::BroadcastResult(
  135. availableStrings, &DynamicNodeManagerRequestBus::Events::GetRegisteredEditDataSettingNames);
  136. AZStd::vector<AZStd::string> selectedStrings;
  137. selectedStrings.reserve(settings.size());
  138. for (const auto& settingPair : settings)
  139. {
  140. selectedStrings.push_back(settingPair.first);
  141. }
  142. if (GetStringListFromDialog(selectedStrings, availableStrings, "Select Setting Groups To Add", true))
  143. {
  144. for (const auto& settingGroup : selectedStrings)
  145. {
  146. if (!settings.contains(settingGroup))
  147. {
  148. settings.emplace(settingGroup, AZStd::vector<AZStd::string>{});
  149. }
  150. }
  151. return true;
  152. }
  153. return false;
  154. }
  155. const AZ::Edit::ElementData* FindDynamicEditDataForSetting(const DynamicNodeSettingsMap& settings, const void* elementPtr)
  156. {
  157. for (const auto& settingsGroup : settings)
  158. {
  159. for (const auto& setting : settingsGroup.second)
  160. {
  161. if (elementPtr == &setting)
  162. {
  163. const AZ::Edit::ElementData* registeredEditData = nullptr;
  164. DynamicNodeManagerRequestBus::BroadcastResult(
  165. registeredEditData, &DynamicNodeManagerRequestBus::Events::GetEditDataForSetting, settingsGroup.first);
  166. return registeredEditData;
  167. }
  168. }
  169. }
  170. return nullptr;
  171. }
  172. } // namespace AtomToolsFramework