Refactor AnimGraph to support asynchronous execution

This commit is contained in:
Wojtek Figat
2021-06-12 12:29:47 +02:00
parent b8ad4bdd2a
commit 41ad835d86
6 changed files with 199 additions and 252 deletions

View File

@@ -89,13 +89,10 @@ void AnimGraphExecutor::initRuntime()
void AnimGraphExecutor::ProcessGroupCustom(Box* boxBase, Node* nodeBase, Value& value)
{
auto box = (AnimGraphBox*)boxBase;
if (box->IsCacheValid())
{
// Return cache
value = box->Cache;
auto& context = Context.Get();
if (context.ValueCache.TryGet(boxBase, value))
return;
}
auto box = (AnimGraphBox*)boxBase;
auto node = (AnimGraphNode*)nodeBase;
auto& data = node->Data.Custom;
value = Value::Null;
@@ -105,16 +102,16 @@ void AnimGraphExecutor::ProcessGroupCustom(Box* boxBase, Node* nodeBase, Value&
return;
// Prepare node context
InternalContext context;
context.Graph = &_graph;
context.GraphExecutor = this;
context.Node = node;
context.NodeId = node->ID;
context.BoxId = box->ID;
context.DeltaTime = _deltaTime;
context.CurrentFrameIndex = _currentFrameIndex;;
context.BaseModel = _graph.BaseModel->GetOrCreateManagedInstance();
context.Instance = _data->Object ? _data->Object->GetOrCreateManagedInstance() : nullptr;
InternalContext internalContext;
internalContext.Graph = &_graph;
internalContext.GraphExecutor = this;
internalContext.Node = node;
internalContext.NodeId = node->ID;
internalContext.BoxId = box->ID;
internalContext.DeltaTime = context.DeltaTime;
internalContext.CurrentFrameIndex = context.CurrentFrameIndex;
internalContext.BaseModel = _graph.BaseModel->GetOrCreateManagedInstance();
internalContext.Instance = context.Data->Object ? context.Data->Object->GetOrCreateManagedInstance() : nullptr;
// Peek managed object
const auto obj = mono_gchandle_get_target(data.Handle);
@@ -126,7 +123,7 @@ void AnimGraphExecutor::ProcessGroupCustom(Box* boxBase, Node* nodeBase, Value&
// Evaluate node
void* params[1];
params[0] = &context;
params[0] = &internalContext;
MonoObject* exception = nullptr;
MonoObject* result = data.Evaluate->Invoke(obj, params, &exception);
if (exception)
@@ -138,7 +135,7 @@ void AnimGraphExecutor::ProcessGroupCustom(Box* boxBase, Node* nodeBase, Value&
// Extract result
value = MUtils::UnboxVariant(result);
box->Cache = value;
context.ValueCache.Add(boxBase, value);
}
bool AnimGraph::IsReady() const