#include #include #include #include #include #include #include #include #include // TODO : Replace with message box from framework + call main and not winmain + subsystem #include #include #include #include // 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; } if (swapChainTexture) { ColorTargetInfo colorTargetInfo = {}; colorTargetInfo.TargetTexture = swapChainTexture; colorTargetInfo.ClearColor = { .R = .5f, .G = .8f, .B = .0f, .A = 1.f }; colorTargetInfo.LoadOperation = LoadOperation::Clear; colorTargetInfo.StoreOperation = StoreOperation::Store; RenderPass* renderPass = BeginRenderPass(cmdList, colorTargetInfo); EndRenderPass(renderPass); } // 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; }