#include "Orange/Core/Result.h" #include "Orange/Core/Log.h" #include #include #include #include #include #include namespace orange { Result Window::Create() { if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0) { log::err("Failed to initialize SDL Video: %s", Window::GetError()); return Result::Error(BasicErrorCode::Failed); } SDL_Window* window = nullptr; if (!(window = SDL_CreateWindow("Orange", 0, 0, 1280, 800, SDL_WINDOW_VULKAN))) { log::err("Failed to create SDL window: %s", Window::GetError()); return Result::Error(BasicErrorCode::Failed); } return Result::Success(window); } Window::Window(SDL_Window* window) : m_window{ window } {} Window::~Window() { SDL_DestroyWindow(m_window); SDL_QuitSubSystem(SDL_INIT_VIDEO); } bool Window::GetInstanceExtensions(Window& window, uint32_t *count, const char **extensions) { return SDL_Vulkan_GetInstanceExtensions(window.m_window, count, extensions) == SDL_TRUE; } Result Window::CreateSurface(VkInstance instance) { VkSurfaceKHR surface = VK_NULL_HANDLE; if (SDL_Vulkan_CreateSurface(m_window, instance, &surface) != SDL_TRUE) return Result::Error(BasicErrorCode::Failed); return Result::Success(surface); } const char* Window::GetError() { return SDL_GetError(); } bool Window::Update(Input::InputHandler& handler) { handler.flushKeys(); bool quit = false; SDL_Event e; while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_MOUSEMOTION: if (m_hasFocus) handler.addMouseMotionDelta(Input::MouseDelta{ e.motion.xrel, e.motion.yrel }); break; case SDL_KEYDOWN: case SDL_KEYUP: handler.set(Input::SDLScancodeToButton(e.key.keysym.scancode), e.type == SDL_KEYDOWN); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: handler.set(Input::SDLMouseButtonToButtonCode(e.button.button), e.type == SDL_MOUSEBUTTONDOWN); break; case SDL_MOUSEWHEEL: handler.addMouseScrollDelta(Input::MouseDelta{ e.wheel.x, e.wheel.y}); break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_FOCUS_GAINED: { m_hasFocus = true; SDL_ShowCursor(m_relativeMouse ? SDL_FALSE : SDL_TRUE); break; } case SDL_WINDOWEVENT_FOCUS_LOST: { m_hasFocus = false; SDL_ShowCursor(SDL_TRUE); break; } } break; case SDL_QUIT: quit = true; break; } } return !quit; } void Window::EnableRelativeMouse(bool relative) { m_relativeMouse = relative; SDL_SetWindowGrab(m_window, relative ? SDL_TRUE : SDL_FALSE); SDL_SetRelativeMouseMode(relative ? SDL_TRUE : SDL_FALSE); SDL_ShowCursor(m_hasFocus && relative ? SDL_FALSE : SDL_TRUE); } void Window::SetTitle(const char* title) { SDL_SetWindowTitle(m_window, title); } }