Add **Animation Instance Data node to Anim Graph** for caching value per-model
This commit is contained in:
@@ -115,6 +115,11 @@ void SlotBucketInit(AnimGraphInstanceData::Bucket& bucket)
|
||||
bucket.Slot.LoopsLeft = 0;
|
||||
}
|
||||
|
||||
void InstanceDataBucketInit(AnimGraphInstanceData::Bucket& bucket)
|
||||
{
|
||||
bucket.InstanceData.Init = true;
|
||||
}
|
||||
|
||||
bool SortMultiBlend1D(const byte& a, const byte& b, AnimGraphNode* n)
|
||||
{
|
||||
// Sort items by X location from the lowest to the highest
|
||||
@@ -432,10 +437,12 @@ bool AnimGraphBase::onNodeLoaded(Node* n)
|
||||
}
|
||||
// Animation Slot
|
||||
case 32:
|
||||
{
|
||||
ADD_BUCKET(SlotBucketInit);
|
||||
break;
|
||||
}
|
||||
// Animation Instance Data
|
||||
case 33:
|
||||
ADD_BUCKET(InstanceDataBucketInit);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
// Custom
|
||||
|
||||
@@ -315,6 +315,12 @@ public:
|
||||
int32 LoopsLeft;
|
||||
};
|
||||
|
||||
struct InstanceDataBucket
|
||||
{
|
||||
bool Init;
|
||||
float Data[4];
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The single data storage bucket for the instanced animation graph node. Used to store the node state (playback position, state, transition data).
|
||||
/// </summary>
|
||||
@@ -327,6 +333,7 @@ public:
|
||||
BlendPoseBucket BlendPose;
|
||||
StateMachineBucket StateMachine;
|
||||
SlotBucket Slot;
|
||||
InstanceDataBucket InstanceData;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -2035,10 +2035,22 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Animation Instance Data
|
||||
case 33:
|
||||
{
|
||||
auto& bucket = context.Data->State[node->BucketIndex].InstanceData;
|
||||
if (bucket.Init)
|
||||
{
|
||||
bucket.Init = false;
|
||||
*(Float4*)bucket.Data = (Float4)tryGetValue(node->GetBox(1), Value::Zero);
|
||||
}
|
||||
value = *(Float4*)bucket.Data;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
context.ValueCache.Add(boxBase, value);
|
||||
context.ValueCache[boxBase] = value;
|
||||
}
|
||||
|
||||
void AnimGraphExecutor::ProcessGroupFunction(Box* boxBase, Node* node, Value& value)
|
||||
|
||||
Reference in New Issue
Block a user