yes
This commit is contained in:
59
Runtime/Sources/Platform/Inputs.cpp
git.filemode.normal_file
59
Runtime/Sources/Platform/Inputs.cpp
git.filemode.normal_file
@@ -0,0 +1,59 @@
|
||||
#include <Platform/Inputs.h>
|
||||
#include <Core/EventBus.h>
|
||||
|
||||
namespace Scop
|
||||
{
|
||||
namespace Internal
|
||||
{
|
||||
struct ResizeEventSwapchain : public EventBase
|
||||
{
|
||||
Event What() const override { return Event::ResizeEventCode; }
|
||||
};
|
||||
}
|
||||
|
||||
Inputs::Inputs() : m_keys(SDL_GetKeyboardState(&m_keys_count))
|
||||
{}
|
||||
|
||||
void Inputs::Update()
|
||||
{
|
||||
SDL_GetRelativeMouseState(&m_x_rel, &m_y_rel);
|
||||
std::uint8_t mouse_state = SDL_GetMouseState(&m_x, &m_y);
|
||||
m_mouse[0] = SDL_BUTTON(mouse_state) & SDL_BUTTON_LMASK;
|
||||
m_mouse[1] = SDL_BUTTON(mouse_state) & SDL_BUTTON_MMASK;
|
||||
m_mouse[2] = SDL_BUTTON(mouse_state) & SDL_BUTTON_RMASK;
|
||||
m_mouse[3] = SDL_BUTTON(mouse_state) & SDL_BUTTON_X1MASK;
|
||||
m_mouse[4] = SDL_BUTTON(mouse_state) & SDL_BUTTON_X2MASK;
|
||||
|
||||
m_is_mouse_wheel_up = false;
|
||||
m_is_mouse_wheel_down = false;
|
||||
|
||||
while(SDL_PollEvent(&m_event))
|
||||
{
|
||||
for(auto& hook : m_hooks)
|
||||
hook(&m_event);
|
||||
switch(m_event.type)
|
||||
{
|
||||
case SDL_MOUSEWHEEL:
|
||||
{
|
||||
if(m_event.wheel.y > 0) // scroll up
|
||||
m_is_mouse_wheel_up = true;
|
||||
else if(m_event.wheel.y < 0) // scroll down
|
||||
m_is_mouse_wheel_down = true;
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_WINDOWEVENT:
|
||||
{
|
||||
switch(m_event.window.event)
|
||||
{
|
||||
case SDL_WINDOWEVENT_CLOSE: m_has_recieved_close_event = true; break;
|
||||
case SDL_WINDOWEVENT_SIZE_CHANGED: EventBus::Send("__ScopSwapchain", Internal::ResizeEventSwapchain{}); break;
|
||||
default: break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
73
Runtime/Sources/Platform/Window.cpp
git.filemode.normal_file
73
Runtime/Sources/Platform/Window.cpp
git.filemode.normal_file
@@ -0,0 +1,73 @@
|
||||
#include <Platform/Window.h>
|
||||
#include <SDL2/SDL_vulkan.h>
|
||||
#include <Core/Logs.h>
|
||||
|
||||
namespace Scop
|
||||
{
|
||||
Window::Window(const std::string& title, std::uint32_t width, std::uint32_t height, bool hidden) : m_title(title), m_height(height), m_width(width)
|
||||
{
|
||||
std::uint32_t flags = SDL_WINDOW_VULKAN;
|
||||
if(hidden)
|
||||
flags |= SDL_WINDOW_HIDDEN;
|
||||
else
|
||||
flags |= SDL_WINDOW_SHOWN;
|
||||
|
||||
if(width == 0 && height == 0)
|
||||
flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
|
||||
else
|
||||
flags |= SDL_WINDOW_RESIZABLE;
|
||||
|
||||
p_window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, flags);
|
||||
if(!p_window)
|
||||
FatalError("Unable to open a new window, %", SDL_GetError());
|
||||
}
|
||||
|
||||
void Window::FetchWindowInfos() noexcept
|
||||
{
|
||||
Vec2i size;
|
||||
SDL_GetWindowSize(p_window, &size.x, &size.y);
|
||||
m_width = size.x;
|
||||
m_height = size.y;
|
||||
}
|
||||
|
||||
VkSurfaceKHR Window::CreateVulkanSurface(VkInstance instance) const noexcept
|
||||
{
|
||||
VkSurfaceKHR surface;
|
||||
if(!SDL_Vulkan_CreateSurface(p_window, instance, &surface))
|
||||
FatalError("SDL: could not create a Vulkan surface; %", SDL_GetError());
|
||||
return surface;
|
||||
}
|
||||
|
||||
std::vector<const char*> Window::GetRequiredVulkanInstanceExtentions() const noexcept
|
||||
{
|
||||
std::uint32_t count;
|
||||
if(!SDL_Vulkan_GetInstanceExtensions(p_window, &count, nullptr))
|
||||
FatalError("SDL Manager: could not retrieve Vulkan instance extensions");
|
||||
std::vector<const char*> extensions(count);
|
||||
if(!SDL_Vulkan_GetInstanceExtensions(p_window, &count, extensions.data()))
|
||||
FatalError("SDL Manager: could not retrieve Vulkan instance extensions");
|
||||
extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
|
||||
return extensions;
|
||||
}
|
||||
|
||||
Vec2ui Window::GetVulkanDrawableSize() const noexcept
|
||||
{
|
||||
Vec2i extent;
|
||||
SDL_Vulkan_GetDrawableSize(p_window, &extent.x, &extent.y);
|
||||
return Vec2ui{ extent };
|
||||
}
|
||||
|
||||
void Window::Destroy() noexcept
|
||||
{
|
||||
if(p_window != nullptr)
|
||||
{
|
||||
SDL_DestroyWindow(p_window);
|
||||
p_window = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
Window::~Window()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user