InputOutputNodes.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. // AZ
  9. #include <AzCore/Serialization/SerializeContext.h>
  10. #include <AzCore/std/smart_ptr/make_shared.h>
  11. // Graph Model
  12. #include <GraphModel/Model/Module/InputOutputNodes.h>
  13. #include <GraphModel/Model/Graph.h>
  14. #include <GraphModel/Model/Slot.h>
  15. #include <GraphModel/Model/DataType.h>
  16. namespace GraphModel
  17. {
  18. //////////////////////////////////////////////////////////////////////////////
  19. // BaseInputOutputNode
  20. void BaseInputOutputNode::Reflect(AZ::ReflectContext* context)
  21. {
  22. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  23. if (serializeContext)
  24. {
  25. serializeContext->Class<BaseInputOutputNode, Node>()
  26. ->Version(0)
  27. ->Field("m_dataType", &BaseInputOutputNode::m_dataType)
  28. ;
  29. }
  30. }
  31. BaseInputOutputNode::BaseInputOutputNode(GraphPtr graph, DataTypePtr dataType)
  32. : Node(graph)
  33. {
  34. // Copy because m_dataType has to be non-const for use with SerializeContext, and dataType is const
  35. m_dataType = AZStd::make_shared<DataType>(*dataType);
  36. }
  37. const char* BaseInputOutputNode::GetTitle() const
  38. {
  39. return m_title.c_str();
  40. }
  41. GraphModel::DataTypePtr BaseInputOutputNode::GetNodeDataType() const
  42. {
  43. return m_dataType;
  44. }
  45. AZStd::string BaseInputOutputNode::GetName() const
  46. {
  47. return GetSlot("name")->GetValue<AZStd::string>();
  48. }
  49. AZStd::string BaseInputOutputNode::GetDisplayName() const
  50. {
  51. return GetSlot("displayName")->GetValue<AZStd::string>();
  52. }
  53. AZStd::string BaseInputOutputNode::GetDescription() const
  54. {
  55. return GetSlot("description")->GetValue<AZStd::string>();
  56. }
  57. void BaseInputOutputNode::RegisterCommonSlots(AZStd::string_view directionName)
  58. {
  59. GraphModel::DataTypePtr stringDataType = GetGraphContext()->GetDataType<AZStd::string>();
  60. RegisterSlot(GraphModel::SlotDefinition::CreateProperty("name", "Name", stringDataType, stringDataType->GetDefaultValue(),
  61. AZStd::string::format("The official name for this %s", directionName.data())));
  62. RegisterSlot(GraphModel::SlotDefinition::CreateProperty("displayName", "Display Name", stringDataType, stringDataType->GetDefaultValue(),
  63. AZStd::string::format("The name for this %s, displayed to the user. Will use the above Name if left blank.", directionName.data())));
  64. RegisterSlot(GraphModel::SlotDefinition::CreateProperty("description", "Description", stringDataType, stringDataType->GetDefaultValue(),
  65. AZStd::string::format("A description of this %s, used for tooltips", directionName.data())));
  66. }
  67. //////////////////////////////////////////////////////////////////////////////
  68. // GraphInputNode
  69. void GraphInputNode::Reflect(AZ::ReflectContext* context)
  70. {
  71. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  72. if (serializeContext)
  73. {
  74. serializeContext->Class<GraphInputNode, BaseInputOutputNode>()
  75. ->Version(0)
  76. ;
  77. }
  78. }
  79. GraphInputNode::GraphInputNode(GraphModel::GraphPtr graph, DataTypePtr dataType)
  80. : BaseInputOutputNode(graph, dataType)
  81. {
  82. m_title = m_dataType->GetDisplayName() + " Input";
  83. RegisterSlots();
  84. CreateSlotData();
  85. }
  86. void GraphInputNode::PostLoadSetup(GraphPtr graph, NodeId id)
  87. {
  88. m_title = m_dataType->GetDisplayName() + " Input";
  89. Node::PostLoadSetup(graph, id);
  90. }
  91. AZStd::any GraphInputNode::GetDefaultValue() const
  92. {
  93. return GetSlot("defaultValue")->GetValue();
  94. }
  95. void GraphInputNode::RegisterSlots()
  96. {
  97. // Register just a single output slot for the data that is input through this node
  98. RegisterSlot(GraphModel::SlotDefinition::CreateOutputData("value", "Value", m_dataType, "An external value provided as input to this graph"));
  99. // Register meta-data properties
  100. RegisterCommonSlots("input");
  101. RegisterSlot(GraphModel::SlotDefinition::CreateProperty("defaultValue", "Default Value", m_dataType, m_dataType->GetDefaultValue(),
  102. "The default value for this input when no data is provided externally"));
  103. }
  104. //////////////////////////////////////////////////////////////////////////////
  105. // GraphOutputNode
  106. void GraphOutputNode::Reflect(AZ::ReflectContext* context)
  107. {
  108. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  109. if (serializeContext)
  110. {
  111. serializeContext->Class<GraphOutputNode, BaseInputOutputNode>()
  112. ->Version(0)
  113. ;
  114. }
  115. }
  116. GraphOutputNode::GraphOutputNode(GraphModel::GraphPtr graph, DataTypePtr dataType)
  117. : BaseInputOutputNode(graph, dataType)
  118. {
  119. m_title = m_dataType->GetDisplayName() + " Output";
  120. RegisterSlots();
  121. CreateSlotData();
  122. }
  123. void GraphOutputNode::PostLoadSetup(GraphPtr graph, NodeId id)
  124. {
  125. m_title = m_dataType->GetDisplayName() + " Output";
  126. Node::PostLoadSetup(graph, id);
  127. }
  128. void GraphOutputNode::RegisterSlots()
  129. {
  130. // Register just a single input slot for the data that is output through this node
  131. RegisterSlot(GraphModel::SlotDefinition::CreateInputData("value", "Value", m_dataType, m_dataType->GetDefaultValue(), "A value output by this graph for external use"));
  132. // Register meta-data properties
  133. RegisterCommonSlots("output");
  134. }
  135. }