void SWidget::SlatePrepass(float LayoutScaleMultiplier) { //SLATE_CYCLE_COUNTER_SCOPE_CUSTOM_DETAILED(SLATE_STATS_DETAIL_LEVEL_MED, GSlatePrepass, GetType()); // TODO Figure out a better way than to just reset the pointer. This causes problems when we prepass // volatile widgets, who still need to know about their invalidation panel incase they vanish themselves. // Reset the layout cache object each pre-pass to ensure we never access a stale layout cache object // as this widget could have been moved in and out of a panel that was invalidated between frames. //LayoutCache = nullptr; if ( bCanHaveChildren ) { // Cache child desired sizes first. This widget's desired size is // a function of its children's sizes. FChildren* MyChildren = this->GetChildren(); int32 NumChildren = MyChildren->Num(); for ( int32 ChildIndex=0; ChildIndex < NumChildren; ++ChildIndex ) { const TSharedRef<SWidget>& Child = MyChildren->GetChildAt(ChildIndex); if ( Child->Visibility.Get() != EVisibility::Collapsed ) { const float ChildLayoutScaleMultiplier = GetRelativeLayoutScale(MyChildren->GetSlotAt(ChildIndex)); // Recur: Descend down the widget tree. Child->SlatePrepass(LayoutScaleMultiplier*ChildLayoutScaleMultiplier); } } } // Cache this widget's desired size. CacheDesiredSize(LayoutScaleMultiplier); }