126 lines
3.5 KiB
C++
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);
|
|
}
|
|
}
|