Merging from development

Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>
This commit is contained in:
Esteban Papp
2021-12-07 12:35:41 -08:00
parent b1eeebb6b6
commit cd5306febf
334 changed files with 9946 additions and 3757 deletions
@@ -8,16 +8,17 @@
#pragma once
#include <AzCore/std/smart_ptr/enable_shared_from_this.h>
#include <AzCore/Asset/AssetCommon.h>
#include <Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetBus.h>
#include <Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h>
#include <ScriptCanvas/Asset/AssetDescription.h>
namespace ScriptCanvas
{
class ScriptCanvasAssetBase
: public AZ::Data::AssetData
, public AZStd::enable_shared_from_this<ScriptCanvasAssetBase>
, ScriptCanvas::ScriptCanvasAssetBusRequestBus::Handler
{
@@ -6,15 +6,18 @@
*
*/
#include <AzCore/Component/ComponentApplicationBus.h>
#include <AzCore/Interface/Interface.h>
#include <AzCore/RTTI/AttributeReader.h>
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/StringFunc/StringFunc.h>
#include <Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h>
#include "Core.h"
#include "Attributes.h"
#include "Core.h"
#include <Core/Graph.h>
namespace ScriptCanvas
{
@@ -182,5 +185,156 @@ namespace ScriptCanvas
serializeContext->RegisterType(typeId, AZStd::move(classData), EventPlaceholderAnyCreator);
}
}
namespace ScriptCanvasEditor
{
SourceHandle::SourceHandle()
: m_id(AZ::Uuid::CreateNull())
{}
SourceHandle::SourceHandle(const SourceHandle& data, const AZ::Uuid& id, const AZ::IO::Path& path)
: m_data(data.m_data)
, m_id(id)
, m_path(path)
{
m_path.MakePreferred();
m_id = id;
}
SourceHandle::SourceHandle(ScriptCanvas::DataPtr graph, const AZ::Uuid& id, const AZ::IO::Path& path)
: m_data(graph)
, m_id(id)
, m_path(path)
{
m_path.MakePreferred();
m_id = id;
}
SourceHandle::SourceHandle(const SourceHandle& data, const AZ::IO::Path& path)
: m_data(data.m_data)
, m_id(AZ::Uuid::CreateNull())
, m_path(path)
{
m_path.MakePreferred();
}
SourceHandle::SourceHandle(ScriptCanvas::DataPtr graph, const AZ::IO::Path& path)
: m_data(graph)
, m_id(AZ::Uuid::CreateNull())
, m_path(path)
{
m_path.MakePreferred();
}
bool SourceHandle::AnyEquals(const SourceHandle& other) const
{
return m_data && m_data == other.m_data
|| !m_id.IsNull() && m_id == other.m_id
|| !m_path.empty() && m_path == other.m_path;
}
void SourceHandle::Clear()
{
m_data = nullptr;
m_id = AZ::Uuid::CreateNull();
m_path.clear();
}
// return a SourceHandle with only the Id and Path, but without a pointer to the data
SourceHandle SourceHandle::Describe() const
{
return SourceHandle(nullptr, m_id, m_path);
}
GraphPtrConst SourceHandle::Get() const
{
return m_data ? m_data->GetEditorGraph() : nullptr;
}
const AZ::Uuid& SourceHandle::Id() const
{
return m_id;
}
bool SourceHandle::IsDescriptionValid() const
{
return !m_id.IsNull() && !m_path.empty();
}
bool SourceHandle::IsGraphValid() const
{
return m_data != nullptr;
}
GraphPtr SourceHandle::Mod() const
{
return m_data ? m_data->ModEditorGraph() : nullptr;
}
bool SourceHandle::operator==(const SourceHandle& other) const
{
return m_data.get() == other.m_data.get()
&& m_id == other.m_id
&& m_path == other.m_path;
}
bool SourceHandle::operator!=(const SourceHandle& other) const
{
return !(*this == other);
}
const AZ::IO::Path& SourceHandle::Path() const
{
return m_path;
}
bool SourceHandle::PathEquals(const SourceHandle& other) const
{
return m_path == other.m_path;
}
void SourceHandle::Reflect(AZ::ReflectContext* context)
{
if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
{
serializeContext->Class<SourceHandle>()
->Version(0)
->Field("id", &SourceHandle::m_id)
->Field("path", &SourceHandle::m_path)
;
}
}
AZStd::string SourceHandle::ToString() const
{
return AZStd::string::format
( "%s, %s, %s"
, IsGraphValid() ? "O" : "X"
, m_path.empty() ? m_path.c_str() : "<no name>"
, m_id.IsNull() ? "<null id>" : m_id.ToString<AZStd::string>().c_str());
}
}
namespace ScriptCanvas
{
const Graph* ScriptCanvasData::GetGraph() const
{
return AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Graph>(m_scriptCanvasEntity.get());
}
const ScriptCanvasEditor::Graph* ScriptCanvasData::GetEditorGraph() const
{
return reinterpret_cast<const ScriptCanvasEditor::Graph*>(GetGraph());
}
Graph* ScriptCanvasData::ModGraph()
{
return AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Graph>(m_scriptCanvasEntity.get());
}
ScriptCanvasEditor::Graph* ScriptCanvasData::ModEditorGraph()
{
return reinterpret_cast<ScriptCanvasEditor::Graph*>(ModGraph());
}
}
@@ -9,18 +9,19 @@
#pragma once
#include <AzCore/Component/EntityId.h>
#include <AzCore/Component/EntityUtils.h>
#include <AzCore/Component/NamedEntityId.h>
#include <AzCore/IO/Path/Path.h>
#include <AzCore/Math/MathUtils.h>
#include <AzCore/Math/Uuid.h>
#include <AzCore/Memory/Memory.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/RTTI/BehaviorContext.h>
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/std/any.h>
#include <AzCore/std/hash.h>
#include <AzCore/Component/EntityUtils.h>
#include <AzCore/Component/NamedEntityId.h>
#include <Core/NamedId.h>
#include <ScriptCanvas/Grammar/PrimitivesDeclarations.h>
@@ -61,6 +62,10 @@ namespace ScriptCanvas
class Node;
class Edge;
class Graph;
using GraphPtr = Graph*;
using GraphPtrConst = const Graph*;
using ID = AZ::EntityId;
@@ -297,6 +302,105 @@ namespace ScriptCanvas
void ReflectEventTypeOnDemand(const AZ::TypeId& typeId, AZStd::string_view name, AZ::IRttiHelper* rttiHelper = nullptr);
}
namespace ScriptCanvas
{
class ScriptCanvasData;
using DataPtr = AZStd::intrusive_ptr<ScriptCanvasData>;
using DataPtrConst = AZStd::intrusive_ptr<const ScriptCanvasData>;
}
namespace ScriptCanvasEditor
{
class Graph;
using GraphPtr = Graph*;
using GraphPtrConst = const Graph*;
class SourceHandle
{
public:
AZ_TYPE_INFO(SourceHandle, "{65855A98-AE2F-427F-BFC8-69D45265E312}");
AZ_CLASS_ALLOCATOR(SourceHandle, AZ::SystemAllocator, 0);
static void Reflect(AZ::ReflectContext* context);
SourceHandle();
SourceHandle(const SourceHandle& data, const AZ::Uuid& id, const AZ::IO::Path& path);
SourceHandle(ScriptCanvas::DataPtr graph, const AZ::Uuid& id, const AZ::IO::Path& path);
SourceHandle(const SourceHandle& data, const AZ::IO::Path& path);
SourceHandle(ScriptCanvas::DataPtr graph, const AZ::IO::Path& path);
bool AnyEquals(const SourceHandle& other) const;
void Clear();
// return a SourceHandle with only the Id and Path, but without a pointer to the data
SourceHandle Describe() const;
GraphPtrConst Get() const;
const AZ::Uuid& Id() const;
bool IsDescriptionValid() const;
bool IsGraphValid() const;
GraphPtr Mod() const;
bool operator==(const SourceHandle& other) const;
bool operator!=(const SourceHandle& other) const;
const AZ::IO::Path& Path() const;
bool PathEquals(const SourceHandle& other) const;
AZStd::string ToString() const;
private:
ScriptCanvas::DataPtr m_data;
AZ::Uuid m_id = AZ::Uuid::CreateNull();
AZ::IO::Path m_path;
};
}
namespace ScriptCanvas
{
class ScriptCanvasData
: public AZStd::intrusive_refcount<AZStd::atomic_uint, AZStd::intrusive_default_delete>
{
public:
AZ_RTTI(ScriptCanvasData, "{1072E894-0C67-4091-8B64-F7DB324AD13C}");
AZ_CLASS_ALLOCATOR(ScriptCanvasData, AZ::SystemAllocator, 0);
ScriptCanvasData() = default;
virtual ~ScriptCanvasData() = default;
ScriptCanvasData(ScriptCanvasData&& other);
ScriptCanvasData& operator=(ScriptCanvasData&& other);
static void Reflect(AZ::ReflectContext* reflectContext);
AZ::Entity* GetScriptCanvasEntity() const { return m_scriptCanvasEntity.get(); }
const Graph* GetGraph() const;
const ScriptCanvasEditor::Graph* GetEditorGraph() const;
Graph* ModGraph();
ScriptCanvasEditor::Graph* ModEditorGraph();
AZStd::unique_ptr<AZ::Entity> m_scriptCanvasEntity;
private:
ScriptCanvasData(const ScriptCanvasData&) = delete;
};
}
namespace AZStd
{
template<>
@@ -304,11 +408,28 @@ namespace AZStd
{
using argument_type = ScriptCanvas::SlotId;
using result_type = AZStd::size_t;
AZ_FORCE_INLINE size_t operator()(const argument_type& ref) const
inline size_t operator()(const argument_type& ref) const
{
return AZStd::hash<AZ::Uuid>()(ref.m_id);
}
};
template<>
struct hash<ScriptCanvasEditor::SourceHandle>
{
using argument_type = ScriptCanvasEditor::SourceHandle;
using result_type = AZStd::size_t;
inline size_t operator()(const argument_type& handle) const
{
size_t h = 0;
hash_combine(h, handle.Id());
hash_combine(h, handle.Path());
hash_combine(h, handle.Get());
return h;
}
};
}
#define SCRIPT_CANVAS_INFINITE_LOOP_DETECTION_COUNT (2000000)
@@ -14,14 +14,12 @@
#include <AzCore/std/containers/stack.h>
#include <AzCore/std/containers/unordered_map.h>
#include <AzCore/std/parallel/mutex.h>
#include <ScriptCanvas/Core/GraphBus.h>
#include <ScriptCanvas/Core/GraphData.h>
#include <ScriptCanvas/Debugger/Bus.h>
#include <ScriptCanvas/Execution/ErrorBus.h>
#include <ScriptCanvas/Execution/ExecutionContext.h>
#include <ScriptCanvas/Debugger/StatusBus.h>
#include <ScriptCanvas/Debugger/ValidationEvents/ValidationEvent.h>
namespace ScriptCanvas
@@ -189,8 +187,6 @@ namespace ScriptCanvas
bool IsGraphObserved() const override;
void SetIsGraphObserved(bool isObserved) override;
AZ::Data::AssetType GetAssetType() const override;
////
const AZStd::unordered_map<AZ::EntityId, Node* >& GetNodeMapping() const { return m_nodeMapping; }
@@ -200,7 +196,7 @@ namespace ScriptCanvas
GraphData m_graphData;
AZ::Data::AssetType m_assetType;
private:
ScriptCanvasId m_scriptCanvasId;
ExecutionMode m_executionMode = ExecutionMode::Interpreted;
@@ -209,7 +205,7 @@ namespace ScriptCanvas
GraphVariableManagerRequests* m_variableRequests = nullptr;
// Keeps a mapping of the Node EntityId -> NodeComponent.
// Saves looking up the NodeComponent everytime we need the Node.
// Saves looking up the NodeComponent every time we need the Node.
AZStd::unordered_map<AZ::EntityId, Node* > m_nodeMapping;
bool m_isObserved;
@@ -147,9 +147,6 @@ namespace ScriptCanvas
//! returns a pair of <variable datum pointer, variable name> with the supplied id
//! The variable datum pointer is non-null if the variable has been found
virtual GraphVariable* FindVariableById(const VariableId& variableId) = 0;
virtual AZ::Data::AssetType GetAssetType() const = 0;
};
using GraphRequestBus = AZ::EBus<GraphRequests>;
@@ -80,6 +80,7 @@ namespace ScriptCanvas
->Attribute(AZ::ScriptCanvasAttributes::VariableCreationForbidden, AZ::AttributeIsValid::IfPresent)
->Attribute(AZ::Script::Attributes::UseClassIndexAllowNil, AZ::AttributeIsValid::IfPresent)
->Constructor<ExecutionStateWeakPtr>()
->Attribute(AZ::Script::Attributes::DefaultConstructorOverrideIndex, 0)
->Method("Deactivate", &Nodeable::Deactivate)
->Method("InitializeExecutionState", &Nodeable::InitializeExecutionState)
->Method("InitializeExecutionOuts", &Nodeable::InitializeExecutionOuts)
@@ -68,7 +68,7 @@ namespace ExecutionInterpretedAPICpp
{
if (lua_isstring(lua, -1))
{
AZ::ScriptContext::FromNativeContext(lua)->Error(AZ::ScriptContext::ErrorType::Error, true, "%s", lua_tostring(lua, -1));
AZ::ScriptContext::FromNativeContext(lua)->Error(AZ::ScriptContext::ErrorType::Error, true, lua_tostring(lua, -1));
}
else
{
@@ -401,7 +401,7 @@ namespace ScriptCanvas
// \note: the the object is being constructed, and is assumed to never leave or re-enter Lua again
AZ_Assert(lua_isuserdata(lua, -2) && !lua_islightuserdata(lua, -2), "Error in compiled lua file, 1st argument to OverrideNodeableMetatable is not userdata (Nodeable)");
AZ_Assert(lua_istable(lua, -1), "Error in compiled lua file, 2nd argument to OverrideNodeableMetatable is not a Lua table");
[[maybe_unused]] auto userData = reinterpret_cast<AZ::LuaUserData*>(lua_touserdata(lua, -2));
AZ_Assert(userData && userData->magicData == AZ_CRC_CE("AZLuaUserData"), "this isn't user data");
// Lua: LuaUserData::nodeable, class_mt
@@ -143,6 +143,8 @@ namespace ScriptCanvas
AZ_Assert(m_luaRegistryIndex == LUA_NOREF, "ExecutionStateInterpreted already in the Lua registry and risks double deletion");
// Lua: instance
m_luaRegistryIndex = luaL_ref(m_luaState, LUA_REGISTRYINDEX);
AZ_Assert(m_luaRegistryIndex != LUA_REFNIL, "ExecutionStateInterpreted was nil when trying to gain a reference");
AZ_Assert(m_luaRegistryIndex != LUA_NOREF, "ExecutionStateInterpreted failed to gain a reference");
}
void ExecutionStateInterpreted::Reflect(AZ::ReflectContext* reflectContext)
@@ -117,7 +117,7 @@ namespace ScriptCanvas
lua_pushvalue(lua, -2);
// Lua: instance, graph_VM.k_OnGraphStartFunctionName, instance
const int result = Execution::InterpretedSafeCall(lua, 1, 0);
// Lua: instance ?
// Lua: instance, ?
if (result == LUA_OK)
{
// Lua: instance
@@ -152,19 +152,19 @@ namespace ScriptCanvas
{
if (azrtti_istypeof<Nodes::String::Format>(execution->GetId().m_node))
{
return MetaDataPtr(aznew FormatStringMetaData());
return AZStd::make_shared<FormatStringMetaData>();
}
else if (azrtti_istypeof<Nodes::String::Print>(execution->GetId().m_node))
{
return MetaDataPtr(aznew PrintMetaData());
return AZStd::make_shared<PrintMetaData>();
}
else if (azrtti_istypeof<Nodes::Math::MathExpression>(execution->GetId().m_node))
{
return MetaDataPtr(aznew MathExpressionMetaData());
return AZStd::make_shared<MathExpressionMetaData>();
}
else if (execution->GetSymbol() == Symbol::FunctionCall)
{
return MetaDataPtr(aznew FunctionCallDefaultMetaData());
return AZStd::make_shared<FunctionCallDefaultMetaData>();
}
}
@@ -335,6 +335,11 @@ namespace ScriptCanvas
return &m_datum;
}
Datum& GraphVariable::ModDatum()
{
return m_datum;
}
void GraphVariable::ConfigureDatumView(ModifiableDatumView& datumView)
{
datumView.ConfigureView((*this));
@@ -493,14 +498,6 @@ namespace ScriptCanvas
return m_sortPriority;
}
bool GraphVariable::IsInFunction() const
{
AZ::Data::AssetType assetType = AZ::Data::AssetType::CreateNull();
ScriptCanvas::GraphRequestBus::EventResult(assetType, m_scriptCanvasId, &ScriptCanvas::GraphRequests::GetAssetType);
return assetType == azrtti_typeid<ScriptCanvas::SubgraphInterfaceAsset>();
}
AZ::u32 GraphVariable::OnInitialValueSourceChanged()
{
VariableNotificationBus::Event(GetGraphScopedId(), &VariableNotifications::OnVariableInitialValueSourceChanged);
@@ -127,6 +127,8 @@ namespace ScriptCanvas
const Datum* GetDatum() const;
Datum& ModDatum();
bool IsComponentProperty() const;
void ConfigureDatumView(ModifiableDatumView& accessController);
@@ -194,9 +196,7 @@ namespace ScriptCanvas
choices.emplace_back(AZStd::make_pair(static_cast<unsigned char>(VariableFlags::Scope::Function), s_ScopeNames[1]));
return choices;
}
bool IsInFunction() const;
void OnScopeTypedChanged();
AZ::u32 OnInitialValueSourceChanged();
void OnSortPriorityChanged();