RealtimeStyleTransferRuntime/Source/LyraGame/UI/Basic/MaterialProgressBar.cpp

260 lines
6.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MaterialProgressBar.h"
#include "Animation/WidgetAnimation.h"
#include "Components/Image.h"
#include "Materials/MaterialInstanceDynamic.h"
void UMaterialProgressBar::SynchronizeProperties()
{
Super::SynchronizeProperties();
if (Image_Bar)
{
Image_Bar->SetBrushFromMaterial(bUseStroke ? StrokeMaterial : NoStrokeMaterial);
CachedMID = nullptr;
CachedProgress = -1.0f;
CachedStartProgress = -1.0f;
#if WITH_EDITORONLY_DATA
if (IsDesignTime())
{
SetProgress_Internal(DesignTime_Progress);
}
#endif
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
if (bOverrideDefaultSegmentEdge)
{
MID->SetScalarParameterValue(TEXT("SegmentEdge"), SegmentEdge);
}
if (bOverrideDefaultSegments)
{
MID->SetScalarParameterValue(TEXT("Segments"), (float)Segments);
}
if (bOverrideDefaultFillEdgeSoftness)
{
MID->SetScalarParameterValue(TEXT("FillEdgeSoftness"), FillEdgeSoftness);
}
if (bOverrideDefaultGlowEdge)
{
MID->SetScalarParameterValue(TEXT("GlowEdge"), GlowEdge);
}
if (bOverrideDefaultGlowSoftness)
{
MID->SetScalarParameterValue(TEXT("GlowSoftness"), GlowSoftness);
}
if (bOverrideDefaultOutlineScale)
{
MID->SetScalarParameterValue(TEXT("OutlineScale"), OutlineScale);
}
}
if (bOverrideDefaultColorA)
{
SetColorA_Internal(CachedColorA);
}
if (bOverrideDefaultColorB)
{
SetColorB_Internal(CachedColorB);
}
if (bOverrideDefaultColorBackground)
{
SetColorBackground_Internal(CachedColorBackground);
}
}
}
#if WITH_EDITOR
void UMaterialProgressBar::OnWidgetRebuilt()
{
Super::OnWidgetRebuilt();
if (IsDesignTime() && Image_Bar)
{
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
if (!bOverrideDefaultColorA)
{
MID->GetVectorParameterValue(TEXT("ColorA"), CachedColorA);
}
if (!bOverrideDefaultColorB)
{
MID->GetVectorParameterValue(TEXT("ColorB"), CachedColorB);
}
if (!bOverrideDefaultColorBackground)
{
MID->GetVectorParameterValue(TEXT("Unfilled Color"), CachedColorBackground);
}
if (!bOverrideDefaultSegmentEdge)
{
MID->GetScalarParameterValue(TEXT("SegmentEdge"), SegmentEdge);
}
if (!bOverrideDefaultSegments)
{
float SegmentsFloat;
MID->GetScalarParameterValue(TEXT("Segments"), SegmentsFloat);
Segments = FMath::TruncToInt(SegmentsFloat);
}
if (!bOverrideDefaultFillEdgeSoftness)
{
MID->GetScalarParameterValue(TEXT("FillEdgeSoftness"), FillEdgeSoftness);
}
if (!bOverrideDefaultGlowEdge)
{
MID->GetScalarParameterValue(TEXT("GlowEdge"), GlowEdge);
}
if (!bOverrideDefaultGlowSoftness)
{
MID->GetScalarParameterValue(TEXT("GlowSoftness"), GlowSoftness);
}
if (!bOverrideDefaultOutlineScale)
{
MID->GetScalarParameterValue(TEXT("OutlineScale"), OutlineScale);
}
}
}
}
#endif
void UMaterialProgressBar::OnAnimationFinished_Implementation(const UWidgetAnimation* Animation)
{
Super::OnAnimationFinished_Implementation(Animation);
if (BoundAnim_FillBar == Animation)
{
OnFillAnimationFinished.Broadcast();
}
}
void UMaterialProgressBar::SetProgress(float Progress)
{
if (CachedProgress != Progress)
{
SetProgress_Internal(Progress);
}
}
void UMaterialProgressBar::SetStartProgress(float StartProgress)
{
if (CachedStartProgress != StartProgress)
{
SetStartProgress_Internal(StartProgress);
}
}
void UMaterialProgressBar::SetColorA(FLinearColor ColorA)
{
if (CachedColorA != ColorA)
{
SetColorA_Internal(ColorA);
}
}
void UMaterialProgressBar::SetColorB(FLinearColor ColorB)
{
if (CachedColorB != ColorB)
{
SetColorB_Internal(ColorB);
}
}
void UMaterialProgressBar::SetColorBackground(FLinearColor ColorBackground)
{
if (CachedColorBackground != ColorBackground)
{
SetColorBackground_Internal(ColorBackground);
}
}
void UMaterialProgressBar::AnimateProgressFromStart(float Start, float End, float AnimSpeed)
{
SetStartProgress(Start);
SetProgress(End);
PlayAnimation(BoundAnim_FillBar, 0.0f, 1, EUMGSequencePlayMode::Forward, AnimSpeed);
}
void UMaterialProgressBar::AnimateProgressFromCurrent(float End, float AnimSpeed)
{
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
const float CurrentStart = MID->K2_GetScalarParameterValue(TEXT("StartProgress"));
const float CurrentEnd = MID->K2_GetScalarParameterValue(TEXT("Progress"));
const float CurrentFill = MID->K2_GetScalarParameterValue(TEXT("FillAmount"));
const float NewStart = FMath::Lerp(CurrentStart, CurrentEnd, CurrentFill);
AnimateProgressFromStart(NewStart, End, AnimSpeed);
}
}
void UMaterialProgressBar::SetProgress_Internal(float Progress)
{
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
CachedProgress = Progress;
MID->SetScalarParameterValue(TEXT("Progress"), CachedProgress);
}
}
void UMaterialProgressBar::SetStartProgress_Internal(float StartProgress)
{
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
CachedStartProgress = StartProgress;
MID->SetScalarParameterValue(TEXT("StartProgress"), CachedStartProgress);
}
}
void UMaterialProgressBar::SetColorA_Internal(FLinearColor ColorA)
{
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
CachedColorA = ColorA;
MID->SetVectorParameterValue(TEXT("ColorA"), CachedColorA);
}
}
void UMaterialProgressBar::SetColorB_Internal(FLinearColor ColorB)
{
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
CachedColorB = ColorB;
MID->SetVectorParameterValue(TEXT("ColorB"), CachedColorB);
}
}
void UMaterialProgressBar::SetColorBackground_Internal(FLinearColor ColorBackground)
{
if (UMaterialInstanceDynamic* MID = GetBarDynamicMaterial())
{
CachedColorBackground = ColorBackground;
MID->SetVectorParameterValue(TEXT("Unfilled Color"), CachedColorBackground);
}
}
UMaterialInstanceDynamic* UMaterialProgressBar::GetBarDynamicMaterial() const
{
if (!CachedMID)
{
CachedMID = Image_Bar->GetDynamicMaterial();
}
return CachedMID;
}