#pragma once #include "PixelShaderViewer.h" #include "PeakFile/PeakFile.h" #include "PluginHost/Sampler.h" class FSamplePatternInstance; class IWaveformHandle { public: virtual ~IWaveformHandle() = default; virtual TArrayView GetWaveform(int32 SizeX) = 0; virtual bool NeedUpdate() const { return false; } DECLARE_MULTICAST_DELEGATE(FRequestUpdate) FRequestUpdate OnRequestUpdate; }; class ARONA_API SWaveformViewer : public SLeafWidget { public: SWaveformViewer(); SLATE_BEGIN_ARGS(SWaveformViewer) { } SLATE_ARGUMENT(TSharedPtr, WaveformHandle) SLATE_END_ARGS() /** Constructs this widget with InArgs */ void Construct(const FArguments& InArgs); virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override; virtual int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override; virtual FVector2D ComputeDesiredSize(float LayoutScaleMultiplier) const override { return RenderTarget->GetSize(); } private: TSharedPtr RenderTarget; TSharedPtr ComputeShader; TSharedPtr Params; TSharedPtr ComputeElement; struct FCSParam { FLinearColor WaveColor; FLinearColor BgColor; float LineUV; float PeaksPerPixel; } mutable Param; TSharedPtr WaveformHandle; };