Called to send a transform 1 for this component to the rendering thread
/** Called to send a transform 1 for this component to the rendering thread
*
* **Caution**, this is called concurrently on multiple threads (but never the same component concurrently)
*/
virtual void SendRenderTransform_Concurrent();
void UActorComponent::DoDeferredRenderUpdates_Concurrent()
{
checkf(!HasAnyFlags(RF_Unreachable), TEXT("%s"), *GetFullName());
checkf(! IsTemplate(), TEXT("%s"), *[GetFullName]);
checkf(! IsPendingKill (), TEXT("%s"), *[GetFullName]);
if(! IsRegistered ())
{
UE_LOG(LogActorComponent, [Log], TEXT("UpdateComponent: (%s) Not registered, Aborting."), *[GetPathName]);
return;
}
if(bRenderStateDirty)
{
SCOPE_CYCLE_COUNTER(STAT_PostTickComponentRecreate);
[RecreateRenderState_Concurrent];
checkf(!bRenderStateDirty, TEXT("Failed to route CreateRenderState_Concurrent (%s)"), *[GetFullName]);
}
else
{
SCOPE_CYCLE_COUNTER(STAT_PostTickComponentLW);
if(bRenderTransformDirty)
{
// Update the component's transform if the actor has been moved since it was last updated.
[SendRenderTransform_Concurrent];
}
if(bRenderDynamicDataDirty)
{
[SendRenderDynamicData_Concurrent];
}
}
}
void [UActorComponent::MarkRenderDynamicDataDirty]
{
// If registered and has a render state to make as dirty
if([IsRegistered] && [bRenderStateCreated](../../../API%5C%5CRuntime%5C%5CEngine%5C%5CComponents%5C%5CUActorComponent%5C%5CbRenderStateCreated))
{
// Flag as dirty
bRenderDynamicDataDirty = true;
[MarkForNeededEndOfFrameUpdate];
}
}