mirror of
				https://github.com/kevinporetti/UnrealImGui.git
				synced 2025-11-03 23:33:16 +00:00 
			
		
		
		
	Moved ImGui Draw events, so they are called during World Tick Start. Old behaviour, where those events were called during Post-Tick, can be restored by setting console variable ImGui.DebugDrawOnWorldTick to zero.
This commit is contained in:
		
							parent
							
								
									052ae0a201
								
							
						
					
					
						commit
						8c1c710646
					
				@ -12,6 +12,20 @@
 | 
				
			|||||||
#include <imgui.h>
 | 
					#include <imgui.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace CVars
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						TAutoConsoleVariable<int> DebugDrawOnWorldTick(TEXT("ImGui.DebugDrawOnWorldTick"), 1,
 | 
				
			||||||
 | 
							TEXT("If this is enabled then all the ImGui debug draw events will be called during World Tick Start.\n")
 | 
				
			||||||
 | 
							TEXT("This has an advantage that all the global variables like GWorld are set to correct values.\n")
 | 
				
			||||||
 | 
							TEXT("A disadvantage is that objects are not yet updated. That can be changed by disabling this feature,")
 | 
				
			||||||
 | 
							TEXT("but preferable solution is to call debug code from object's own Tick function.\n")
 | 
				
			||||||
 | 
							TEXT("NOTE: Order of multi-context and world draw events depends on this value and is arranged in a way ")
 | 
				
			||||||
 | 
							TEXT("that world draw events and objects updates are closer together.\n")
 | 
				
			||||||
 | 
							TEXT("0: disabled, ImGui Debug Draw is called during Post-Tick\n")
 | 
				
			||||||
 | 
							TEXT("1: enabled (default), ImGui Debug Draw is called during World Tick Start"),
 | 
				
			||||||
 | 
							ECVF_Default);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace
 | 
					namespace
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if WITH_EDITOR
 | 
					#if WITH_EDITOR
 | 
				
			||||||
@ -58,17 +72,13 @@ namespace
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
FImGuiContextManager::FImGuiContextManager()
 | 
					FImGuiContextManager::FImGuiContextManager()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if WITH_EDITOR
 | 
					 | 
				
			||||||
	FWorldDelegates::OnWorldTickStart.AddRaw(this, &FImGuiContextManager::OnWorldTickStart);
 | 
						FWorldDelegates::OnWorldTickStart.AddRaw(this, &FImGuiContextManager::OnWorldTickStart);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FImGuiContextManager::~FImGuiContextManager()
 | 
					FImGuiContextManager::~FImGuiContextManager()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if WITH_EDITOR
 | 
					 | 
				
			||||||
	// Order matters because contexts can be created during World Tick Start events.
 | 
						// Order matters because contexts can be created during World Tick Start events.
 | 
				
			||||||
	FWorldDelegates::OnWorldTickStart.RemoveAll(this);
 | 
						FWorldDelegates::OnWorldTickStart.RemoveAll(this);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	Contexts.Empty();
 | 
						Contexts.Empty();
 | 
				
			||||||
	ImGui::Shutdown();
 | 
						ImGui::Shutdown();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -88,15 +98,18 @@ void FImGuiContextManager::Tick(float DeltaSeconds)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if WITH_EDITOR
 | 
					 | 
				
			||||||
