// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Visualizers/ChaosVDComponentVisualizerBase.h" #include "ChaosVDSolverDataSelection.h" #include "AccelerationStructures/Settings/ChaosVDAccelerationStructureVisualizationSettings.h" #include "ChaosVDGTAccelerationStructureDataComponentVisualizer.generated.h" class UChaosVDGTAccelerationStructuresDataComponent; struct FChaosVDAABBTreeLeafDataWrapper; struct FChaosVDAABBTreeNodeDataWrapper; struct FChaosVDAABBTreeDataWrapper; enum class EChaosVDVisibleAABBTreeNodes { None = 0, Left = 1 << 0, Right = 1 << 1 }; ENUM_CLASS_FLAGS(EChaosVDVisibleAABBTreeNodes) USTRUCT() struct FChaosVDAABBTreeSelectionContext { GENERATED_BODY() const FChaosVDAABBTreeNodeDataWrapper* NodeData = nullptr; const FChaosVDAABBTreeLeafDataWrapper* LeafData = nullptr; bool operator==(const FChaosVDAABBTreeSelectionContext& Other) const { return NodeData == Other.NodeData && LeafData == Other.LeafData; } }; struct FChaosVDGTAccelerationStructureSelectionHandle : public FChaosVDSolverDataSelectionHandle { virtual bool IsSelected() override; void CreateStructViewForDetailsPanelIfNeeded(); virtual TSharedPtr GetCustomDataReadOnlyStructViewForDetails() override; private: TSharedPtr StructDataView; TSharedPtr StructDataViewStructOnScope; }; /** Visualization context structure specific for acceleration structure visualizations */ struct FChaosGTAccelerationStructureVisualizationDataContext : public FChaosVDVisualizationContext { TSharedPtr DataSelectionHandle = MakeShared(); ESceneDepthPriorityGroup DepthPriority = SDPG_Foreground; const UChaosVDGTAccelerationStructuresDataComponent* DataComponent = nullptr; bool IsVisualizationFlagEnabled(EChaosVDAccelerationStructureDataVisualizationFlags Flag) const { const EChaosVDAccelerationStructureDataVisualizationFlags FlagsAsAccelerationStructureVisFlags = static_cast(VisualizationFlags); return EnumHasAnyFlags(FlagsAsAccelerationStructureVisFlags, Flag); } }; class FChaosVDGTAccelerationStructureDataComponentVisualizer final : public FChaosVDComponentVisualizerBase { public: FChaosVDGTAccelerationStructureDataComponentVisualizer(); virtual void RegisterVisualizerMenus() override; virtual void DrawVisualization(const UActorComponent* Component, const FSceneView* View, FPrimitiveDrawInterface* PDI) override; virtual bool CanHandleClick(const HChaosVDComponentVisProxy& VisProxy) override; protected: void DrawAABBTree(const FSceneView* View, FPrimitiveDrawInterface* PDI, const FChaosGTAccelerationStructureVisualizationDataContext& VisualizationContext, const TSharedRef& AABBTreeData); void DrawAABBTreeNode(const FSceneView* View, FPrimitiveDrawInterface* PDI, const FChaosGTAccelerationStructureVisualizationDataContext& VisualizationContext, const TSharedRef& AABBTreeData, const FChaosVDAABBTreeNodeDataWrapper& AABBTreeNodeData, float Thickness, int32 CurrentTreeLevel = 1); void DrawAABBTreeArrayLeaf(const FSceneView* View, FPrimitiveDrawInterface* PDI, const FChaosGTAccelerationStructureVisualizationDataContext& VisualizationContext, const FChaosVDAABBTreeLeafDataWrapper& AABBTreeArrayLeafData, const TSharedRef& AABBTreeData, float Thickness); };