Minor refactoring
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
cmake_minimum_required(VERSION 3.31)
|
cmake_minimum_required(VERSION 3.31)
|
||||||
|
|
||||||
project(Ugly)
|
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
||||||
|
|
||||||
|
project(Ugly)
|
||||||
|
|
||||||
find_package(GLEW REQUIRED)
|
find_package(GLEW REQUIRED)
|
||||||
find_package(glfw3 CONFIG REQUIRED)
|
find_package(glfw3 CONFIG REQUIRED)
|
||||||
find_package(glm CONFIG REQUIRED)
|
find_package(glm CONFIG REQUIRED)
|
||||||
|
|||||||
@@ -5,9 +5,8 @@
|
|||||||
|
|
||||||
#include "App.hpp"
|
#include "App.hpp"
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
auto args = std::vector<std::string>{};
|
auto args = std::vector<std::string>{};
|
||||||
std::copy_n(argv, argc, std::back_inserter(args));
|
std::copy_n(argv, argc, std::back_inserter(args));
|
||||||
return App::main(args);
|
return ugly::App::main(args);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,23 +9,40 @@
|
|||||||
#include "ShaderProgramBuilder.hpp"
|
#include "ShaderProgramBuilder.hpp"
|
||||||
#include "TimestampLog.hpp"
|
#include "TimestampLog.hpp"
|
||||||
|
|
||||||
|
namespace ugly {
|
||||||
|
|
||||||
int App::main(std::vector<std::string> &args) {
|
int App::main(std::vector<std::string> &args) {
|
||||||
auto cerrLog = ugly::TimestampLog{std::cerr, "ugly::log"};
|
auto cerrLog = TimestampLog{"ugly::log", std::cerr};
|
||||||
ugly::log = ugly::LogAlias{&cerrLog};
|
log = LogAlias{&cerrLog};
|
||||||
ugly::log("hello, world! app started.");
|
log("hello, world! app started.");
|
||||||
|
|
||||||
auto app = App{};
|
glfwSetErrorCallback(error_callback_s);
|
||||||
|
glfwInit();
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||||
|
|
||||||
|
auto window = glfwCreateWindow(640, 480, "uGLy", NULL, NULL);
|
||||||
|
glfwMakeContextCurrent(window);
|
||||||
|
glewExperimental = GL_TRUE;
|
||||||
|
if(glewInit() != GLEW_OK) {
|
||||||
|
log("glewInit() failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto app = App{window};
|
||||||
app.game_loop();
|
app.game_loop();
|
||||||
|
|
||||||
ugly::log("app quitting.");
|
glfwTerminate();
|
||||||
|
glfwSetErrorCallback(NULL);
|
||||||
|
log("app quitting.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void App::error_callback_s(int error, const char *description)
|
void App::error_callback_s(int error, const char *description)
|
||||||
{
|
{
|
||||||
ugly::log("(glfw error): {}", description);
|
log("(glfw error): {}", description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -35,26 +52,11 @@ void App::key_callback_s(GLFWwindow *window, int key, int scancode, int action,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
App::App():
|
App::App(GLFWwindow *window):
|
||||||
mpWindow{NULL} {
|
mpWindow{window} {
|
||||||
glfwSetErrorCallback(error_callback_s);
|
|
||||||
glfwInit();
|
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
||||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
|
||||||
|
|
||||||
mpWindow = glfwCreateWindow(640, 480, "uGLy", NULL, NULL);
|
|
||||||
glfwSetWindowUserPointer(mpWindow, this);
|
glfwSetWindowUserPointer(mpWindow, this);
|
||||||
glfwSetKeyCallback(mpWindow, key_callback_s);
|
glfwSetKeyCallback(mpWindow, key_callback_s);
|
||||||
|
|
||||||
glfwMakeContextCurrent(mpWindow);
|
|
||||||
glewExperimental = GL_TRUE;
|
|
||||||
if(glewInit() != GLEW_OK) {
|
|
||||||
ugly::log("glewInit() failed!");
|
|
||||||
}
|
|
||||||
|
|
||||||
float vertices[] = {
|
float vertices[] = {
|
||||||
.0f, .5f, 1.f, 0.f, 0.f,
|
.0f, .5f, 1.f, 0.f, 0.f,
|
||||||
.5f, -.5f, 0.f, 1.f, 0.f,
|
.5f, -.5f, 0.f, 1.f, 0.f,
|
||||||
@@ -66,7 +68,7 @@ App::App():
|
|||||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
GLuint shaderProgram = ugly::ShaderProgramBuilder{}
|
GLuint shaderProgram = ShaderProgramBuilder{}
|
||||||
.attachFromFile(GL_VERTEX_SHADER, "assets/shaders/shader.vert")
|
.attachFromFile(GL_VERTEX_SHADER, "assets/shaders/shader.vert")
|
||||||
.attachFromFile(GL_FRAGMENT_SHADER, "assets/shaders/shader.frag")
|
.attachFromFile(GL_FRAGMENT_SHADER, "assets/shaders/shader.frag")
|
||||||
.link();
|
.link();
|
||||||
@@ -82,12 +84,6 @@ App::App():
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
App::~App() {
|
|
||||||
glfwTerminate();
|
|
||||||
glfwSetErrorCallback(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void App::game_loop() {
|
void App::game_loop() {
|
||||||
while(!glfwWindowShouldClose(mpWindow)) {
|
while(!glfwWindowShouldClose(mpWindow)) {
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
@@ -105,3 +101,5 @@ void App::key_callback(int key, int scancode, int action, int mods) {
|
|||||||
glfwSetWindowShouldClose(mpWindow, GLFW_TRUE);
|
glfwSetWindowShouldClose(mpWindow, GLFW_TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
struct GLFWwindow;
|
struct GLFWwindow;
|
||||||
|
|
||||||
|
namespace ugly {
|
||||||
|
|
||||||
class App {
|
class App {
|
||||||
public:
|
public:
|
||||||
static int main(std::vector<std::string> &args);
|
static int main(std::vector<std::string> &args);
|
||||||
@@ -16,8 +18,9 @@ private:
|
|||||||
GLFWwindow *mpWindow;
|
GLFWwindow *mpWindow;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
App();
|
App(GLFWwindow *window);
|
||||||
~App();
|
|
||||||
void game_loop();
|
void game_loop();
|
||||||
void key_callback(int key, int scancode, int action, int mods);
|
void key_callback(int key, int scancode, int action, int mods);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ namespace ugly {
|
|||||||
|
|
||||||
class ILogFacility {
|
class ILogFacility {
|
||||||
public:
|
public:
|
||||||
|
~ILogFacility() = default;
|
||||||
virtual void vlog(std::string_view fmt, std::format_args args) = 0;
|
virtual void vlog(std::string_view fmt, std::format_args args) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ public:
|
|||||||
ILogFacility *mpLog;
|
ILogFacility *mpLog;
|
||||||
|
|
||||||
template<typename ...Args>
|
template<typename ...Args>
|
||||||
LogAlias &operator()(std::format_string<Args...> format, Args &&...args) {
|
LogAlias &operator()(std::format_string<Args...> fmt, Args &&...args) {
|
||||||
if(mpLog) {
|
if(mpLog) {
|
||||||
mpLog->vlog(format.get(), std::make_format_args(args...));
|
mpLog->vlog(fmt.get(), std::make_format_args(args...));
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,12 +12,12 @@ namespace ugly {
|
|||||||
|
|
||||||
class TimestampLog: virtual public ILogFacility {
|
class TimestampLog: virtual public ILogFacility {
|
||||||
private:
|
private:
|
||||||
|
std::chrono::high_resolution_clock::time_point mStartTime;
|
||||||
std::ostream &mrOutputStream;
|
std::ostream &mrOutputStream;
|
||||||
std::string mDescription;
|
std::string mDescription;
|
||||||
std::chrono::high_resolution_clock::time_point mStart;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TimestampLog(std::ostream &os, std::string_view description);
|
TimestampLog(std::string_view description, std::ostream &os);
|
||||||
void vlog(std::string_view fmt, std::format_args args) override;
|
void vlog(std::string_view fmt, std::format_args args) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,16 +3,20 @@
|
|||||||
#include <format>
|
#include <format>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
|
namespace ugly {
|
||||||
|
|
||||||
ugly::TimestampLog::TimestampLog(std::ostream &os, std::string_view description):
|
TimestampLog::TimestampLog(std::string_view description, std::ostream &os):
|
||||||
|
mStartTime{std::chrono::high_resolution_clock::now()},
|
||||||
mrOutputStream{os},
|
mrOutputStream{os},
|
||||||
mDescription{description},
|
mDescription{description} {}
|
||||||
mStart{std::chrono::high_resolution_clock::now()} {}
|
|
||||||
|
|
||||||
|
|
||||||
void ugly::TimestampLog::vlog(std::string_view fmt, std::format_args args) {
|
void TimestampLog::vlog(std::string_view fmt, std::format_args args) {
|
||||||
auto now = std::chrono::high_resolution_clock::now();
|
using namespace std::chrono;
|
||||||
auto timestamp = std::chrono::duration_cast<std::chrono::duration<float>>(now - mStart).count();
|
auto now = high_resolution_clock::now();
|
||||||
|
auto timestamp = duration_cast<duration<float>>(now - mStartTime).count();
|
||||||
auto message = std::vformat(fmt, args);
|
auto message = std::vformat(fmt, args);
|
||||||
mrOutputStream << std::format("[{:9.4f}] {}: {}\n", timestamp, mDescription, message);
|
mrOutputStream << std::format("[{:9.4f}] {}: {}\n", timestamp, mDescription, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
#include "LogUtils.hpp"
|
#include "LogUtils.hpp"
|
||||||
|
|
||||||
ugly::LogAlias ugly::log{nullptr};
|
namespace ugly {
|
||||||
|
|
||||||
|
LogAlias log{nullptr};
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,26 +6,27 @@
|
|||||||
|
|
||||||
#include "LogUtils.hpp"
|
#include "LogUtils.hpp"
|
||||||
|
|
||||||
|
namespace ugly {
|
||||||
|
|
||||||
ugly::ShaderProgramBuilder::ShaderProgramBuilder():
|
ShaderProgramBuilder::ShaderProgramBuilder():
|
||||||
mProgram{glCreateProgram()} {}
|
mProgram{glCreateProgram()} {}
|
||||||
|
|
||||||
|
|
||||||
ugly::ShaderProgramBuilder::~ShaderProgramBuilder() {
|
ShaderProgramBuilder::~ShaderProgramBuilder() {
|
||||||
if(mProgram != 0) {
|
if(mProgram != 0) {
|
||||||
glDeleteProgram(mProgram);
|
glDeleteProgram(mProgram);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ugly::ShaderProgramBuilder::reset() {
|
void ShaderProgramBuilder::reset() {
|
||||||
using namespace std;
|
using namespace std;
|
||||||
ShaderProgramBuilder b;
|
ShaderProgramBuilder b;
|
||||||
swap(*this, b);
|
swap(*this, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum type, const GLchar *string, GLint length) {
|
ShaderProgramBuilder &ShaderProgramBuilder::attachFromMemory(GLenum type, const GLchar *string, GLint length) {
|
||||||
auto shader = glCreateShader(type);
|
auto shader = glCreateShader(type);
|
||||||
glShaderSource(shader, 1, &string, length != 0 ? &length : NULL);
|
glShaderSource(shader, 1, &string, length != 0 ? &length : NULL);
|
||||||
glCompileShader(shader);
|
glCompileShader(shader);
|
||||||
@@ -36,7 +37,7 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum
|
|||||||
char buf[512];
|
char buf[512];
|
||||||
glGetShaderInfoLog(shader, 512, NULL, buf);
|
glGetShaderInfoLog(shader, 512, NULL, buf);
|
||||||
glDeleteShader(shader);
|
glDeleteShader(shader);
|
||||||
ugly::log("failed to compile shader:\n\t{}", buf);
|
log("failed to compile shader:\n\t{}", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
glAttachShader(mProgram, shader);
|
glAttachShader(mProgram, shader);
|
||||||
@@ -45,14 +46,14 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromMemory(GLenum
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromFile(GLenum type, const char *filename) {
|
ShaderProgramBuilder &ShaderProgramBuilder::attachFromFile(GLenum type, const char *filename) {
|
||||||
auto file = std::filebuf{};
|
auto file = std::filebuf{};
|
||||||
auto ss = std::ostringstream{};
|
auto ss = std::ostringstream{};
|
||||||
|
|
||||||
ugly::log("loading shader from file {}", filename);
|
log("loading shader from file {}", filename);
|
||||||
file.open(filename, std::ios_base::in);
|
file.open(filename, std::ios_base::in);
|
||||||
if(!file.is_open()) {
|
if(!file.is_open()) {
|
||||||
ugly::log("couldn't open file {}", filename);
|
log("couldn't open file {}", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
ss << &file;
|
ss << &file;
|
||||||
@@ -60,7 +61,7 @@ ugly::ShaderProgramBuilder &ugly::ShaderProgramBuilder::attachFromFile(GLenum ty
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GLuint ugly::ShaderProgramBuilder::link() {
|
GLuint ShaderProgramBuilder::link() {
|
||||||
glLinkProgram(mProgram);
|
glLinkProgram(mProgram);
|
||||||
|
|
||||||
GLint status;
|
GLint status;
|
||||||
@@ -68,7 +69,7 @@ GLuint ugly::ShaderProgramBuilder::link() {
|
|||||||
if(status != GL_TRUE) {
|
if(status != GL_TRUE) {
|
||||||
char buf[512];
|
char buf[512];
|
||||||
glGetProgramInfoLog(mProgram, 512, NULL, buf);
|
glGetProgramInfoLog(mProgram, 512, NULL, buf);
|
||||||
ugly::log("failed to link program:\n\t{}", buf);
|
log("failed to link program:\n\t{}", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto result = mProgram;
|
auto result = mProgram;
|
||||||
@@ -76,3 +77,5 @@ GLuint ugly::ShaderProgramBuilder::link() {
|
|||||||
reset();
|
reset();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user