void FImGuiContextManager::OnWorldTickStart(ELevelTick TickType, float DeltaSeconds)
 | 
					void FImGuiContextManager::OnWorldTickStart(ELevelTick TickType, float DeltaSeconds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (GWorld)
 | 
						if (GWorld)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		GetWorldContextProxy(*GWorld).SetAsCurrent();
 | 
							FImGuiContextProxy& ContextProxy = GetWorldContextProxy(*GWorld);
 | 
				
			||||||
 | 
							ContextProxy.SetAsCurrent();
 | 
				
			||||||
 | 
							if (CVars::DebugDrawOnWorldTick.GetValueOnGameThread() > 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								ContextProxy.Draw();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif // WITH_EDITOR
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if WITH_EDITOR
 | 
					#if WITH_EDITOR
 | 
				
			||||||
FImGuiContextManager::FContextData& FImGuiContextManager::GetEditorContextData()
 | 
					FImGuiContextManager::FContextData& FImGuiContextManager::GetEditorContextData()
 | 
				
			||||||
 | 
				
			|||||||
@ -86,9 +86,7 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#endif // WITH_EDITOR
 | 
					#endif // WITH_EDITOR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if WITH_EDITOR
 | 
					 | 
				
			||||||
	void OnWorldTickStart(ELevelTick TickType, float DeltaSeconds);
 | 
						void OnWorldTickStart(ELevelTick TickType, float DeltaSeconds);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if WITH_EDITOR
 | 
					#if WITH_EDITOR
 | 
				
			||||||
	FContextData& GetEditorContextData();
 | 
						FContextData& GetEditorContextData();
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,11 @@ static constexpr float DEFAULT_CANVAS_WIDTH = 3840.f;
 | 
				
			|||||||
static constexpr float DEFAULT_CANVAS_HEIGHT = 2160.f;
 | 
					static constexpr float DEFAULT_CANVAS_HEIGHT = 2160.f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace CVars
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						extern TAutoConsoleVariable<int> DebugDrawOnWorldTick;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace
 | 
					namespace
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	FString GetSaveDirectory()
 | 
						FString GetSaveDirectory()
 | 
				
			||||||
@ -99,34 +104,36 @@ FImGuiContextProxy::~FImGuiContextProxy()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void FImGuiContextProxy::Draw()
 | 
					void FImGuiContextProxy::Draw()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Comparing to LastTickFrameNumber rather than GFrameNumber to make sure that this is driven by our own update cycle.
 | 
						if (bIsFrameStarted && !bIsDrawCalled)
 | 
				
			||||||
	if (LastDrawFrameNumber < LastTickFrameNumber)
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		LastDrawFrameNumber = LastTickFrameNumber;
 | 
							bIsDrawCalled = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (bIsFrameStarted)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		SetAsCurrent();
 | 
							SetAsCurrent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const bool bSharedFirst = (CVars::DebugDrawOnWorldTick.GetValueOnGameThread() > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Broadcast draw event to allow listeners to draw their controls to this context.
 | 
							// Broadcast draw event to allow listeners to draw their controls to this context.
 | 
				
			||||||
 | 
							if (bSharedFirst && SharedDrawEvent && SharedDrawEvent->IsBound())
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								SharedDrawEvent->Broadcast();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (DrawEvent.IsBound())
 | 
							if (DrawEvent.IsBound())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			DrawEvent.Broadcast();
 | 
								DrawEvent.Broadcast();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
			if (SharedDrawEvent && SharedDrawEvent->IsBound())
 | 
							if (!bSharedFirst && SharedDrawEvent && SharedDrawEvent->IsBound())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			SharedDrawEvent->Broadcast();
 | 
								SharedDrawEvent->Broadcast();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void FImGuiContextProxy::Tick(float DeltaSeconds)
 | 
					void FImGuiContextProxy::Tick(float DeltaSeconds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// Making sure that we tick only once per frame.
 | 
						// Making sure that we tick only once per frame.
 | 
				
			||||||
	if (LastTickFrameNumber < GFrameNumber)
 | 
						if (LastFrameNumber < GFrameNumber)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		LastTickFrameNumber = GFrameNumber;
 | 
							LastFrameNumber = GFrameNumber;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SetAsCurrent();
 | 
							SetAsCurrent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -165,6 +172,7 @@ void FImGuiContextProxy::BeginFrame(float DeltaTime)
 | 
				
			|||||||
		ImGui::NewFrame();
 | 
							ImGui::NewFrame();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bIsFrameStarted = true;
 | 
							bIsFrameStarted = true;
 | 
				
			||||||
 | 
							bIsDrawCalled = false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -76,12 +76,13 @@ private:
 | 
				
			|||||||
	bool bHasActiveItem = false;
 | 
						bool bHasActiveItem = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool bIsFrameStarted = false;
 | 
						bool bIsFrameStarted = false;
 | 
				
			||||||
 | 
						bool bIsDrawCalled = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uint32 LastFrameNumber = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	FSimpleMulticastDelegate DrawEvent;
 | 
						FSimpleMulticastDelegate DrawEvent;
 | 
				
			||||||
	FSimpleMulticastDelegate* SharedDrawEvent = nullptr;
 | 
						FSimpleMulticastDelegate* SharedDrawEvent = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint32 LastTickFrameNumber = 0;
 | 
					 | 
				
			||||||
	uint32 LastDrawFrameNumber = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const FImGuiInputState* InputState = nullptr;
 | 
						const FImGuiInputState* InputState = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TArray<FImGuiDrawList> DrawLists;
 | 
						TArray<FImGuiDrawList> DrawLists;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user