89 lines
2.0 KiB
C++
89 lines
2.0 KiB
C++
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
|
|
|
|
#include "../WindowsManager.h"
|
|
#include "Engine/Engine/Time.h"
|
|
#include "Engine/Profiler/ProfilerCPU.h"
|
|
#include "Engine/Core/ObjectsRemovalService.h"
|
|
#include "Engine/Engine/EngineService.h"
|
|
|
|
class WindowsManagerService : public EngineService
|
|
{
|
|
public:
|
|
|
|
WindowsManagerService()
|
|
: EngineService(TEXT("Windows Manager"), -30)
|
|
{
|
|
}
|
|
|
|
void Update() override;
|
|
void Dispose() override;
|
|
};
|
|
|
|
CriticalSection WindowsManager::WindowsLocker;
|
|
Array<Window*> WindowsManager::Windows;
|
|
WindowsManagerService WindowsManagerServiceInstance;
|
|
|
|
Window* WindowsManager::GetByNativePtr(void* handle)
|
|
{
|
|
Window* result = nullptr;
|
|
|
|
WindowsLocker.Lock();
|
|
for (int32 i = 0; i < Windows.Count(); i++)
|
|
{
|
|
if (Windows[i]->GetNativePtr() == handle)
|
|
{
|
|
result = Windows[i];
|
|
break;
|
|
}
|
|
}
|
|
WindowsLocker.Unlock();
|
|
|
|
return result;
|
|
}
|
|
|
|
Vector2 WindowsManager::CalcCenteredWinPos(const Vector2& size)
|
|
{
|
|
return (Platform::GetDesktopSize() - size) * 0.5f;
|
|
}
|
|
|
|
void WindowsManager::Register(Window* win)
|
|
{
|
|
WindowsLocker.Lock();
|
|
Windows.Add(win);
|
|
WindowsLocker.Unlock();
|
|
}
|
|
|
|
void WindowsManager::Unregister(Window* win)
|
|
{
|
|
WindowsLocker.Lock();
|
|
Windows.Remove(win);
|
|
WindowsLocker.Unlock();
|
|
}
|
|
|
|
void WindowsManagerService::Update()
|
|
{
|
|
PROFILE_CPU();
|
|
|
|
// Update windows
|
|
const float deltaTime = Time::Update.UnscaledDeltaTime.GetTotalSeconds();
|
|
WindowsManager::WindowsLocker.Lock();
|
|
for (auto& win : WindowsManager::Windows)
|
|
{
|
|
if (win->IsVisible())
|
|
win->OnUpdate(deltaTime);
|
|
}
|
|
WindowsManager::WindowsLocker.Unlock();
|
|
}
|
|
|
|
void WindowsManagerService::Dispose()
|
|
{
|
|
// Close remaining windows
|
|
WindowsManager::WindowsLocker.Lock();
|
|
auto windows = WindowsManager::Windows;
|
|
for (auto& win : windows)
|
|
{
|
|
win->Close(ClosingReason::EngineExit);
|
|
}
|
|
WindowsManager::WindowsLocker.Unlock();
|
|
}
|