Files
UnrealEngine/Engine/Source/Developer/TraceInsights/Public/Insights/ViewModels/TimingEventsTrack.h
2025-05-18 13:04:45 +08:00

124 lines
4.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreTypes.h"
#include "Fonts/SlateFontInfo.h"
#include "Templates/SharedPointer.h"
// TraceInsights
#include "Insights/ViewModels/BaseTimingTrack.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
struct FSlateBrush;
class TRACEINSIGHTS_API ITimingEventsTrackDrawStateBuilder
{
public:
typedef TFunctionRef<const FString(float /*AvailableWidth*/)> GetEventNameCallback;
public:
virtual ~ITimingEventsTrackDrawStateBuilder() = default;
virtual void AddEvent(double InEventStartTime, double InEventEndTime, uint32 InEventDepth, const TCHAR* InEventName, uint64 InEventType = 0, uint32 InEventColor = 0) = 0;
virtual void AddEvent(double InEventStartTime, double InEventEndTime, uint32 InEventDepth, uint32 InEventColor, GetEventNameCallback InGetEventNameCallback) = 0;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class TRACEINSIGHTS_API FTimingEventsTrack : public FBaseTimingTrack
{
INSIGHTS_DECLARE_RTTI(FTimingEventsTrack, FBaseTimingTrack)
public:
explicit FTimingEventsTrack();
explicit FTimingEventsTrack(const FString& InTrackName);
virtual ~FTimingEventsTrack();
//////////////////////////////////////////////////
// FBaseTimingTrack
virtual void Reset() override;
virtual void PreUpdate(const ITimingTrackUpdateContext& Context) override;
virtual void PostUpdate(const ITimingTrackUpdateContext& Context) override;
virtual void Draw(const ITimingTrackDrawContext& Context) const override;
virtual void PostDraw(const ITimingTrackDrawContext& Context) const override;
virtual void DrawEvent(const ITimingTrackDrawContext& Context, const ITimingEvent& InTimingEvent, EDrawEventMode InDrawMode) const override;
virtual const TSharedPtr<const ITimingEvent> GetEvent(float InPosX, float InPosY, const FTimingTrackViewport& Viewport) const override;
virtual TSharedPtr<ITimingEventFilter> GetFilterByEvent(const TSharedPtr<const ITimingEvent> InTimingEvent) const override;
//////////////////////////////////////////////////
virtual void BuildDrawState(ITimingEventsTrackDrawStateBuilder& Builder, const ITimingTrackUpdateContext& Context) = 0;
virtual void BuildFilteredDrawState(ITimingEventsTrackDrawStateBuilder& Builder, const ITimingTrackUpdateContext& Context) {}
protected:
int32 GetNumLanes() const { return NumLanes; }
void SetNumLanes(int32 InNumLanes) { NumLanes = InNumLanes; }
const struct FTimingEventsTrackDrawState& GetDrawState() const { return *DrawState; }
const struct FTimingEventsTrackDrawState& GetFilteredDrawState() const { return *FilteredDrawState; }
float GetFilteredDrawStateOpacity() const { return FilteredDrawStateInfo.Opacity; }
bool UpdateFilteredDrawStateOpacity() const
{
if (FilteredDrawStateInfo.Opacity == 1.0f)
{
return true;
}
else
{
FilteredDrawStateInfo.Opacity = FMath::Min(1.0f, FilteredDrawStateInfo.Opacity + 0.05f);
return false;
}
}
void UpdateTrackHeight(const ITimingTrackUpdateContext& Context);
void DrawEvents(const ITimingTrackDrawContext& Context, const float OffsetY = 1.0f) const;
void DrawHeader(const ITimingTrackDrawContext& Context) const;
void DrawMarkers(const ITimingTrackDrawContext& Context, float LineY, float LineH) const;
void DrawSelectedEventInfo(const FString& InText, const FTimingTrackViewport& Viewport, const UE::Insights::FDrawContext& DrawContext, const FSlateBrush* WhiteBrush, const FSlateFontInfo& Font) const;
void DrawSelectedEventInfoEx(const FString& InText, const FString& InLeftText, const FString& InTopText, const FTimingTrackViewport& Viewport, const UE::Insights::FDrawContext& DrawContext, const FSlateBrush* WhiteBrush, const FSlateFontInfo& Font) const;
int32 GetHeaderBackgroundLayerId(const ITimingTrackDrawContext& Context) const;
int32 GetHeaderTextLayerId(const ITimingTrackDrawContext& Context) const;
virtual const TSharedPtr<const ITimingEvent> GetEvent(double InTime, double SecondsPerPixel, int32 Depth) const;
virtual bool HasCustomFilter() const { return false; }
/* Can be overridden to force a max depth for the track. */
virtual int32 GetMaxDepth() const { return -1; }
private:
int32 NumLanes; // number of lanes (sub-tracks)
TSharedRef<struct FTimingEventsTrackDrawState> DrawState;
TSharedRef<struct FTimingEventsTrackDrawState> FilteredDrawState;
struct FFilteredDrawStateInfo
{
double ViewportStartTime = 0.0;
double ViewportScaleX = 0.0;
double LastBuildDuration = 0.0;
TWeakPtr<ITimingEventFilter> LastEventFilter;
uint32 LastFilterChangeNumber = 0;
uint32 Counter = 0;
mutable float Opacity = 0.0f;
};
FFilteredDrawStateInfo FilteredDrawStateInfo;
public:
static bool bUseDownSampling; // toggle to enable/disable downsampling, for debugging purposes only
};
////////////////////////////////////////////////////////////////////////////////////////////////////