Refactor AnimGraph to support asynchronous execution
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user