Orange/src/Orange/Render/Window.cpp

126 lines
3.5 KiB
C++

#include "Orange/Core/Result.h"
#include "Orange/Core/Log.h"
#include <Orange/Render/Window.h>
#include <Orange/Render/RenderContext.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_error.h>
#include <SDL2/SDL_events.h>
#include <SDL2/SDL_vulkan.h>
namespace orange
{
Result<Window> Window::Create()
{
if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0)
{
log::err("Failed to initialize SDL Video: %s", Window::GetError());
return Result<Window>::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<Window>::Error(BasicErrorCode::Failed);
}
return Result<Window>::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<VkSurfaceKHR> Window::CreateSurface(VkInstance instance)
{
VkSurfaceKHR surface = VK_NULL_HANDLE;
if (SDL_Vulkan_CreateSurface(m_window, instance, &surface) != SDL_TRUE)
return Result<VkSurfaceKHR>::Error(BasicErrorCode::Failed);
return Result<VkSurfaceKHR>::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);
}
}