260 lines
6.2 KiB
C++
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;
|
|
}
|