Files
Juliet/JulietApp/Editor/EditorMain_win32.cpp

135 lines
3.3 KiB
C++

#include <Editor/EditorMain_win32.h>
#include <Core/Application/ApplicationManager.h>
#include <Core/HAL/Display/Display.h>
#include <Core/HAL/Event/SystemEvent.h>
#include <Core/JulietInit.h>
#include <Core/Logging/LogManager.h>
#include <Core/Logging/LogTypes.h>
#include <Graphics/GraphicsConfig.h>
#include <cstdlib>
// TODO : Replace with message box from framework + call main and not winmain + subsystem
#include <Core/DynLib/DynamicLibrary.h>
#include <Graphics/Graphics.h>
#include <Windows.h>
// TODO : Think how to do the draw pipeline.
// Ex: Expose a Draw method ?
// Store a graphics context ?
// For now. Put everything in Update down below.
// Should split update from draw, update should have a != timestep than graphics (60fps or more)
using namespace Juliet;
void Win32EditorApplication::Init()
{
Log(LogLevel::Message, LogCategory::Editor, "Initializing Editor Application...");
GraphicsConfig config;
GraphicsDevice = CreateGraphicsDevice(config);
MainWindow = CreatePlatformWindow("Juliet Editor", 1280, 720);
Running = MainWindow != nullptr && GraphicsDevice != nullptr;
if (Running)
{
AttachToWindow(GraphicsDevice, MainWindow);
Game = LoadDynamicLibrary("Game.dll");
}
}
void Win32EditorApplication::Shutdown()
{
Log(LogLevel::Message, LogCategory::Editor, "Shutdown Editor Application...");
if (Game)
{
UnloadDynamicLibrary(Game);
}
if (MainWindow && GraphicsDevice)
{
DetachFromWindow(GraphicsDevice, MainWindow);
}
if (MainWindow)
{
DestroyPlatformWindow(MainWindow);
}
if (GraphicsDevice)
{
DestroyGraphicsDevice(GraphicsDevice);
}
}
void Win32EditorApplication::Update()
{
SystemEvent evt;
while (GetEvent(evt))
{
if (evt.Type == EventType::Window_Close_Request)
{
if (evt.Data.Window.AssociatedWindowID == GetWindowID(MainWindow))
{
Running = false;
}
}
}
// Draw here for now
// 1) Acquire a Command Buffer
CommandList* cmdList = AcquireCommandList(GraphicsDevice, QueueType::Graphics);
if (cmdList == nullptr)
{
Log(LogLevel::Error, LogCategory::Editor, "Failed to acquire command list.");
Running = false;
return;
}
Texture* swapChainTexture = nullptr;
if (!AcquireSwapChainTexture(cmdList, MainWindow, &swapChainTexture))
{
Log(LogLevel::Error, LogCategory::Editor, "Failed to acquire swapchain texture.");
Running = false;
return;
}
// Submit Commands
SubmitCommandLists(GraphicsDevice);
}
bool Win32EditorApplication::IsRunning()
{
return Running;
}
namespace
{
Win32EditorApplication EditorApplication;
}
Win32EditorApplication& GetEditorApplication()
{
return EditorApplication;
}
int main(int argc, char** argv)
{
CreateMutex(0, false, L"Local\\Juliet.Editor");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(nullptr, L"An instance of Juliet is already running.", L"Juliet", MB_OK | MB_ICONEXCLAMATION);
return EXIT_FAILURE;
}
StartApplication(EditorApplication, JulietInit_Flags::Display);
// Pause here to not close the console window immediatly on stop
system("PAUSE");
return EXIT_SUCCESS;
}