Files
FlaxEngine/Source/Engine/Platform/Base/WindowsManager.cpp
2021-01-17 10:18:30 +01:00

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();
}