Merge remote-tracking branch 'origin/development' into sc-editor-asset-redux
Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
@@ -59,6 +59,7 @@ namespace ScriptCanvas
|
||||
m_script = AZStd::move(other.m_script);
|
||||
m_requiredAssets = AZStd::move(other.m_requiredAssets);
|
||||
m_requiredScriptEvents = AZStd::move(other.m_requiredScriptEvents);
|
||||
m_areStaticsInitialized = AZStd::move(other.m_areStaticsInitialized);
|
||||
}
|
||||
|
||||
return *this;
|
||||
|
||||
@@ -76,6 +76,9 @@ namespace ScriptCanvas
|
||||
AZStd::vector<AZ::BehaviorValueParameter> m_activationInputStorage;
|
||||
Execution::ActivationInputRange m_activationInputRange;
|
||||
|
||||
// used to initialize statics only once, and not necessarily on the loading thread
|
||||
bool m_areStaticsInitialized = false;
|
||||
|
||||
bool RequiresStaticInitialization() const;
|
||||
|
||||
bool RequiresDependencyConstructionParameters() const;
|
||||
|
||||
@@ -94,7 +94,6 @@ namespace ScriptCanvas
|
||||
RuntimeAsset* runtimeAsset = asset.GetAs<RuntimeAsset>();
|
||||
AZ_Assert(runtimeAsset, "RuntimeAssetHandler::InitAsset This should be a Script Canvas runtime asset, as this is the only type this handler processes!");
|
||||
Execution::Context::InitializeActivationData(runtimeAsset->GetData());
|
||||
Execution::InitializeInterpretedStatics(runtimeAsset->GetData());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,4 +156,5 @@ namespace ScriptCanvas
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -56,10 +56,16 @@ namespace ScriptCanvas
|
||||
{
|
||||
const Data::Type outputType = (unpackedTypes.size() == 1 && AZ::BehaviorContextHelper::IsStringParameter(*result)) ? Data::Type::String() : Data::FromAZType(unpackedTypes[resultIndex]);
|
||||
|
||||
AZStd::string resultSlotName(AZStd::string::format("Result: %s", Data::GetName(outputType).data()));
|
||||
AZStd::string resultSlotName(Data::GetName(outputType));
|
||||
|
||||
AZStd::string className = outputConfig.config.m_className ? *outputConfig.config.m_className : "";
|
||||
if (className.empty())
|
||||
{
|
||||
className = outputConfig.config.m_prettyClassName;
|
||||
}
|
||||
|
||||
GraphCanvas::TranslationKey key;
|
||||
key << "BehaviorClass" << *outputConfig.config.m_className << "methods" << *outputConfig.config.m_lookupName << "results" << resultIndex << "details";
|
||||
key << "BehaviorClass" << className << "methods" << *outputConfig.config.m_lookupName << "results" << resultIndex << "details";
|
||||
|
||||
GraphCanvas::TranslationRequests::Details details;
|
||||
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
|
||||
@@ -74,7 +80,6 @@ namespace ScriptCanvas
|
||||
if (outputConfig.isReturnValueOverloaded)
|
||||
{
|
||||
DynamicDataSlotConfiguration slotConfiguration;
|
||||
//slotConfiguration.m_name = outputConfig.outputNamePrefix + resultSlotName;
|
||||
|
||||
slotConfiguration.m_dynamicDataType = outputConfig.methodNode->GetOverloadedOutputType(resultIndex);
|
||||
|
||||
|
||||
@@ -2963,6 +2963,11 @@ namespace ScriptCanvas
|
||||
}
|
||||
}
|
||||
|
||||
AZStd::string Node::GetNodeTypeName() const
|
||||
{
|
||||
return RTTI_GetTypeName();
|
||||
}
|
||||
|
||||
AZStd::string Node::GetDebugName() const
|
||||
{
|
||||
if (GetEntityId().IsValid())
|
||||
|
||||
@@ -525,6 +525,7 @@ namespace ScriptCanvas
|
||||
|
||||
void SignalDeserialized();
|
||||
|
||||
virtual AZStd::string GetNodeTypeName() const;
|
||||
virtual AZStd::string GetDebugName() const;
|
||||
virtual AZStd::string GetNodeName() const;
|
||||
|
||||
@@ -1093,7 +1094,7 @@ protected:
|
||||
{
|
||||
DataSlotConfiguration slotConfiguration;
|
||||
|
||||
slotConfiguration.m_name = AZStd::string::format("%s: %s", t_Traits::GetResultName(0), Data::GetName(Data::FromAZType<AZStd::decay_t<ResultType>>()).data());
|
||||
slotConfiguration.m_name = t_Traits::GetResultName(0);
|
||||
slotConfiguration.SetType(Data::FromAZType<AZStd::decay_t<ResultType>>());
|
||||
slotConfiguration.SetConnectionType(ConnectionType::Output);
|
||||
|
||||
@@ -1115,7 +1116,7 @@ protected:
|
||||
{
|
||||
DataSlotConfiguration slotConfiguration;
|
||||
|
||||
slotConfiguration.m_name = AZStd::string::format("%s: %s", t_Traits::GetResultName(Index), Data::GetName(Data::FromAZType<AZStd::decay_t<AZStd::tuple_element_t<Index, ResultType>>>()).data());
|
||||
slotConfiguration.m_name = t_Traits::GetResultName(Index);
|
||||
slotConfiguration.SetType(Data::FromAZType<AZStd::decay_t<AZStd::tuple_element_t<Index, ResultType>>>());
|
||||
|
||||
slotConfiguration.SetConnectionType(connectionType);
|
||||
|
||||
@@ -256,7 +256,7 @@ namespace ScriptCanvas
|
||||
{
|
||||
DataSlotConfiguration slotConfiguration;
|
||||
|
||||
slotConfiguration.m_name = AZStd::string::format("%s: %s", Data::Traits<ArgType>::GetName().data(), t_Traits::GetArgName(Index));
|
||||
slotConfiguration.m_name = t_Traits::GetArgName(Index);
|
||||
slotConfiguration.ConfigureDatum(AZStd::move(Datum(Data::FromAZType(Data::Traits<ArgType>::GetAZType()), Datum::eOriginality::Copy)));
|
||||
|
||||
slotConfiguration.SetConnectionType(connectionType);
|
||||
|
||||
@@ -182,7 +182,7 @@ namespace ScriptCanvas
|
||||
|
||||
static AZ::Uuid GetAZType(const Data::Type& = {}) { return azrtti_typeid<CRCType>(); }
|
||||
static Data::Type GetSCType(const AZ::TypeId& = AZ::TypeId::CreateNull()) { return Data::Type::CRC(); }
|
||||
static AZStd::string GetName(const Data::Type& = {}) { return "CRC"; }
|
||||
static AZStd::string GetName(const Data::Type& = {}) { return "Tag"; }
|
||||
static Type GetDefault(const Data::Type& = {}) { return CRCType(); }
|
||||
static bool IsDefault(const Type& value, const Data::Type& = {}) { return value == GetDefault(); }
|
||||
};
|
||||
@@ -198,7 +198,7 @@ namespace ScriptCanvas
|
||||
|
||||
static AZ::Uuid GetAZType(const Data::Type& = {}) { return azrtti_typeid<EntityIDType>(); }
|
||||
static Data::Type GetSCType(const AZ::TypeId& = AZ::TypeId::CreateNull()) { return Data::Type::EntityID(); }
|
||||
static AZStd::string GetName(const Data::Type& = {}) { return "EntityID"; }
|
||||
static AZStd::string GetName(const Data::Type& = {}) { return "EntityId"; }
|
||||
static Type GetDefault(const Data::Type& = {}) { return GraphOwnerId; }
|
||||
static bool IsDefault(const Type& value, const Data::Type& = {}) { return value == GetDefault(); }
|
||||
};
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
#include <ScriptCanvas/Execution/ExecutionStateDeclarations.h>
|
||||
#include <ScriptCanvas/Grammar/PrimitivesDeclarations.h>
|
||||
|
||||
#if !defined(_RELEASE)
|
||||
#define SCRIPT_CANVAS_RUNTIME_ASSET_CHECK
|
||||
#endif
|
||||
|
||||
namespace AZ
|
||||
{
|
||||
class ReflectContext;
|
||||
|
||||
+40
-28
@@ -501,41 +501,53 @@ namespace ScriptCanvas
|
||||
return lua_gettop(lua);
|
||||
}
|
||||
|
||||
void InitializeInterpretedStatics(const RuntimeData& runtimeData)
|
||||
void InitializeInterpretedStatics(RuntimeData& runtimeData)
|
||||
{
|
||||
#if defined(AZ_PROFILE_BUILD) || defined(AZ_DEBUG_BUILD)
|
||||
Execution::InitializeFromLuaStackFunctions(const_cast<Grammar::DebugSymbolMap&>(runtimeData.m_debugMap));
|
||||
#endif
|
||||
if (runtimeData.RequiresStaticInitialization())
|
||||
if (!runtimeData.m_areStaticsInitialized)
|
||||
{
|
||||
AZ::ScriptLoadResult result{};
|
||||
AZ::ScriptSystemRequestBus::BroadcastResult(result, &AZ::ScriptSystemRequests::LoadAndGetNativeContext, runtimeData.m_script, AZ::k_scriptLoadBinary, AZ::ScriptContextIds::DefaultScriptContextId);
|
||||
AZ_Assert(result.status == AZ::ScriptLoadResult::Status::Initial, "ExecutionStateInterpreted script asset was valid but failed to load.");
|
||||
AZ_Assert(result.lua, "Must have a default script context and a lua_State");
|
||||
AZ_Assert(lua_istable(result.lua, -1), "No run-time execution was available for this script");
|
||||
runtimeData.m_areStaticsInitialized = true;
|
||||
|
||||
auto lua = result.lua;
|
||||
// Lua: table
|
||||
lua_getfield(lua, -1, Grammar::k_InitializeStaticsName);
|
||||
// Lua: table, ?
|
||||
if (lua_isfunction(lua, -1))
|
||||
for (auto& dependency : runtimeData.m_requiredAssets)
|
||||
{
|
||||
// Lua: table, function
|
||||
lua_pushvalue(lua, -2);
|
||||
// Lua: table, function, table
|
||||
for (auto& clonerSource : runtimeData.m_cloneSources)
|
||||
{
|
||||
lua_pushlightuserdata(lua, const_cast<void*>(reinterpret_cast<const void*>(&clonerSource)));
|
||||
}
|
||||
// Lua: table, function, table, cloners...
|
||||
AZ::Internal::LuaSafeCall(lua, aznumeric_caster(runtimeData.m_cloneSources.size() + 1), 0);
|
||||
// Lua: table
|
||||
lua_pop(lua, 1);
|
||||
InitializeInterpretedStatics(dependency.Get()->GetData());
|
||||
}
|
||||
else
|
||||
|
||||
#if defined(AZ_PROFILE_BUILD) || defined(AZ_DEBUG_BUILD)
|
||||
Execution::InitializeFromLuaStackFunctions(const_cast<Grammar::DebugSymbolMap&>(runtimeData.m_debugMap));
|
||||
#endif
|
||||
AZ_WarningOnce("ScriptCanvas", !runtimeData.m_areStaticsInitialized, "ScriptCanvas runtime data already initalized");
|
||||
|
||||
if (runtimeData.RequiresStaticInitialization())
|
||||
{
|
||||
AZ::ScriptLoadResult result{};
|
||||
AZ::ScriptSystemRequestBus::BroadcastResult(result, &AZ::ScriptSystemRequests::LoadAndGetNativeContext, runtimeData.m_script, AZ::k_scriptLoadBinary, AZ::ScriptContextIds::DefaultScriptContextId);
|
||||
AZ_Assert(result.status == AZ::ScriptLoadResult::Status::Initial, "ExecutionStateInterpreted script asset was valid but failed to load.");
|
||||
AZ_Assert(result.lua, "Must have a default script context and a lua_State");
|
||||
AZ_Assert(lua_istable(result.lua, -1), "No run-time execution was available for this script");
|
||||
|
||||
auto lua = result.lua;
|
||||
// Lua: table
|
||||
lua_getfield(lua, -1, Grammar::k_InitializeStaticsName);
|
||||
// Lua: table, ?
|
||||
lua_pop(lua, 2);
|
||||
if (lua_isfunction(lua, -1))
|
||||
{
|
||||
// Lua: table, function
|
||||
lua_pushvalue(lua, -2);
|
||||
// Lua: table, function, table
|
||||
for (auto& clonerSource : runtimeData.m_cloneSources)
|
||||
{
|
||||
lua_pushlightuserdata(lua, const_cast<void*>(reinterpret_cast<const void*>(&clonerSource)));
|
||||
}
|
||||
// Lua: table, function, table, cloners...
|
||||
AZ::Internal::LuaSafeCall(lua, aznumeric_caster(runtimeData.m_cloneSources.size() + 1), 0);
|
||||
// Lua: table
|
||||
lua_pop(lua, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Lua: table, ?
|
||||
lua_pop(lua, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ namespace ScriptCanvas
|
||||
|
||||
void InterpretedUnloadData(RuntimeData& runtimeData);
|
||||
|
||||
void InitializeInterpretedStatics(const RuntimeData& runtimeData);
|
||||
void InitializeInterpretedStatics(RuntimeData& runtimeData);
|
||||
|
||||
int InitializeNodeableOutKeys(lua_State* lua);
|
||||
|
||||
|
||||
+23
-6
@@ -6,14 +6,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "ExecutionStateInterpreted.h"
|
||||
|
||||
#include <AzCore/Asset/AssetManager.h>
|
||||
#include <AzCore/Script/ScriptContext.h>
|
||||
#include <AzCore/Script/ScriptSystemBus.h>
|
||||
|
||||
#include "Execution/Interpreted/ExecutionStateInterpretedUtility.h"
|
||||
#include "Execution/RuntimeComponent.h"
|
||||
#include <Execution/Interpreted/ExecutionInterpretedAPI.h>
|
||||
#include <Execution/Interpreted/ExecutionStateInterpreted.h>
|
||||
#include <Execution/Interpreted/ExecutionStateInterpretedUtility.h>
|
||||
#include <Execution/RuntimeComponent.h>
|
||||
|
||||
namespace ExecutionStateInterpretedCpp
|
||||
{
|
||||
@@ -33,7 +32,25 @@ namespace ScriptCanvas
|
||||
ExecutionStateInterpreted::ExecutionStateInterpreted(const ExecutionStateConfig& config)
|
||||
: ExecutionState(config)
|
||||
, m_interpretedAsset(config.runtimeData.m_script)
|
||||
{}
|
||||
{
|
||||
RuntimeAsset* runtimeAsset = config.asset.Get();
|
||||
|
||||
#if defined(SCRIPT_CANVAS_RUNTIME_ASSET_CHECK)
|
||||
if (!runtimeAsset)
|
||||
{
|
||||
AZ_Error("ScriptCanvas", false
|
||||
, "ExecutionStateInterpreted created with ExecutionStateConfig that contained bad runtime asset data. %s"
|
||||
, config.asset.GetId().ToString<AZStd::string>().data());
|
||||
return;
|
||||
}
|
||||
#else
|
||||
AZ_Assert(false
|
||||
, "ExecutionStateInterpreted created with ExecutionStateConfig that contained bad runtime asset data. %s"
|
||||
, config.asset.GetId().ToString<AZStd::string>().data());
|
||||
#endif
|
||||
|
||||
Execution::InitializeInterpretedStatics(runtimeAsset->GetData());
|
||||
}
|
||||
|
||||
void ExecutionStateInterpreted::ClearLuaRegistryIndex()
|
||||
{
|
||||
|
||||
@@ -19,9 +19,8 @@
|
||||
#include <ScriptCanvas/Execution/ExecutionContext.h>
|
||||
#include <ScriptCanvas/Execution/ExecutionState.h>
|
||||
|
||||
#if !defined(_RELEASE)
|
||||
#define SCRIPT_CANVAS_RUNTIME_ASSET_CHECK
|
||||
#endif
|
||||
#include <ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.h>
|
||||
#include <AzCore/Asset/AssetSerializer.h>
|
||||
|
||||
AZ_DECLARE_BUDGET(ScriptCanvas);
|
||||
|
||||
@@ -112,11 +111,13 @@ namespace ScriptCanvas
|
||||
#if defined(SCRIPT_CANVAS_RUNTIME_ASSET_CHECK)
|
||||
if (!m_runtimeOverrides.m_runtimeAsset.Get())
|
||||
{
|
||||
AZ_Error("ScriptCanvas", false, "RuntimeComponent::m_runtimeAsset AssetId: %s was valid, but the data was not pre-loaded, so this script will not run", m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
AZ_Error("ScriptCanvas", false, "RuntimeComponent::m_runtimeAsset AssetId: %s was valid, but the data was not pre-loaded, so this script will not run"
|
||||
, m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
return;
|
||||
}
|
||||
#else
|
||||
AZ_Assert(m_runtimeOverrides.m_runtimeAsset.Get(), "RuntimeComponent::m_runtimeAsset AssetId: %s was valid, but the data was not pre-loaded, so this script will not run", m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
AZ_Assert(m_runtimeOverrides.m_runtimeAsset.Get(), "RuntimeComponent::m_runtimeAsset AssetId: %s was valid, but the data was not pre-loaded, so this script will not run"
|
||||
, m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
#endif
|
||||
|
||||
AZ_PROFILE_SCOPE(ScriptCanvas, "RuntimeComponent::InitializeExecution (%s)", m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().c_str());
|
||||
@@ -126,11 +127,13 @@ namespace ScriptCanvas
|
||||
#if defined(SCRIPT_CANVAS_RUNTIME_ASSET_CHECK)
|
||||
if (!m_executionState)
|
||||
{
|
||||
AZ_Error("ScriptCanvas", false, "RuntimeComponent::m_runtimeAsset AssetId: %s failed to create an execution state, possibly due to missing dependent asset, script will not run", m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
AZ_Error("ScriptCanvas", false, "RuntimeComponent::m_runtimeAsset AssetId: %s failed to create an execution state, possibly due to missing dependent asset, script will not run"
|
||||
, m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
return;
|
||||
}
|
||||
#else
|
||||
AZ_Assert(m_executionState, "RuntimeComponent::m_runtimeAsset AssetId: %s failed to create an execution state, possibly due to missing dependent asset, script will not run", m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
AZ_Assert(m_executionState, "RuntimeComponent::m_runtimeAsset AssetId: %s failed to create an execution state, possibly due to missing dependent asset, script will not run"
|
||||
, m_runtimeOverrides.m_runtimeAsset.GetId().ToString<AZStd::string>().data());
|
||||
#endif
|
||||
|
||||
AZ::EntityBus::Handler::BusConnect(GetEntityId());
|
||||
@@ -179,4 +182,3 @@ namespace ScriptCanvas
|
||||
}
|
||||
}
|
||||
|
||||
#undef SCRIPT_CANVAS_RUNTIME_ASSET_CHECK
|
||||
|
||||
@@ -518,7 +518,7 @@ namespace ScriptCanvas
|
||||
{
|
||||
const AZ::BehaviorParameter& argument(event.m_parameters[AZ::eBehaviorBusForwarderEventIndices::Result]);
|
||||
Data::Type inputType(AZ::BehaviorContextHelper::IsStringParameter(argument) ? Data::Type::String() : Data::FromAZType(argument.m_typeId));
|
||||
const AZStd::string argName(AZStd::string::format("Result: %s", Data::GetName(inputType).data()).data());
|
||||
const AZStd::string argName(Data::GetName(inputType));
|
||||
|
||||
DataSlotConfiguration resultConfiguration;
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <Core/SlotExecutionMap.h>
|
||||
#include <Libraries/Core/MethodUtility.h>
|
||||
#include <ScriptCanvas/Utils/BehaviorContextUtils.h>
|
||||
#include <AzCore/StringFunc/StringFunc.h>
|
||||
|
||||
namespace MethodCPP
|
||||
{
|
||||
@@ -389,6 +390,9 @@ namespace ScriptCanvas
|
||||
MethodConfiguration config(*method, MethodType::Free);
|
||||
config.m_namespaces = &m_namespaces;
|
||||
config.m_lookupName = &methodName;
|
||||
config.m_prettyClassName = methodName;
|
||||
AZ::StringFunc::Replace(config.m_prettyClassName, "::Getter", "");
|
||||
AZ::StringFunc::Replace(config.m_prettyClassName, "::Setter", "");
|
||||
InitializeMethod(config);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,7 +204,7 @@ namespace ScriptCanvas
|
||||
|
||||
DataSlotConfiguration slotConfiguration;
|
||||
|
||||
slotConfiguration.m_name = AZStd::string::format("Result: %s", argumentTypeName.c_str());
|
||||
slotConfiguration.m_name = argumentTypeName;
|
||||
|
||||
slotConfiguration.SetConnectionType(ConnectionType::Input);
|
||||
slotConfiguration.ConfigureDatum(AZStd::move(Datum(inputType, Datum::eOriginality::Copy, nullptr, AZ::Uuid::CreateNull())));
|
||||
|
||||
@@ -272,7 +272,7 @@ namespace ScriptCanvas
|
||||
|
||||
Data::Type outputType(AZ::BehaviorContextHelper::IsStringParameter(*result) ? Data::Type::String() : Data::FromAZType(result->m_typeId));
|
||||
// multiple outs will need out value names
|
||||
const AZStd::string resultSlotName(AZStd::string::format("Result: %s", Data::GetName(outputType).c_str()));
|
||||
const AZStd::string resultSlotName(Data::GetName(outputType));
|
||||
|
||||
DataSlotConfiguration slotConfiguration;
|
||||
|
||||
@@ -343,7 +343,7 @@ namespace ScriptCanvas
|
||||
{
|
||||
Data::Type outputType(AZ::BehaviorContextHelper::IsStringParameter(*result) ? Data::Type::String() : Data::FromAZType(result->m_typeId));
|
||||
// multiple outs will need out value names
|
||||
const AZStd::string resultSlotName(AZStd::string::format("Result: %s", Data::GetName(outputType).c_str()));
|
||||
const AZStd::string resultSlotName(Data::GetName(outputType));
|
||||
|
||||
Slot* slot = GetSlotByName(resultSlotName);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user