Expose Raw BC Properties to Node Palette.

This commit is contained in:
chcurran
2021-05-05 14:59:08 -07:00
parent 181ce42591
commit a30d8eb886
30 changed files with 2856 additions and 69 deletions
@@ -58,7 +58,7 @@ namespace ScriptCanvasEditor
}
else
{
resultHash = ScriptCanvas::NodeUtils::ConstructMethodNodeIdentifier(classMethodTreeItem->GetClassMethodName(), classMethodTreeItem->GetMethodName());
resultHash = ScriptCanvas::NodeUtils::ConstructMethodNodeIdentifier(classMethodTreeItem->GetClassMethodName(), classMethodTreeItem->GetMethodName(), classMethodTreeItem->GetPropertyStatus());
}
}
else if (auto globalMethodTreeItem = azrtti_cast<const GlobalMethodEventPaletteTreeItem*>(treeItem); globalMethodTreeItem != nullptr)
@@ -167,7 +167,7 @@ namespace ScriptCanvasEditor::Nodes
return nodeIdPair;
}
NodeIdPair CreateObjectMethodNode(AZStd::string_view className, AZStd::string_view methodName, const ScriptCanvas::ScriptCanvasId& scriptCanvasId)
NodeIdPair CreateObjectMethodNode(AZStd::string_view className, AZStd::string_view methodName, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, ScriptCanvas::PropertyStatus propertyStatus)
{
AZ_PROFILE_TIMER("ScriptCanvas", __FUNCTION__);
NodeIdPair nodeIds;
@@ -181,7 +181,7 @@ namespace ScriptCanvasEditor::Nodes
auto* methodNode = azrtti_cast<ScriptCanvas::Nodes::Core::Method*>(node);
ScriptCanvas::NamespacePath emptyNamespacePath;
methodNode->InitializeBehaviorMethod(emptyNamespacePath, className, methodName);
methodNode->InitializeBehaviorMethod(emptyNamespacePath, className, methodName, propertyStatus);
AZStd::string_view displayName = methodNode->GetName();
scriptCanvasEntity->SetName(AZStd::string::format("SC-Node(%.*s)", aznumeric_cast<int>(displayName.size()), displayName.data()));
@@ -208,7 +208,7 @@ namespace ScriptCanvasEditor::Nodes
auto* methodNode = azrtti_cast<ScriptCanvas::Nodes::Core::MethodOverloaded*>(node);
ScriptCanvas::NamespacePath emptyNamespacePath;
methodNode->InitializeBehaviorMethod(emptyNamespacePath, className, methodName);
methodNode->InitializeBehaviorMethod(emptyNamespacePath, className, methodName, ScriptCanvas::PropertyStatus::None);
AZStd::string_view displayName = methodNode->GetName();
scriptCanvasEntity->SetName(AZStd::string::format("SC-Node(%.*s)", aznumeric_cast<int>(displayName.size()), displayName.data()));
@@ -34,7 +34,7 @@ namespace ScriptCanvasEditor::Nodes
AZStd::pair<ScriptCanvas::Node*, NodeIdPair> CreateAndGetNode(const AZ::Uuid& classData, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, const StyleConfiguration& styleConfiguration, AZStd::function<void(ScriptCanvas::Node*)> = nullptr);
NodeIdPair CreateNode(const AZ::Uuid& classData, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, const StyleConfiguration& styleConfiguration);
NodeIdPair CreateEntityNode(const AZ::EntityId& sourceId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
NodeIdPair CreateObjectMethodNode(AZStd::string_view className, AZStd::string_view methodName, const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
NodeIdPair CreateObjectMethodNode(AZStd::string_view className, AZStd::string_view methodName, const ScriptCanvas::ScriptCanvasId& scriptCanvasId, ScriptCanvas::PropertyStatus propertyStatus);
NodeIdPair CreateObjectMethodOverloadNode(AZStd::string_view className, AZStd::string_view methodName, const ScriptCanvas::ScriptCanvasId& scriptCanvasGraphId);
NodeIdPair CreateGlobalMethodNode(AZStd::string_view methodName, const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
NodeIdPair CreateEbusWrapperNode(AZStd::string_view busName, const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
@@ -327,12 +327,14 @@ namespace ScriptCanvasEditor::Nodes
contextGroup = TranslationContextGroup::EbusSender;
break;
case ScriptCanvas::MethodType::Member:
case ScriptCanvas::MethodType::Getter:
case ScriptCanvas::MethodType::Setter:
case ScriptCanvas::MethodType::Free:
graphCanvasEntity->CreateComponent<ClassMethodNodeDescriptorComponent>();
contextGroup = TranslationContextGroup::ClassMethod;
break;
default:
AZ_Error("ScriptCanvas", false, "Invalid method node type, node creation failed. This node nodes to be deleted.");
AZ_Error("ScriptCanvas", false, "Invalid method node type, node creation failed. This node needs to be deleted.");
break;
}
@@ -52,14 +52,16 @@ namespace ScriptCanvasEditor
->Field("BusName", &CreateEBusSenderMimeEvent::m_busName)
->Field("EventName", &CreateEBusSenderMimeEvent::m_eventName)
->Field("IsOverload", &CreateEBusSenderMimeEvent::m_isOverload)
->Field("propertyStatus", &CreateEBusSenderMimeEvent::m_propertyStatus)
;
}
}
CreateEBusSenderMimeEvent::CreateEBusSenderMimeEvent(AZStd::string_view busName, AZStd::string_view eventName, bool isOverload)
CreateEBusSenderMimeEvent::CreateEBusSenderMimeEvent(AZStd::string_view busName, AZStd::string_view eventName, bool isOverload, ScriptCanvas::PropertyStatus propertyStatus)
: m_busName(busName.data())
, m_eventName(eventName.data())
, m_isOverload(isOverload)
, m_propertyStatus(propertyStatus)
{
}
@@ -71,7 +73,7 @@ namespace ScriptCanvasEditor
}
else
{
return Nodes::CreateObjectMethodNode(m_busName, m_eventName, scriptCanvasId);
return Nodes::CreateObjectMethodNode(m_busName, m_eventName, scriptCanvasId, m_propertyStatus);
}
}
@@ -91,13 +93,14 @@ namespace ScriptCanvasEditor
return defaultIcon;
}
EBusSendEventPaletteTreeItem::EBusSendEventPaletteTreeItem(AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busIdentifier, const ScriptCanvas::EBusEventId& eventIdentifier, bool isOverload)
EBusSendEventPaletteTreeItem::EBusSendEventPaletteTreeItem(AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busIdentifier, const ScriptCanvas::EBusEventId& eventIdentifier, bool isOverload, ScriptCanvas::PropertyStatus propertyStatus)
: DraggableNodePaletteTreeItem(eventName, ScriptCanvasEditor::AssetEditorId)
, m_busName(busName.data())
, m_eventName(eventName.data())
, m_busId(busIdentifier)
, m_eventId(eventIdentifier)
, m_isOverload(isOverload)
, m_propertyStatus(propertyStatus)
{
AZStd::string displayEventName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusSender, m_busName.toUtf8().data(), m_eventName.toUtf8().data(), TranslationItemType::Node, TranslationKeyId::Name);
@@ -122,7 +125,7 @@ namespace ScriptCanvasEditor
GraphCanvas::GraphCanvasMimeEvent* EBusSendEventPaletteTreeItem::CreateMimeEvent() const
{
return aznew CreateEBusSenderMimeEvent(m_busName.toUtf8().data(), m_eventName.toUtf8().data(), m_isOverload);
return aznew CreateEBusSenderMimeEvent(m_busName.toUtf8().data(), m_eventName.toUtf8().data(), m_isOverload, ScriptCanvas::PropertyStatus::None);
}
AZStd::string EBusSendEventPaletteTreeItem::GetBusName() const
@@ -145,6 +148,11 @@ namespace ScriptCanvasEditor
return m_eventId;
}
ScriptCanvas::PropertyStatus EBusSendEventPaletteTreeItem::GetPropertyStatus() const
{
return m_propertyStatus;
}
bool EBusSendEventPaletteTreeItem::IsOverload() const
{
return m_isOverload;
@@ -28,7 +28,7 @@ namespace ScriptCanvasEditor
static void Reflect(AZ::ReflectContext* reflectContext);
CreateEBusSenderMimeEvent() = default;
CreateEBusSenderMimeEvent(AZStd::string_view busName, AZStd::string_view eventName, bool isOverload);
CreateEBusSenderMimeEvent(AZStd::string_view busName, AZStd::string_view eventName, bool isOverload, ScriptCanvas::PropertyStatus propertyStatus);
~CreateEBusSenderMimeEvent() = default;
protected:
@@ -36,6 +36,7 @@ namespace ScriptCanvasEditor
private:
bool m_isOverload;
ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
AZStd::string m_busName;
AZStd::string m_eventName;
};
@@ -50,7 +51,7 @@ namespace ScriptCanvasEditor
AZ_CLASS_ALLOCATOR(EBusSendEventPaletteTreeItem, AZ::SystemAllocator, 0);
AZ_RTTI(EBusSendEventPaletteTreeItem, "{26258B0A-8E2C-434D-ACAD-3DE85E64A4F8}", GraphCanvas::DraggableNodePaletteTreeItem);
EBusSendEventPaletteTreeItem(AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const ScriptCanvas::EBusEventId& eventIdentifier, bool isOverload);
EBusSendEventPaletteTreeItem(AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const ScriptCanvas::EBusEventId& eventIdentifier, bool isOverload, ScriptCanvas::PropertyStatus propertyStatus);
~EBusSendEventPaletteTreeItem() = default;
GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const override;
@@ -63,6 +64,8 @@ namespace ScriptCanvasEditor
bool IsOverload() const;
ScriptCanvas::PropertyStatus GetPropertyStatus() const;
private:
bool m_isOverload;
QString m_busName;
@@ -70,6 +73,7 @@ namespace ScriptCanvasEditor
ScriptCanvas::EBusBusId m_busId;
ScriptCanvas::EBusEventId m_eventId;
ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
};
// </EbusSender>
@@ -51,14 +51,16 @@ namespace ScriptCanvasEditor
->Field("ClassName", &CreateClassMethodMimeEvent::m_className)
->Field("MethodName", &CreateClassMethodMimeEvent::m_methodName)
->Field("IsOverload", &CreateClassMethodMimeEvent::m_isOverload)
->Field("propertyStatus", &CreateClassMethodMimeEvent::m_propertyStatus)
;
}
}
CreateClassMethodMimeEvent::CreateClassMethodMimeEvent(const QString& className, const QString& methodName, bool isOverload)
CreateClassMethodMimeEvent::CreateClassMethodMimeEvent(const QString& className, const QString& methodName, bool isOverload, ScriptCanvas::PropertyStatus propertyStatus)
: m_className(className.toUtf8().data())
, m_methodName(methodName.toUtf8().data())
, m_isOverload(isOverload)
, m_propertyStatus(propertyStatus)
{
}
@@ -70,7 +72,7 @@ namespace ScriptCanvasEditor
}
else
{
return Nodes::CreateObjectMethodNode(m_className, m_methodName, scriptCanvasId);
return Nodes::CreateObjectMethodNode(m_className, m_methodName, scriptCanvasId, m_propertyStatus);
}
}
@@ -78,11 +80,12 @@ namespace ScriptCanvasEditor
// ClassMethodEventPaletteTreeItem
////////////////////////////////////
ClassMethodEventPaletteTreeItem::ClassMethodEventPaletteTreeItem(AZStd::string_view className, AZStd::string_view methodName, bool isOverload)
ClassMethodEventPaletteTreeItem::ClassMethodEventPaletteTreeItem(AZStd::string_view className, AZStd::string_view methodName, bool isOverload, ScriptCanvas::PropertyStatus propertyStatus)
: DraggableNodePaletteTreeItem(methodName, ScriptCanvasEditor::AssetEditorId)
, m_className(className.data())
, m_methodName(methodName.data())
, m_isOverload(isOverload)
, m_propertyStatus(propertyStatus)
{
AZStd::string displayMethodName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::ClassMethod, m_className.toUtf8().data(), m_methodName.toUtf8().data(), TranslationItemType::Node, TranslationKeyId::Name);
@@ -95,6 +98,15 @@ namespace ScriptCanvasEditor
SetName(displayMethodName.c_str());
}
if (propertyStatus == ScriptCanvas::PropertyStatus::Getter)
{
SetName(AZStd::string::format("Get %s", GetName().toUtf8().data()).data());
}
else if (propertyStatus == ScriptCanvas::PropertyStatus::Setter)
{
SetName(AZStd::string::format("Set %s", GetName().toUtf8().data()).data());
}
AZStd::string displayEventTooltip = TranslationHelper::GetKeyTranslation(TranslationContextGroup::ClassMethod, m_className.toUtf8().data(), m_methodName.toUtf8().data(), TranslationItemType::Node, TranslationKeyId::Tooltip);
if (!displayEventTooltip.empty())
@@ -107,7 +119,7 @@ namespace ScriptCanvasEditor
GraphCanvas::GraphCanvasMimeEvent* ClassMethodEventPaletteTreeItem::CreateMimeEvent() const
{
return aznew CreateClassMethodMimeEvent(m_className, m_methodName, m_isOverload);
return aznew CreateClassMethodMimeEvent(m_className, m_methodName, m_isOverload, m_propertyStatus);
}
AZStd::string ClassMethodEventPaletteTreeItem::GetClassMethodName() const
@@ -125,6 +137,11 @@ namespace ScriptCanvasEditor
return m_isOverload;
}
ScriptCanvas::PropertyStatus ClassMethodEventPaletteTreeItem::GetPropertyStatus() const
{
return m_propertyStatus;
}
//! Implementation of the CreateGlobalMethod Mime Event
void CreateGlobalMethodMimeEvent::Reflect(AZ::ReflectContext* reflectContext)
{
@@ -30,7 +30,7 @@ namespace ScriptCanvasEditor
static void Reflect(AZ::ReflectContext* reflectContext);
CreateClassMethodMimeEvent() = default;
CreateClassMethodMimeEvent(const QString& className, const QString& methodName, bool isOverload);
CreateClassMethodMimeEvent(const QString& className, const QString& methodName, bool isOverload, ScriptCanvas::PropertyStatus);
~CreateClassMethodMimeEvent() = default;
protected:
@@ -40,6 +40,7 @@ namespace ScriptCanvasEditor
bool m_isOverload = false;
AZStd::string m_className;
AZStd::string m_methodName;
ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
};
class ClassMethodEventPaletteTreeItem
@@ -49,7 +50,7 @@ namespace ScriptCanvasEditor
AZ_CLASS_ALLOCATOR(ClassMethodEventPaletteTreeItem, AZ::SystemAllocator, 0);
AZ_RTTI(ClassMethodEventPaletteTreeItem, "{96F93970-F38A-4F08-8DC5-D52FCCE34E25}", GraphCanvas::DraggableNodePaletteTreeItem);
ClassMethodEventPaletteTreeItem(AZStd::string_view className, AZStd::string_view methodName, bool isOverload);
ClassMethodEventPaletteTreeItem(AZStd::string_view className, AZStd::string_view methodName, bool isOverload, ScriptCanvas::PropertyStatus propertyStatus);
~ClassMethodEventPaletteTreeItem() = default;
GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const override;
@@ -57,11 +58,13 @@ namespace ScriptCanvasEditor
AZStd::string GetClassMethodName() const;
AZStd::string GetMethodName() const;
bool IsOverload() const;
ScriptCanvas::PropertyStatus GetPropertyStatus() const;
private:
bool m_isOverload = false;
QString m_className;
QString m_methodName;
ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
};
// </ClassMethod>
@@ -129,6 +129,7 @@ namespace
, const AZ::BehaviorClass* behaviorClass
, const AZStd::string& name
, const AZ::BehaviorMethod& method
, ScriptCanvas::PropertyStatus propertyStatus
, bool isOverloaded)
{
if (IsDeprecated(method.m_attributes))
@@ -170,7 +171,7 @@ namespace
serializeContext->RegisterType(resultParameter->m_typeId, AZStd::move(classData), EventPlaceholderAnyCreator);
}
nodePaletteModel.RegisterClassNode(categoryPath, behaviorClass ? behaviorClass->m_name : "", name, &method, &behaviorContext, isOverloaded);
nodePaletteModel.RegisterClassNode(categoryPath, behaviorClass ? behaviorClass->m_name : "", name, &method, &behaviorContext, propertyStatus, isOverloaded);
}
void RegisterGlobalMethod(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel, const AZ::BehaviorContext& behaviorContext,
@@ -556,6 +557,19 @@ namespace
categoryPath.append(displayName.c_str());
}
for (auto property : behaviorClass->m_properties)
{
if (property.second->m_getter)
{
RegisterMethod(nodePaletteModel, behaviorContext, categoryPath, behaviorClass, property.first, *property.second->m_getter, ScriptCanvas::PropertyStatus::Getter, behaviorClass->IsMethodOverloaded(property.first));
}
if (property.second->m_setter)
{
RegisterMethod(nodePaletteModel, behaviorContext, categoryPath, behaviorClass, property.first, *property.second->m_setter, ScriptCanvas::PropertyStatus::Setter, behaviorClass->IsMethodOverloaded(property.first));
}
}
for (auto methodIter : behaviorClass->m_methods)
{
if (!IsExplicitOverload(*methodIter.second))
@@ -567,7 +581,7 @@ namespace
continue;
}
RegisterMethod(nodePaletteModel, behaviorContext, categoryPath, behaviorClass, methodIter.first, *methodIter.second, behaviorClass->IsMethodOverloaded(methodIter.first));
RegisterMethod(nodePaletteModel, behaviorContext, categoryPath, behaviorClass, methodIter.first, *methodIter.second, ScriptCanvas::PropertyStatus::None, behaviorClass->IsMethodOverloaded(methodIter.first));
}
}
}
@@ -579,7 +593,7 @@ namespace
{
for (const AZ::ExplicitOverloadInfo& explicitOverload : behaviorContext.m_explicitOverloads)
{
RegisterMethod(nodePaletteModel, behaviorContext, explicitOverload.m_categoryPath, nullptr, explicitOverload.m_name, *explicitOverload.m_overloads.begin()->first, true);
RegisterMethod(nodePaletteModel, behaviorContext, explicitOverload.m_categoryPath, nullptr, explicitOverload.m_name, *explicitOverload.m_overloads.begin()->first, ScriptCanvas::PropertyStatus::None, true);
}
}
@@ -717,7 +731,7 @@ namespace
}
const bool isOverload{ false }; // overloaded events are not trivially supported
nodePaletteModel.RegisterEBusSenderNodeModelInformation(categoryPath, behaviorEbus.m_name, event.first, ScriptCanvas::EBusBusId(behaviorEbus.m_name.c_str()), ScriptCanvas::EBusEventId(event.first.c_str()), event.second, isOverload);
nodePaletteModel.RegisterEBusSenderNodeModelInformation(categoryPath, behaviorEbus.m_name, event.first, ScriptCanvas::EBusBusId(behaviorEbus.m_name.c_str()), ScriptCanvas::EBusEventId(event.first.c_str()), event.second, ScriptCanvas::PropertyStatus::None, isOverload);
}
}
}
@@ -1024,11 +1038,16 @@ namespace ScriptCanvasEditor
}
}
void NodePaletteModel::RegisterClassNode(const AZStd::string& categoryPath, const AZStd::string& methodClass,
const AZStd::string& methodName, const AZ::BehaviorMethod* behaviorMethod, const AZ::BehaviorContext* behaviorContext,
bool isOverload)
void NodePaletteModel::RegisterClassNode
( const AZStd::string& categoryPath
, const AZStd::string& methodClass
, const AZStd::string& methodName
, const AZ::BehaviorMethod* behaviorMethod
, const AZ::BehaviorContext* behaviorContext
, ScriptCanvas::PropertyStatus propertyStatus
, bool isOverload)
{
ScriptCanvas::NodeTypeIdentifier nodeIdentifier = isOverload ? ScriptCanvas::NodeUtils::ConstructMethodOverloadedNodeIdentifier(methodName) : ScriptCanvas::NodeUtils::ConstructMethodNodeIdentifier(methodClass, methodName);
ScriptCanvas::NodeTypeIdentifier nodeIdentifier = isOverload ? ScriptCanvas::NodeUtils::ConstructMethodOverloadedNodeIdentifier(methodName) : ScriptCanvas::NodeUtils::ConstructMethodNodeIdentifier(methodClass, methodName, propertyStatus);
auto registerIter = m_registeredNodes.find(nodeIdentifier);
@@ -1039,7 +1058,7 @@ namespace ScriptCanvasEditor
methodModelInformation->m_nodeIdentifier = nodeIdentifier;
methodModelInformation->m_classMethod = methodClass;
methodModelInformation->m_methodName = methodName;
methodModelInformation->m_propertyStatus = propertyStatus;
methodModelInformation->m_titlePaletteOverride = "MethodNodeTitlePalette";
methodModelInformation->m_displayName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::ClassMethod, methodClass.c_str(), methodName.c_str(), TranslationItemType::Node, TranslationKeyId::Name);
@@ -1198,7 +1217,15 @@ namespace ScriptCanvasEditor
}
}
void NodePaletteModel::RegisterEBusSenderNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const ScriptCanvas::EBusEventId& eventId, const AZ::BehaviorEBusEventSender&, bool isOverload)
void NodePaletteModel::RegisterEBusSenderNodeModelInformation
( AZStd::string_view categoryPath
, AZStd::string_view busName
, AZStd::string_view eventName
, const ScriptCanvas::EBusBusId& busId
, const ScriptCanvas::EBusEventId& eventId
, const AZ::BehaviorEBusEventSender&
, ScriptCanvas::PropertyStatus propertyStatus
, bool isOverload)
{
ScriptCanvas::NodeTypeIdentifier nodeIdentifier = isOverload ? ScriptCanvas::NodeUtils::ConstructEBusEventSenderOverloadedIdentifier(busId, eventId) : ScriptCanvas::NodeUtils::ConstructEBusEventSenderIdentifier(busId, eventId);
@@ -1212,6 +1239,7 @@ namespace ScriptCanvasEditor
senderInformation->m_titlePaletteOverride = "MethodNodeTitlePalette";
senderInformation->m_categoryPath = categoryPath;
senderInformation->m_nodeIdentifier = nodeIdentifier;
senderInformation->m_propertyStatus = propertyStatus;
senderInformation->m_busName = busName;
senderInformation->m_eventName = eventName;
@@ -83,12 +83,12 @@ namespace ScriptCanvasEditor
void RepopulateModel();
void RegisterCustomNode(AZStd::string_view categoryPath, const AZ::Uuid& uuid, AZStd::string_view name, const AZ::SerializeContext::ClassData* classData);
void RegisterClassNode(const AZStd::string& categoryPath, const AZStd::string& methodClass, const AZStd::string& methodName, const AZ::BehaviorMethod* behaviorMethod, const AZ::BehaviorContext* behaviorContext, bool isOverload);
void RegisterClassNode(const AZStd::string& categoryPath, const AZStd::string& methodClass, const AZStd::string& methodName, const AZ::BehaviorMethod* behaviorMethod, const AZ::BehaviorContext* behaviorContext, ScriptCanvas::PropertyStatus propertyStatus, bool isOverload);
void RegisterMethodNode(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod);
void RegisterGlobalConstant(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod);
void RegisterEBusHandlerNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const AZ::BehaviorEBusHandler::BusForwarderEvent& forwardEvent);
void RegisterEBusSenderNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const ScriptCanvas::EBusEventId& eventId, const AZ::BehaviorEBusEventSender& eventSender, bool isOverload);
void RegisterEBusSenderNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const ScriptCanvas::EBusEventId& eventId, const AZ::BehaviorEBusEventSender& eventSender, ScriptCanvas::PropertyStatus propertyStatus, bool isOverload);
// Asset Based Registrations
AZStd::vector<ScriptCanvas::NodeTypeIdentifier> RegisterScriptEvent(ScriptEvents::ScriptEventsAsset* scriptEventAsset);
@@ -164,6 +164,7 @@ namespace ScriptCanvasEditor
bool m_isOverload{};
AZStd::string m_classMethod;
AZStd::string m_methodName;
ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
};
struct GlobalMethodNodeModelInformation
@@ -202,6 +203,7 @@ namespace ScriptCanvasEditor
ScriptCanvas::EBusBusId m_busId;
ScriptCanvas::EBusEventId m_eventId;
ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
};
struct ScriptEventHandlerNodeModelInformation
@@ -111,7 +111,7 @@ namespace ScriptCanvasEditor
}
else if (auto methodNodeModelInformation = azrtti_cast<const MethodNodeModelInformation*>(modelInformation))
{
createdItem = parentItem->CreateChildNode<ScriptCanvasEditor::ClassMethodEventPaletteTreeItem>(methodNodeModelInformation->m_classMethod, methodNodeModelInformation->m_methodName, methodNodeModelInformation->m_isOverload);
createdItem = parentItem->CreateChildNode<ScriptCanvasEditor::ClassMethodEventPaletteTreeItem>(methodNodeModelInformation->m_classMethod, methodNodeModelInformation->m_methodName, methodNodeModelInformation->m_isOverload, methodNodeModelInformation->m_propertyStatus);
}
else if (auto globalMethodNodeModelInformation = azrtti_cast<const GlobalMethodNodeModelInformation*>(modelInformation);
globalMethodNodeModelInformation != nullptr)
@@ -130,7 +130,7 @@ namespace ScriptCanvasEditor
{
if (!azrtti_istypeof<const ScriptEventSenderNodeModelInformation*>(ebusSenderNodeModelInformation))
{
createdItem = parentItem->CreateChildNode<ScriptCanvasEditor::EBusSendEventPaletteTreeItem>(ebusSenderNodeModelInformation->m_busName, ebusSenderNodeModelInformation->m_eventName, ebusSenderNodeModelInformation->m_busId, ebusSenderNodeModelInformation->m_eventId, ebusSenderNodeModelInformation->m_isOverload);
createdItem = parentItem->CreateChildNode<ScriptCanvasEditor::EBusSendEventPaletteTreeItem>(ebusSenderNodeModelInformation->m_busName, ebusSenderNodeModelInformation->m_eventName, ebusSenderNodeModelInformation->m_busId, ebusSenderNodeModelInformation->m_eventId, ebusSenderNodeModelInformation->m_isOverload, ebusSenderNodeModelInformation->m_propertyStatus);
}
}
@@ -88,6 +88,13 @@ namespace ScriptCanvas
Current,
};
enum class PropertyStatus : AZ::u8
{
Getter,
None,
Setter,
};
struct VersionData
{
AZ_TYPE_INFO(VersionData, "{14C629F6-467B-46FE-8B63-48FDFCA42175}");
@@ -33,6 +33,8 @@ namespace ScriptCanvas
Event,
Free,
Member,
Getter,
Setter,
Count,
};
@@ -394,6 +394,7 @@ namespace ScriptCanvas
AZ::Uuid m_type = AZ::Uuid::CreateNull();
AZStd::string m_className;
AZStd::string m_methodName;
PropertyStatus m_propertyStatus = PropertyStatus::None;
bool IsValid()
{
@@ -104,8 +104,7 @@ namespace ScriptCanvas
const FunctorOut& Nodeable::GetExecutionOutChecked(size_t index) const
{
if (index >= m_outs.size() && m_outs[index])
if (index >= m_outs.size() || !m_outs[index])
{
return m_noOpFunctor;
}
@@ -537,6 +537,20 @@ namespace ScriptCanvas
return azrtti_istypeof<const ScriptCanvas::Nodes::Logic::Break*>(execution->GetId().m_node);
}
bool IsClassPropertyRead(ExecutionTreeConstPtr execution)
{
return execution->GetSymbol() == Symbol::FunctionCall
&& azrtti_istypeof<const ScriptCanvas::Nodes::Core::Method*>(execution->GetId().m_node)
&& azrtti_cast<const ScriptCanvas::Nodes::Core::Method*>(execution->GetId().m_node)->GetPropertyStatus() == PropertyStatus::Getter;
}
bool IsClassPropertyWrite(ExecutionTreeConstPtr execution)
{
return execution->GetSymbol() == Symbol::FunctionCall
&& azrtti_istypeof<const ScriptCanvas::Nodes::Core::Method*>(execution->GetId().m_node)
&& azrtti_cast<const ScriptCanvas::Nodes::Core::Method*>(execution->GetId().m_node)->GetPropertyStatus() == PropertyStatus::Setter;
}
bool IsCodeConstructable(Grammar::VariableConstPtr value)
{
return Data::IsValueType(value->m_datum.GetType())
@@ -1280,7 +1294,6 @@ namespace ScriptCanvas
return identifier;
}
ExecutionTraversalResult TraverseExecutionConnectionsRecurse(const EndpointsResolved& nextEndpoints, AZStd::unordered_set<const Slot*>& previousIns, GraphExecutionPathTraversalListener& listener);
ExecutionTraversalResult TraverseExecutionConnectionsRecurse(const EndpointResolved& in, AZStd::unordered_set<const Slot*>& previousIns, GraphExecutionPathTraversalListener& listener);
@@ -79,6 +79,10 @@ namespace ScriptCanvas
bool IsBreak(const ExecutionTreeConstPtr& execution);
bool IsClassPropertyRead(ExecutionTreeConstPtr execution);
bool IsClassPropertyWrite(ExecutionTreeConstPtr execution);
bool IsCodeConstructable(VariableConstPtr value);
bool IsCycle(const Node& node);
@@ -193,6 +193,22 @@ namespace ScriptCanvas
return DynamicDataType::Any;
}
PropertyStatus Method::GetPropertyStatus() const
{
switch (m_methodType)
{
case MethodType::Getter:
return PropertyStatus::Getter;
case MethodType::Setter:
return PropertyStatus::Setter;
default:
return PropertyStatus::None;
}
}
void Method::InitializeMethod(const MethodConfiguration& config)
{
m_namespaces = config.m_namespaces ? *config.m_namespaces : m_namespaces;
@@ -239,7 +255,7 @@ namespace ScriptCanvas
OnInitializeOutputPost(outputConfig);
}
void Method::InitializeBehaviorMethod(const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName)
void Method::InitializeBehaviorMethod(const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName, PropertyStatus propertyStatus)
{
AZ::BehaviorContext* behaviorContext = nullptr;
AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext);
@@ -255,13 +271,13 @@ namespace ScriptCanvas
{
InitializeFree(namespaces, methodName);
}
else if (auto ebusIterator = behaviorContext->m_ebuses.find(className); ebusIterator == behaviorContext->m_ebuses.end())
else if (auto ebusIterator = behaviorContext->m_ebuses.find(className); ebusIterator != behaviorContext->m_ebuses.end())
{
InitializeClass(namespaces, className, methodName);
InitializeEvent(namespaces, className, methodName);
}
else
{
InitializeEvent(namespaces, className, methodName);
InitializeClass(namespaces, className, methodName, propertyStatus);
}
}
@@ -291,7 +307,7 @@ namespace ScriptCanvas
}
}
void Method::InitializeClass(const NamespacePath&, AZStd::string_view className, AZStd::string_view methodName)
void Method::InitializeClass(const NamespacePath&, AZStd::string_view className, AZStd::string_view methodName, PropertyStatus propertyStatus)
{
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_mutex);
@@ -299,9 +315,11 @@ namespace ScriptCanvas
const AZ::BehaviorClass* bcClass{};
AZStd::string prettyClassName;
if (BehaviorContextUtils::FindClass(method, bcClass, className, methodName, &prettyClassName))
if (BehaviorContextUtils::FindClass(method, bcClass, className, methodName, propertyStatus, &prettyClassName))
{
MethodConfiguration config(*method, MethodType::Member);
const auto methodType = propertyStatus == PropertyStatus::None ? MethodType::Member : propertyStatus == PropertyStatus::Getter ? MethodType::Getter : MethodType::Setter;
MethodConfiguration config(*method, methodType);
config.m_class = bcClass;
config.m_namespaces = &m_namespaces;
config.m_className = &className;
@@ -647,8 +665,12 @@ namespace ScriptCanvas
break;
case MethodType::Member:
case MethodType::Getter:
case MethodType::Setter:
{
if (BehaviorContextUtils::FindClass(method, bcClass, m_className, methodName, nullptr, m_warnOnMissingFunction))
PropertyStatus status = m_methodType == MethodType::Getter ? PropertyStatus::Getter : m_methodType == MethodType::Setter ? PropertyStatus::Setter : PropertyStatus::None;
if (BehaviorContextUtils::FindClass(method, bcClass, m_className, methodName, status, nullptr, m_warnOnMissingFunction))
{
outClass = bcClass;
outMethod = method;
@@ -87,14 +87,13 @@ namespace ScriptCanvas
bool IsObjectClass(AZStd::string_view objectClass) const { return objectClass.compare(m_className) == 0; }
//! Attempts to initialize node with a BehaviorContext BehaviorMethod
//! If the className is empty, then the methodName is searched on the BehaviorContext
//! If className is not empty the className is used to look for a registered BehaviorEBus in the BehaviorContext
//! and if found, the methodName is searched among the BehaviorEBus events
//! Otherwise the className is used to look for a registered BehaviorClass in the BehaviorContext
//! and if found, the methodName is searched among the BehaviorClass methods
void InitializeBehaviorMethod(const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName);
//! 1) If the names match an overloaded method, including one using ExplicitOverloadInfo, then that method is used. Else:
//! 2) If the class name is empty, then search for a free method is searched for in the BehaviorContext and there is a warning if not found.
//! 3) If the class name matches an ebus, methodName is searched among the BehaviorEBus events, and there is a warning if not found.
//! 4) if the class name does NOT match an ebus, className and methodName are used to look for a registered BehaviorClass in the BehaviorContext, and there is a warning if not found.
void InitializeBehaviorMethod(const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName, PropertyStatus propertyStatus);
void InitializeClass(const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName);
void InitializeClass(const NamespacePath& namespaces, AZStd::string_view className, AZStd::string_view methodName, PropertyStatus propertyStatus);
void InitializeEvent(const NamespacePath& namespaces, AZStd::string_view busName, AZStd::string_view eventName);
@@ -126,6 +125,8 @@ namespace ScriptCanvas
virtual DynamicDataType GetOverloadedOutputType(size_t resultIndex) const;
PropertyStatus GetPropertyStatus() const;
protected:
void ConfigureMethod(const AZ::BehaviorMethod& method, const AZ::BehaviorClass* bcClass);
@@ -637,6 +637,16 @@ namespace ScriptCanvas
{
WriteGlobalPropertyRead(execution);
}
else if (Grammar::IsClassPropertyRead(execution))
{
WriteClassPropertyRead(execution);
m_dotLua.WriteNewLine();
}
else if (Grammar::IsClassPropertyWrite(execution))
{
WriteClassPropertyWrite(execution);
m_dotLua.WriteNewLine();
}
else
{
const bool isNullCheckRequired = Grammar::IsFunctionCallNullCheckRequired(execution);
@@ -1208,6 +1218,19 @@ namespace ScriptCanvas
TranslateNodeableParse();
}
void GraphToLua::WriteClassPropertyRead(Grammar::ExecutionTreeConstPtr execution)
{
WriteFunctionCallInput(execution, 0, IsFormatStringInput::No);
m_dotLua.Write(".%s", Grammar::ToIdentifier(execution->GetName()).c_str());
}
void GraphToLua::WriteClassPropertyWrite(Grammar::ExecutionTreeConstPtr execution)
{
WriteClassPropertyRead(execution);
m_dotLua.Write(" = ");
WriteFunctionCallInput(execution, 1, IsFormatStringInput::No);
}
void GraphToLua::WriteConditionalCaseSwitch(Grammar::ExecutionTreeConstPtr execution, Grammar::Symbol symbol, const Grammar::ExecutionChild& child, size_t index)
{
if (symbol == Grammar::Symbol::RandomSwitch)
@@ -116,6 +116,8 @@ namespace ScriptCanvas
void TranslateNodeableParse();
void TranslateStaticInitialization();
void TranslateVariableInitialization(AZStd::string_view leftValue);
void WriteClassPropertyRead(Grammar::ExecutionTreeConstPtr);
void WriteClassPropertyWrite(Grammar::ExecutionTreeConstPtr);
void WriteConditionalCaseSwitch(Grammar::ExecutionTreeConstPtr execution, Grammar::Symbol symbol, const Grammar::ExecutionChild& child, size_t index);
enum class IsLeadingCommaRequired { No, Yes };
void WriteConstructionArgs();
@@ -61,7 +61,7 @@ namespace ScriptCanvas
return { typeID };
}
bool BehaviorContextUtils::FindClass(const AZ::BehaviorMethod*& outMethod, const AZ::BehaviorClass*& outClass, [[maybe_unused]] AZStd::string_view className, [[maybe_unused]] AZStd::string_view methodName, [[maybe_unused]] AZStd::string* outPrettyClassName, [[maybe_unused]] bool warnOnMissing)
bool BehaviorContextUtils::FindClass(const AZ::BehaviorMethod*& outMethod, const AZ::BehaviorClass*& outClass, [[maybe_unused]] AZStd::string_view className, [[maybe_unused]] AZStd::string_view methodName, PropertyStatus propertyStatus, [[maybe_unused]] AZStd::string* outPrettyClassName, [[maybe_unused]] bool warnOnMissing)
{
AZ::BehaviorContext* behaviorContext(nullptr);
AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext);
@@ -81,16 +81,36 @@ namespace ScriptCanvas
const AZ::BehaviorClass* behaviorClass(classIter->second);
AZ_Assert(behaviorClass, "BehaviorContext Class entry %s has no class pointer", className.data());
const auto methodIter(behaviorClass->m_methods.find(methodName.data()));
if (methodIter == behaviorClass->m_methods.end())
AZ::BehaviorMethod* method{};
if (propertyStatus == PropertyStatus::None)
{
AZ_Warning("Script Canvas", !warnOnMissing, "No method by name of %s found in BehaviorContext class %s", methodName.data(), className.data());
return false;
const auto methodIter(behaviorClass->m_methods.find(methodName.data()));
if (methodIter != behaviorClass->m_methods.end())
{
method = methodIter->second;
propertyStatus = PropertyStatus::None;
}
else
{
AZ_Warning("Script Canvas", !warnOnMissing, "No method by name of %s found in BehaviorContext class %s", methodName.data(), className.data());
}
}
else
{
const auto propertyIter(behaviorClass->m_properties.find(methodName.data()));
if (propertyIter == behaviorClass->m_properties.end())
{
AZ_Warning("Script Canvas", !warnOnMissing, "No property by name of %s found in BehaviorContext class %s", methodName.data(), className.data());
return false;
}
method = propertyStatus == PropertyStatus::Getter ? propertyIter->second->m_getter : propertyIter->second->m_setter;
}
// this argument is the first argument...so perhaps remove the distinction between class and member functions, since it probably won't follow polymorphism
// if it will, keep the distinction, and add the first argument separately
AZ::BehaviorMethod* method(methodIter->second);
if (!method)
{
AZ_Warning("Script Canvas", !warnOnMissing, "BehaviorContext Method entry %s has no method pointer", methodName.data());
@@ -21,7 +21,7 @@ namespace ScriptCanvas
class BehaviorContextUtils
{
public:
static bool FindClass(const AZ::BehaviorMethod*& outMethod, const AZ::BehaviorClass*& outClass, AZStd::string_view className, AZStd::string_view methodName, AZStd::string* outPrettyClassName = nullptr, bool warnOnMissing = true);
static bool FindClass(const AZ::BehaviorMethod*& outMethod, const AZ::BehaviorClass*& outClass, AZStd::string_view className, AZStd::string_view methodName, PropertyStatus propertyStatus = PropertyStatus::None, AZStd::string* outPrettyClassName = nullptr, bool warnOnMissing = true);
static bool FindEBus(const AZ::BehaviorEBus*& outEBus, AZStd::string_view ebusName, bool warnOnMissing = true);
static bool FindExplicitOverload(const AZ::BehaviorMethod*& outMethod, const AZ::BehaviorClass*& outClass, AZStd::string_view className, AZStd::string_view methodName, AZStd::string* outPrettyClassName = nullptr);
static AZStd::string FindExposedMethodName(const AZ::BehaviorMethod& method, const AZ::BehaviorClass* behaviorClass);
@@ -58,7 +58,7 @@ namespace ScriptCanvas
}
else
{
return ConstructMethodNodeIdentifier(methodNode->GetRawMethodClassName(), methodNode->GetName());
return ConstructMethodNodeIdentifier(methodNode->GetRawMethodClassName(), methodNode->GetName(), methodNode->GetPropertyStatus());
}
}
else if (auto ebusNode = azrtti_cast<const Nodes::Core::EBusEventHandler*>(scriptCanvasNode))
@@ -158,13 +158,14 @@ namespace ScriptCanvas
return resultHash;
}
NodeTypeIdentifier NodeUtils::ConstructMethodNodeIdentifier(AZStd::string_view methodClass, AZStd::string_view methodName)
NodeTypeIdentifier NodeUtils::ConstructMethodNodeIdentifier(AZStd::string_view methodClass, AZStd::string_view methodName, ScriptCanvas::PropertyStatus propertyStatus)
{
NodeTypeIdentifier resultHash = 0;
AZStd::hash_combine(resultHash, AZStd::hash<AZ::Uuid>()(azrtti_typeid<ScriptCanvas::Nodes::Core::Method>()));
AZStd::hash_combine(resultHash, AZStd::hash<AZStd::string_view>()(methodClass));
AZStd::hash_combine(resultHash, AZStd::hash<AZStd::string>()(methodName));
AZStd::hash_combine(resultHash, AZStd::hash<AZ::u8>()(static_cast<AZ::u8>(propertyStatus)));
return resultHash;
}
@@ -253,7 +254,7 @@ namespace ScriptCanvas
if (auto* method = azrtti_cast<ScriptCanvas::Nodes::Core::Method*>(node))
{
ScriptCanvas::NamespacePath emptyNamespaces;
method->InitializeBehaviorMethod(emptyNamespaces, config.m_className, config.m_methodName);
method->InitializeBehaviorMethod(emptyNamespaces, config.m_className, config.m_methodName, config.m_propertyStatus);
}
}
}
@@ -38,7 +38,7 @@ namespace ScriptCanvas
static NodeTypeIdentifier ConstructCustomNodeIdentifier(const AZ::Uuid& nodeId);
static NodeTypeIdentifier ConstructMethodNodeIdentifier(AZStd::string_view methodClass, AZStd::string_view methodName);
static NodeTypeIdentifier ConstructMethodNodeIdentifier(AZStd::string_view methodClass, AZStd::string_view methodName, ScriptCanvas::PropertyStatus propertyStatus);
static NodeTypeIdentifier ConstructGlobalMethodNodeIdentifier(AZStd::string_view methodName);
static NodeTypeIdentifier ConstructMethodOverloadedNodeIdentifier(AZStd::string_view methodName);
@@ -21,23 +21,24 @@
#include <AzCore/Serialization/EditContext.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/UnitTest/TestTypes.h>
#include <AzCore/UserSettings/UserSettingsComponent.h>
#include <AzCore/std/containers/vector.h>
#include <AzFramework/IO/LocalFileIO.h>
#include <AzTest/AzTest.h>
#include <Nodes/BehaviorContextObjectTestNode.h>
#include <Nodes/Nodeables/SharedDataSlotExample.h>
#include <Nodes/Nodeables/ValuePointerReferenceExample.h>
#include <ScriptCanvas/Core/Graph.h>
#include <ScriptCanvas/Core/SlotConfigurationDefaults.h>
#include <ScriptCanvas/ScriptCanvasGem.h>
#include <ScriptCanvas/SystemComponent.h>
#include <AzCore/UserSettings/UserSettingsComponent.h>
#include "EntityRefTests.h"
#include "ScriptCanvasTestApplication.h"
#include "ScriptCanvasTestBus.h"
#include "ScriptCanvasTestNodes.h"
#include "ScriptCanvasTestUtilities.h"
#include <Nodes/Nodeables/SharedDataSlotExample.h>
#include <Nodes/Nodeables/ValuePointerReferenceExample.h>
#define SC_EXPECT_DOUBLE_EQ(candidate, reference) EXPECT_NEAR(candidate, reference, 0.001)
#define SC_EXPECT_FLOAT_EQ(candidate, reference) EXPECT_NEAR(candidate, reference, 0.001f)
@@ -112,6 +113,9 @@ namespace ScriptCanvasTests
ScriptCanvasTesting::Reflect(m_serializeContext);
ScriptCanvasTesting::Reflect(m_behaviorContext);
ScriptCanvasTestingNodes::BehaviorContextObjectTest::Reflect(m_serializeContext);
ScriptCanvasTestingNodes::BehaviorContextObjectTest::Reflect(m_behaviorContext);
::Nodes::InputMethodSharedDataSlotExampleNode::Reflect(m_serializeContext);
::Nodes::InputMethodSharedDataSlotExampleNode::Reflect(m_behaviorContext);
::Nodes::BranchMethodSharedDataSlotExampleNode::Reflect(m_serializeContext);
@@ -496,7 +496,7 @@ namespace ScriptCanvasTests
ScriptCanvas::Nodes::Core::Method* methodNode(nullptr);
SystemRequestBus::BroadcastResult(methodNode, &SystemRequests::GetNode<ScriptCanvas::Nodes::Core::Method>, methodNodeID);
EXPECT_TRUE(methodNode != nullptr);
methodNode->InitializeBehaviorMethod(emptyNamespaces, className, methodName);
methodNode->InitializeBehaviorMethod(emptyNamespaces, className, methodName, ScriptCanvas::PropertyStatus::None);
return methodNodeID;
}
@@ -30,10 +30,10 @@ namespace ScriptCanvasTestingNodes
{
serializeContext->Class<BehaviorContextObjectTest>()
->Version(0)
->Field("StringName", &BehaviorContextObjectTest::m_string)
->Field("String", &BehaviorContextObjectTest::m_string)
->Field("Name", &BehaviorContextObjectTest::m_name)
;
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
{
editContext->Class<BehaviorContextObjectTest>("Behavior Context Object Test", "An Object that lives within Behavior Context exclusively for testing")
@@ -52,6 +52,7 @@ namespace ScriptCanvasTestingNodes
->Attribute(AZ::Script::Attributes::Category, "Tests/Behavior Context")
->Method("SetString", &BehaviorContextObjectTest::SetString)
->Method("GetString", &BehaviorContextObjectTest::GetString)
->Property("Name", BehaviorValueProperty(&BehaviorContextObjectTest::m_name))
;
}
}
@@ -73,7 +74,7 @@ namespace ScriptCanvasTestingNodes
}
private:
AZStd::string m_name;
AZStd::string m_string;
};
@@ -90,6 +90,11 @@ public:
}
};
TEST_F(ScriptCanvasTestFixture, UseRawBehaviorProperties)
{
RunUnitTestGraph("LY_SC_UnitTest_UseRawBehaviorProperties");
}
TEST_F(ScriptCanvasTestFixture, StringSanitization)
{
RunUnitTestGraph("LY_SC_UnitTest_StringSanitization");