Started radial menu setup

This commit is contained in:
2026-05-25 22:56:19 +03:00
parent 37d19b0817
commit 48951fa305
18 changed files with 761 additions and 9 deletions
@@ -0,0 +1,55 @@
// RadialSliceWidget.h
// A single wedge of the radial menu. One of these exists per entry, each with
// its own dynamic material instance. It knows its own angular span and whether
// it is currently the hovered slice — nothing about its neighbours.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "RadialSliceWidget.generated.h"
class UImage;
class UMaterialInstanceDynamic;
UCLASS(Abstract)
class URadialSliceWidget : public UUserWidget
{
GENERATED_BODY()
public:
// Called once when the slice is created. StartAngle/AngleSize are degrees,
// clockwise from 12 o'clock; the material uses them to draw just this wedge.
void Setup(UMaterialInterface* InSliceMaterial, float StartAngleDeg,
float AngleSizeDeg, UTexture2D* Icon, bool bEnabled);
// Smoothly animate this slice's highlight toward target (0 = off, 1 = on).
// Called every tick by the container with the *undilated* delta.
void UpdateHighlight(bool bIsHovered, float UndilatedDelta);
protected:
virtual void NativeConstruct() override;
UPROPERTY(meta = (BindWidget))
TObjectPtr<UImage> WedgeImage = nullptr;
UPROPERTY(meta = (BindWidget))
TObjectPtr<UImage> IconImage = nullptr;
// Speed of the highlight ease. Higher = snappier.
UPROPERTY(EditDefaultsOnly, Category = "Radial Menu")
float HighlightInterpSpeed = 16.f;
// Distance in px from the menu center to the icon, placing it on the slice's
// centerline. Should sit between the material's InnerRadius and OuterRadius:
// roughly (InnerRadius + OuterRadius) * 0.5 * MenuDiameter.
UPROPERTY(EditDefaultsOnly, Category = "Radial Menu")
float IconRadius = 164.f;
private:
UPROPERTY(Transient)
TObjectPtr<UMaterialInstanceDynamic> WedgeMID = nullptr;
bool bSliceEnabled = true;
float CurrentHighlight = 0.f;
};