// 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; }