window
parent
dfdfd08cd8
commit
20748a8e60
|
@ -10,6 +10,53 @@
|
|||
|
||||
#include <glad/gl.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <functional>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
namespace blt::gfx
|
||||
{
|
||||
struct window_context
|
||||
{
|
||||
std::int32_t GL_MAJOR = 4;
|
||||
std::int32_t GL_MINOR = 6;
|
||||
std::int32_t DOUBLE_BUFFER = GLFW_TRUE;
|
||||
std::int32_t GL_PROFILE = GLFW_OPENGL_CORE_PROFILE;
|
||||
};
|
||||
|
||||
struct window_data
|
||||
{
|
||||
std::string title;
|
||||
std::int32_t width;
|
||||
std::int32_t height;
|
||||
std::function<void()> init;
|
||||
std::function<void(std::int32_t, std::int32_t)> update;
|
||||
|
||||
window_context context{};
|
||||
std::int32_t sync_interval = 0;
|
||||
|
||||
window_data(std::string title, std::function<void()> init, std::function<void(std::int32_t, std::int32_t)> update, std::int32_t width = 640,
|
||||
std::int32_t height = 480):
|
||||
title(std::move(title)), width(width), height(height), init(std::move(init)), update(std::move(update))
|
||||
{}
|
||||
|
||||
window_data& setContext(const window_context& ctx)
|
||||
{
|
||||
context = ctx;
|
||||
return *this;
|
||||
}
|
||||
|
||||
window_data& setSyncInterval(std::int32_t sync)
|
||||
{
|
||||
sync_interval = sync;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
void init(const window_data& data);
|
||||
|
||||
void cleanup();
|
||||
}
|
||||
|
||||
#endif //BLT_WITH_GRAPHICS_TEMPLATE_WINDOW_H
|
||||
|
|
|
@ -3,4 +3,76 @@
|
|||
* Licensed under GNU General Public License V3.0
|
||||
* See LICENSE file for license detail
|
||||
*/
|
||||
#include <blt/gfx/window.h>
|
||||
#include <blt/gfx/window.h>
|
||||
#include <blt/std/assert.h>
|
||||
#include <blt/std/logging.h>
|
||||
|
||||
void error_callback(int error, const char* description)
|
||||
{
|
||||
BLT_ERROR("GLFW Error (%d): %s", error, description);
|
||||
std::abort();
|
||||
}
|
||||
|
||||
namespace blt::gfx
|
||||
{
|
||||
// because we aren't meant to have multiple GLFW windows (especially with GLAD) we will keep the window as global state.1
|
||||
struct
|
||||
{
|
||||
GLFWwindow* window;
|
||||
std::int32_t width;
|
||||
std::int32_t height;
|
||||
} window_state;
|
||||
|
||||
void create_callbacks()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void init(const window_data& data)
|
||||
{
|
||||
/* -- Setup Error Callback -- */
|
||||
glfwSetErrorCallback(error_callback);
|
||||
BLT_ASSERT(glfwInit() && "Unable to init GLFW. Aborting.");
|
||||
|
||||
/* -- Setup Window Context -- */
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, data.context.GL_MAJOR);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, data.context.GL_MINOR);
|
||||
glfwWindowHint(GLFW_DOUBLEBUFFER, data.context.DOUBLE_BUFFER);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, data.context.GL_PROFILE);
|
||||
|
||||
/* -- Create the Window -- */
|
||||
window_state.window = glfwCreateWindow(data.width, data.height, data.title.c_str(), nullptr, nullptr);
|
||||
BLT_ASSERT(window_state.window && "Unable to create GLFW window.");
|
||||
|
||||
/* -- Set Window Specifics + OpenGL -- */
|
||||
glfwMakeContextCurrent(window_state.window);
|
||||
glfwSwapInterval(data.sync_interval);
|
||||
gladLoadGL(glfwGetProcAddress);
|
||||
|
||||
create_callbacks();
|
||||
|
||||
/* -- Call User Provided post-window-init function -- */
|
||||
data.init();
|
||||
|
||||
/* -- General Loop -- */
|
||||
while (!glfwWindowShouldClose(window_state.window))
|
||||
{
|
||||
/* -- Get the current framebuffer size, update the global width/height state, along with OpenGL viewport -- */
|
||||
glfwGetFramebufferSize(window_state.window, &window_state.width, &window_state.height);
|
||||
glViewport(0, 0, window_state.width, window_state.height);
|
||||
|
||||
/* -- Call user update function -- */
|
||||
data.update(window_state.width, window_state.height);
|
||||
|
||||
/* -- Update GLFW state -- */
|
||||
glfwSwapBuffers(window_state.window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
}
|
||||
|
||||
void cleanup()
|
||||
{
|
||||
glfwDestroyWindow(window_state.window);
|
||||
glfwTerminate();
|
||||
}
|
||||
}
|
||||
|
|
15
src/main.cpp
15
src/main.cpp
|
@ -1,7 +1,20 @@
|
|||
#include <iostream>
|
||||
|
||||
#include <blt/gfx/window.h>
|
||||
|
||||
void init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void update(std::int32_t width, std::int32_t height)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout << "Hello, World!" << std::endl;
|
||||
blt::gfx::init(blt::gfx::window_data{"My Sexy Window", init, update}.setSyncInterval(1));
|
||||
blt::gfx::cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue