Program Listing for File Window.cpp

Program Listing for File Window.cpp#

Return to documentation for file (Src/GraphicsEngineVulkan/window/Window.cpp)

module;
#include "GLFW/glfw3.h"
#include "spdlog/spdlog.h"

#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <imgui.h>
#include <iostream>

#include <vulkan/vulkan.hpp>

module kataglyphis.vulkan.window;

import kataglyphis.shared.frontend.window_input_callbacks;

using namespace Kataglyphis::Frontend;
// GLFW Callback functions
static void onErrorCallback(int error, const char *description)
{
    std::cerr << "GLFW Error " << error << ": " << description << '\n';
}

Window::Window()
  :

    window_width(800.F), window_height(600.F), framebuffer_resized(false)

{
    Kataglyphis::Frontend::reset_window_keys(input_state.keys.data());

    initialize();
}

// please use this constructor; never the standard
Window::Window(uint32_t window_width, uint32_t window_height)
  :

    window_width(window_width), window_height(window_height), framebuffer_resized(false)

{
    Kataglyphis::Frontend::reset_window_keys(input_state.keys.data());

    initialize();
}

auto Window::initialize() -> int
{
    glfwSetErrorCallback(onErrorCallback);
    if (glfwInit() == 0) {
        std::cerr << "GLFW Init failed!" << '\n';
        glfwTerminate();
        return 1;
    }

    if (glfwVulkanSupported() == 0) { spdlog::error("No Vulkan Supported!"); }

    // allow it to resize
    glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);

    // retrieve new window
    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    main_window = glfwCreateWindow(static_cast<int>(window_width),
      static_cast<int>(window_height),
      "\\__/ Epic graphics from hell \\__/ ",
      nullptr,
      nullptr);

    if (main_window == nullptr) {
        std::cerr << "GLFW Window creation failed!" << '\n';
        glfwTerminate();
        return 1;
    }

    // get buffer size information
    glfwGetFramebufferSize(main_window, &window_buffer_width, &window_buffer_height);

    init_callbacks();

    return 0;
}

void Window::cleanUp()
{
    glfwDestroyWindow(main_window);
    glfwTerminate();
}

void Window::update_viewport() { glfwGetFramebufferSize(main_window, &window_buffer_width, &window_buffer_height); }

void Window::set_buffer_size(float width, float height)
{
    this->window_buffer_width = static_cast<int>(width);
    this->window_buffer_height = static_cast<int>(height);
}

auto Window::get_x_change() -> float { return Kataglyphis::Frontend::consume_axis_delta(input_state.x_change); }

auto Window::get_y_change() -> float { return Kataglyphis::Frontend::consume_axis_delta(input_state.y_change); }

auto Window::get_height() const -> float { return static_cast<float>(window_height); }

auto Window::get_width() const -> float { return static_cast<float>(window_width); }

auto Window::framebuffer_size_has_changed() const -> bool { return framebuffer_resized; }

void Window::init_callbacks()
{
    // TODO(jsh): remember this section for our later game logic
    // for the space ship to fly around
    glfwSetWindowUserPointer(main_window, this);
    glfwSetKeyCallback(main_window, &key_callback);
    glfwSetMouseButtonCallback(main_window, &mouse_button_callback);
    glfwSetFramebufferSizeCallback(main_window, &framebuffer_size_callback);
}

void Window::framebuffer_size_callback(GLFWwindow *window, int width, int height)
{
    auto *app = reinterpret_cast<Window *>(glfwGetWindowUserPointer(window));
    app->framebuffer_resized = true;
    app->window_width = static_cast<uint32_t>(width);
    app->window_height = static_cast<uint32_t>(height);
}

void Window::reset_framebuffer_has_changed() { this->framebuffer_resized = false; }

void Window::key_callback(GLFWwindow *window, int key, int /*code*/, int action, int /*mode*/)
{
    auto *the_window = static_cast<Window *>(glfwGetWindowUserPointer(window));
    Kataglyphis::Frontend::handle_key_callback(window, the_window->input_state.keys.data(), key, action);
}

void Window::mouse_callback(GLFWwindow *window, double x_pos, double y_pos)
{
    auto *the_window = static_cast<Window *>(glfwGetWindowUserPointer(window));
    Kataglyphis::Frontend::handle_mouse_callback(window,
      the_window->input_state.last_x,
      the_window->input_state.last_y,
      the_window->input_state.x_change,
      the_window->input_state.y_change,
      the_window->input_state.mouse_first_moved,
      x_pos,
      y_pos);
}

void Window::mouse_button_callback(GLFWwindow *window, int button, int action, int /*mods*/)
{
    auto *the_window = static_cast<Window *>(glfwGetWindowUserPointer(window));
    Kataglyphis::Frontend::handle_mouse_button_callback(
      window, the_window->input_state.mouse_first_moved, button, action, mouse_callback);
}

Window::~Window() = default;