// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "MovieSceneFwd.h" #if UE_MOVIESCENE_ENTITY_DEBUG #include "EntitySystem/MovieSceneEntitySystemTypes.h" #include "Math/Vector4.h" #include "Misc/FrameTime.h" #include "UObject/ObjectKey.h" #include "Misc/InlineValue.h" class FName; namespace UE::MovieScene { MOVIESCENE_API extern bool GRichComponentDebugging; struct IComponentDebuggingTypedPtr { virtual ~IComponentDebuggingTypedPtr() {} void* Ptr; }; template struct TComponentDebuggingTypedPtr : IComponentDebuggingTypedPtr { TComponentDebuggingTypedPtr() { static_assert(sizeof(TComponentDebuggingTypedPtr) == sizeof(IComponentDebuggingTypedPtr), "Size must match"); } }; template struct TComponentHeader : FComponentHeader { TComponentHeader() { static_assert(sizeof(TComponentHeader) == sizeof(FComponentHeader), "Size must match!"); } }; /** * Debug information for a component type */ struct FComponentTypeDebugInfo { FString DebugName; const TCHAR* DebugTypeName = nullptr; virtual ~FComponentTypeDebugInfo() {} virtual void InitializeComponentHeader(void* Ptr) const { new (Ptr) FComponentHeader(); } virtual void InitializeDebugComponentData(FComponentHeader& Header, uint8 Capacity) const { } }; template struct TComponentTypeDebugInfo : FComponentTypeDebugInfo { void InitializeComponentHeader(void* Ptr) const override { new (Ptr) TComponentHeader(); } virtual void InitializeDebugComponentData(FComponentHeader& Header, uint8 Capacity) const { TComponentDebuggingTypedPtr* TypedComponents = new TComponentDebuggingTypedPtr[Capacity]; for (int32 Index = 0; Index < Capacity; ++Index) { TypedComponents[Index].Ptr = static_cast(Header.GetValuePtr(Index)); } Header.DebugComponents = TypedComponents; } }; } // namespace UE::MovieScene #endif // UE_MOVIESCENE_ENTITY_DEBUG