From 88eb20eefaafb86296e9e7eb7b956858297cbc0e Mon Sep 17 00:00:00 2001 From: Mateus Rodrigues Date: Wed, 27 May 2026 21:47:54 -0300 Subject: [PATCH] feat(ui/progressbar): edge (linha + glow) que acompanha PrimaryLevel + auto-hide nos extremos Novo material UI_M_ProgressBar_Edge: linha vertical sharp no lado direito do Fill (U = PrimaryLevel) com halo lateral configuravel. Params: - EdgeColour: cor + alpha da linha (default branco-creme 0.85) - EdgeWidth: largura da linha em UV - EdgeGlowWidth: largura do halo lateral (0 = sem glow) - EdgeGlowIntensity: forca do halo (0..1) - PrimaryLevel: posicao (sincronizada pelo C++) WBP UI_ProgressBar_Master ganha EdgeImage entre Fill e Shimmer (Overlay). C++ UUIProgressBar_Base: - BindWidgetOptional EdgeImage + EdgeMID + UPROPERTYs override - 5 setters runtime (Visible, Colour, Width, GlowWidth, GlowIntensity) - ApplyPrimaryToMID propaga PrimaryLevel pro EdgeMID em cada tick de animacao - UpdateEdgeVisibility() helper auto-oculta Edge quando PrimaryLevel <= 0 ou >= 1 (linha encostaria na borda) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../UI/Shared/UI_ProgressBar_Master.uasset | Bin 38084 -> 39304 bytes .../Progressbar/UI_M_ProgressBar_Edge.uasset | Bin 0 -> 18712 bytes .../Game/UI/Widgets/UIProgressBar_Base.cpp | 82 +++++++++++++++++- .../ZMMO/Game/UI/Widgets/UIProgressBar_Base.h | 61 +++++++++++++ 4 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 Content/ZMMO/UI/Themes/Default/Progressbar/UI_M_ProgressBar_Edge.uasset diff --git a/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset b/Content/ZMMO/UI/Shared/UI_ProgressBar_Master.uasset index 548e52293116f0723054a403188a814ccc3d35de..ad5ed14f9dc701f25804196358934ca4b3f74dfd 100644 GIT binary patch literal 39304 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 AqyPW_ literal 38084 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 literal 0 HcmV?d00001 diff --git a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp index ac53323..11bee67 100644 --- a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp +++ b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.cpp @@ -36,6 +36,12 @@ namespace static const FName P_ShimmerSpeed("ShimmerSpeed"); static const FName P_ShimmerSoftness("ShimmerSoftness"); + // Edge material params + static const FName P_EdgeColour("EdgeColour"); + static const FName P_EdgeWidth("EdgeWidth"); + static const FName P_EdgeGlowWidth("EdgeGlowWidth"); + static const FName P_EdgeGlowIntensity("EdgeGlowIntensity"); + FORCEINLINE float EaseOutCubic(float Alpha) { return 1.f - FMath::Pow(1.f - Alpha, 3.f); @@ -279,6 +285,40 @@ void UUIProgressBar_Base::SetGridLineThickness(float Thickness) if (TrackGridMID) TrackGridMID->SetScalarParameterValue(P_GridLineThickness, GridLineThickness); } +void UUIProgressBar_Base::SetEdgeVisible(bool bVisible) +{ + bShowEdge = bVisible; + UpdateEdgeVisibility(); +} + +void UUIProgressBar_Base::SetEdgeColour(FLinearColor Color) +{ + EdgeColour = Color; + bOverrideEdgeColour = true; + if (EdgeMID) EdgeMID->SetVectorParameterValue(P_EdgeColour, Color); +} + +void UUIProgressBar_Base::SetEdgeWidth(float Width01) +{ + EdgeWidth = FMath::Clamp(Width01, 0.001f, 0.1f); + bOverrideEdgeWidth = true; + if (EdgeMID) EdgeMID->SetScalarParameterValue(P_EdgeWidth, EdgeWidth); +} + +void UUIProgressBar_Base::SetEdgeGlowWidth(float GlowWidth01) +{ + EdgeGlowWidth = FMath::Clamp(GlowWidth01, 0.f, 0.2f); + bOverrideEdgeGlowWidth = true; + if (EdgeMID) EdgeMID->SetScalarParameterValue(P_EdgeGlowWidth, EdgeGlowWidth); +} + +void UUIProgressBar_Base::SetEdgeGlowIntensity(float Intensity01) +{ + EdgeGlowIntensity = FMath::Clamp(Intensity01, 0.f, 1.f); + bOverrideEdgeGlowIntensity = true; + if (EdgeMID) EdgeMID->SetScalarParameterValue(P_EdgeGlowIntensity, EdgeGlowIntensity); +} + void UUIProgressBar_Base::SetShimmerVisible(bool bVisible) { bShowShimmer = bVisible; @@ -394,6 +434,15 @@ void UUIProgressBar_Base::EnsureMIDs() ApplyBrushStyle(); } } + if (EdgeImage && !EdgeMID) + { + if (UMaterialInterface* Mat = Cast(EdgeImage->GetBrush().GetResourceObject())) + { + EdgeMID = UMaterialInstanceDynamic::Create(Mat, this); + EdgeImage->SetBrushFromMaterial(EdgeMID); + ApplyBrushStyle(); + } + } } void UUIProgressBar_Base::ApplyMaterialOverrides() @@ -426,12 +475,20 @@ void UUIProgressBar_Base::ApplyMaterialOverrides() if (bOverrideShimmerSpeed) ShimmerMID->SetScalarParameterValue(P_ShimmerSpeed, ShimmerSpeed); if (bOverrideShimmerSoftness) ShimmerMID->SetScalarParameterValue(P_ShimmerSoftness, ShimmerSoftness); } + if (EdgeMID) + { + if (bOverrideEdgeColour) EdgeMID->SetVectorParameterValue(P_EdgeColour, EdgeColour); + if (bOverrideEdgeWidth) EdgeMID->SetScalarParameterValue(P_EdgeWidth, EdgeWidth); + if (bOverrideEdgeGlowWidth) EdgeMID->SetScalarParameterValue(P_EdgeGlowWidth, EdgeGlowWidth); + if (bOverrideEdgeGlowIntensity) EdgeMID->SetScalarParameterValue(P_EdgeGlowIntensity, EdgeGlowIntensity); + } - // Visibilidade do TrackGrid + Shimmer acompanham os toggles + // Visibilidade dos widgets opcionais if (TrackGridImage) { TrackGridImage->SetVisibility(bShowTrackGrid ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); } + UpdateEdgeVisibility(); if (ShimmerImage) { ShimmerImage->SetVisibility(bShowShimmer ? ESlateVisibility::HitTestInvisible : ESlateVisibility::Collapsed); @@ -478,6 +535,7 @@ void UUIProgressBar_Base::ApplyBrushStyle() Apply(BackgroundImage, /*bAllowBorder=*/true, 0.f); Apply(TrackGridImage, /*bAllowBorder=*/false, 0.f); Apply(FillImage, /*bAllowBorder=*/false, 0.f); + Apply(EdgeImage, /*bAllowBorder=*/false, 0.f); Apply(ShimmerImage, /*bAllowBorder=*/false, InsetForShimmer); if (ShimmerImage) @@ -495,6 +553,28 @@ void UUIProgressBar_Base::ApplyPrimaryToMID(float Value) { FillMID->SetScalarParameterValue(P_PrimaryLevel, Value); } + // Edge acompanha o nível Primary (posição da linha = PrimaryLevel) + if (EdgeMID) + { + EdgeMID->SetScalarParameterValue(P_PrimaryLevel, Value); + } + UpdateEdgeVisibility(); +} + +void UUIProgressBar_Base::UpdateEdgeVisibility() +{ + if (!EdgeImage) + { + return; + } + if (!bShowEdge) + { + EdgeImage->SetVisibility(ESlateVisibility::Collapsed); + return; + } + // Auto-hide quando Primary está nos extremos (0 ou 1) — Edge encostaria na borda. + const bool bAtExtreme = (CurrentPrimaryLevel <= 0.f) || (CurrentPrimaryLevel >= 1.f); + EdgeImage->SetVisibility(bAtExtreme ? ESlateVisibility::Collapsed : ESlateVisibility::HitTestInvisible); } void UUIProgressBar_Base::ApplySecondaryToMID(float Value) diff --git a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h index 6a3495b..643dd29 100644 --- a/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h +++ b/Source/ZMMO/Game/UI/Widgets/UIProgressBar_Base.h @@ -164,6 +164,45 @@ public: meta = (EditCondition = "bOverrideGridLineThickness", ClampMin = "0.001", ClampMax = "0.2")) float GridLineThickness = 0.02f; + // === Edge (linha vertical no fim do Primary) === + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge") + bool bShowEdge = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeColour = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeColour")) + FLinearColor EdgeColour = FLinearColor(1.f, 0.94f, 0.78f, 0.85f); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeWidth = false; + + /** Largura da linha em UV (fração da barra). 0.005 ≈ 2px em barra de 400px. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeWidth", ClampMin = "0.001", ClampMax = "0.1")) + float EdgeWidth = 0.005f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeGlowWidth = false; + + /** Largura do halo lateral em UV. 0 = sem glow. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeGlowWidth", ClampMin = "0", ClampMax = "0.2")) + float EdgeGlowWidth = 0.02f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (InlineEditConditionToggle)) + bool bOverrideEdgeGlowIntensity = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Edge", + meta = (EditCondition = "bOverrideEdgeGlowIntensity", ClampMin = "0", ClampMax = "1")) + float EdgeGlowIntensity = 0.5f; + // === Shimmer (faixa de luz animada por cima do Fill) === UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProgressBar|Shimmer") @@ -292,6 +331,21 @@ public: UFUNCTION(BlueprintCallable, Category = "ProgressBar|TrackGrid") void SetGridLineThickness(float Thickness); + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeVisible(bool bVisible); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeColour(FLinearColor Color); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeWidth(float Width01); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeGlowWidth(float GlowWidth01); + + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Edge") + void SetEdgeGlowIntensity(float Intensity01); + UFUNCTION(BlueprintCallable, Category = "ProgressBar|Shimmer") void SetShimmerVisible(bool bVisible); @@ -341,6 +395,9 @@ protected: UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr TrackGridImage; + UPROPERTY(meta = (BindWidgetOptional)) + TObjectPtr EdgeImage; + UPROPERTY(meta = (BindWidgetOptional)) TObjectPtr ShimmerImage; @@ -354,6 +411,9 @@ private: UPROPERTY(Transient) TObjectPtr TrackGridMID; + UPROPERTY(Transient) + TObjectPtr EdgeMID; + UPROPERTY(Transient) TObjectPtr ShimmerMID; @@ -362,6 +422,7 @@ private: void ApplySecondaryToMID(float Value); void ApplyMaterialOverrides(); void ApplyBrushStyle(); + void UpdateEdgeVisibility(); float CurrentPrimaryLevel = 1.f; float TargetPrimaryLevel = 1.f;