From 76e022317f887c4e3cdb02bd7df71770377ac952 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Sun, 8 Sep 2019 23:26:44 -0400 Subject: [PATCH 1/2] break apart into multiple files --- cosets/src/main.cpp | 107 +------------------------------------ cosets/src/util/shader.hpp | 51 ++++++++++++++++++ cosets/src/util/window.hpp | 60 +++++++++++++++++++++ 3 files changed, 113 insertions(+), 105 deletions(-) create mode 100644 cosets/src/util/shader.hpp create mode 100644 cosets/src/util/window.hpp diff --git a/cosets/src/main.cpp b/cosets/src/main.cpp index 12b3337..eedb1fa 100644 --- a/cosets/src/main.cpp +++ b/cosets/src/main.cpp @@ -1,9 +1,5 @@ -#include -#include - -#include -#include -#include +#include "util/window.hpp" +#include "util/shader.hpp" #include #include @@ -12,105 +8,6 @@ using namespace std; -GLint build_shader(GLenum type, const string &name, const string &src) { - const char *c_str = src.c_str(); - - auto s = glCreateShader(type); - glShaderSource(s, 1, &c_str, nullptr); - glCompileShader(s); - - GLint stat; - glGetShaderiv(s, GL_COMPILE_STATUS, &stat); - if (!stat) { - GLint log_len; - glGetShaderiv(s, GL_INFO_LOG_LENGTH, &log_len); - char log[log_len]; - glGetShaderInfoLog(s, log_len, nullptr, log); - fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log); - - glDeleteShader(s); - return 0; - } - - return s; -} - -GLint build_program(const string &name, GLint vs, GLint fs) { - GLint p = glCreateProgram(); - glAttachShader(p, vs); - glAttachShader(p, fs); - glLinkProgram(p); - - GLint stat; - glGetProgramiv(p, GL_LINK_STATUS, &stat); - if (!stat) { - GLint log_len; - glGetShaderiv(p, GL_INFO_LOG_LENGTH, &log_len); - char log[log_len]; - glGetProgramInfoLog(p, log_len, nullptr, log); - fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log); - - glDeleteProgram(p); - return 0; - } - - return p; -} - -class Window { -protected: - GLFWwindow *_window = nullptr; - -public: - virtual void init() {} - - virtual void update() {} - - virtual void render() {} - - virtual void deinit() {} - - void getBounds(int &width, int &height) { - glfwGetFramebufferSize(_window, &width, &height); - } - - void swapbuffers() { - glfwSwapBuffers(_window); - } - - void run() { - int _gl_major = 4, _gl_minor = 0; - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, _gl_major); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, _gl_minor); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - - - _window = glfwCreateWindow(640, 480, "GLFW App", nullptr, nullptr); - if (!_window) { - fprintf(stderr, "Failed to create window;"); - glfwTerminate(); - exit(EXIT_FAILURE); - } - - glfwMakeContextCurrent(_window); - gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); - glfwSwapInterval(0); - - init(); - - while (!glfwWindowShouldClose(_window)) { - update(); - render(); - - glfwPollEvents(); - } - - deinit(); - - glfwDestroyWindow(_window); - } -}; - class CosetsWindow : public Window { GLint program; GLuint tri; diff --git a/cosets/src/util/shader.hpp b/cosets/src/util/shader.hpp new file mode 100644 index 0000000..7db357c --- /dev/null +++ b/cosets/src/util/shader.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include +#include +#include +#include + +GLint build_shader(GLenum type, const std::string &name, const std::string &src) { + const char *c_str = src.c_str(); + + auto s = glCreateShader(type); + glShaderSource(s, 1, &c_str, nullptr); + glCompileShader(s); + + GLint stat; + glGetShaderiv(s, GL_COMPILE_STATUS, &stat); + if (!stat) { + GLint log_len; + glGetShaderiv(s, GL_INFO_LOG_LENGTH, &log_len); + char log[log_len]; + glGetShaderInfoLog(s, log_len, nullptr, log); + fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log); + + glDeleteShader(s); + return 0; + } + + return s; +} + +GLint build_program(const std::string &name, GLint vs, GLint fs) { + GLint p = glCreateProgram(); + glAttachShader(p, vs); + glAttachShader(p, fs); + glLinkProgram(p); + + GLint stat; + glGetProgramiv(p, GL_LINK_STATUS, &stat); + if (!stat) { + GLint log_len; + glGetShaderiv(p, GL_INFO_LOG_LENGTH, &log_len); + char log[log_len]; + glGetProgramInfoLog(p, log_len, nullptr, log); + fprintf(stderr, "SHADER LOG (%s):\n%s", name.c_str(), log); + + glDeleteProgram(p); + return 0; + } + + return p; +} diff --git a/cosets/src/util/window.hpp b/cosets/src/util/window.hpp new file mode 100644 index 0000000..a90adb1 --- /dev/null +++ b/cosets/src/util/window.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include +#include + +class Window { +protected: + GLFWwindow *_window = nullptr; + +public: + virtual void init() {} + + virtual void update() {} + + virtual void render() {} + + virtual void deinit() {} + + void getBounds(int &width, int &height) { + glfwGetFramebufferSize(_window, &width, &height); + } + + void swapbuffers() { + glfwSwapBuffers(_window); + } + + void run() { + int _gl_major = 4, _gl_minor = 0; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, _gl_major); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, _gl_minor); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + + _window = glfwCreateWindow(640, 480, "GLFW App", nullptr, nullptr); + if (!_window) { + fprintf(stderr, "Failed to create window;"); + glfwTerminate(); + exit(EXIT_FAILURE); + } + + glfwMakeContextCurrent(_window); + gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); + glfwSwapInterval(0); + + init(); + + while (!glfwWindowShouldClose(_window)) { + update(); + render(); + + glfwPollEvents(); + } + + deinit(); + + glfwDestroyWindow(_window); + } +}; From 1026a2c791b9219a343cf09c2dcac80cb4930229 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Sun, 8 Sep 2019 23:47:07 -0400 Subject: [PATCH 2/2] move shaders into separate files --- cosets/CMakeLists.txt | 7 ++++++ cosets/src/main.cpp | 41 ++++++++------------------------- cosets/src/shaders/main.fs.glsl | 13 +++++++++++ cosets/src/shaders/main.vs.glsl | 14 +++++++++++ cosets/src/util/files.hpp | 19 +++++++++++++++ cosets/src/util/shader.hpp | 7 ++++++ 6 files changed, 69 insertions(+), 32 deletions(-) create mode 100644 cosets/src/shaders/main.fs.glsl create mode 100644 cosets/src/shaders/main.vs.glsl create mode 100644 cosets/src/util/files.hpp diff --git a/cosets/CMakeLists.txt b/cosets/CMakeLists.txt index 79a4510..dfa29e2 100644 --- a/cosets/CMakeLists.txt +++ b/cosets/CMakeLists.txt @@ -8,3 +8,10 @@ target_link_libraries(${PROJECT_NAME} target_include_directories(${PROJECT_NAME} PRIVATE include) + +add_custom_command( + TARGET cosets POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/src/shaders + ${CMAKE_CURRENT_BINARY_DIR}/shaders +) diff --git a/cosets/src/main.cpp b/cosets/src/main.cpp index eedb1fa..8531459 100644 --- a/cosets/src/main.cpp +++ b/cosets/src/main.cpp @@ -17,38 +17,15 @@ class CosetsWindow : public Window { public: void init() override { - auto vs = build_shader(GL_VERTEX_SHADER, "vertex", - "#version 400\n" - "" - "uniform mat4 proj;" - "" - "in vec4 pos;" - "out vec4 v;" - "" - "void main(){" - " v = pos;" - "" - " /* stereographic projection */" - " vec4 vert = vec4(pos.xyz / (1 - pos.w), 1);" - " gl_Position = proj * vert;" - "}"); + auto vs = build_shader_file( + GL_VERTEX_SHADER, + "vertex", + "shaders/main.vs.glsl"); - auto fs = build_shader(GL_FRAGMENT_SHADER, "fragment", - "#version 400\n" - "" - "in vec4 v;" - "" - "vec3 hsv2rgb(vec3 c)\n" - "{\n" - " vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n" - " vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n" - " return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n" - "}" - "" - "void main(){" - " gl_FragColor = vec4(hsv2rgb(vec3(v.w, 1, 1)), 0);" - "}" - ); + auto fs = build_shader_file( + GL_FRAGMENT_SHADER, + "fragment", + "shaders/main.fs.glsl"); program = build_program("main", vs, fs); @@ -123,4 +100,4 @@ int main(int argc, char *argv[]) { glfwTerminate(); return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/cosets/src/shaders/main.fs.glsl b/cosets/src/shaders/main.fs.glsl new file mode 100644 index 0000000..25a8486 --- /dev/null +++ b/cosets/src/shaders/main.fs.glsl @@ -0,0 +1,13 @@ +#version 400 + +in vec4 v; + +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void main(){ + gl_FragColor = vec4(hsv2rgb(vec3(v.w, 1, 1)), 0); +} diff --git a/cosets/src/shaders/main.vs.glsl b/cosets/src/shaders/main.vs.glsl new file mode 100644 index 0000000..01f2172 --- /dev/null +++ b/cosets/src/shaders/main.vs.glsl @@ -0,0 +1,14 @@ +#version 400 + +uniform mat4 proj; + +in vec4 pos; +out vec4 v; + +void main(){ + v = pos; + + /* stereographic projection */ + vec4 vert = vec4(pos.xyz / (1 - pos.w), 1); + gl_Position = proj * vert; +} diff --git a/cosets/src/util/files.hpp b/cosets/src/util/files.hpp new file mode 100644 index 0000000..03b3541 --- /dev/null +++ b/cosets/src/util/files.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include +#include + +std::string read_all_text(const std::string &file) { + std::ifstream f(file); + std::string text; + + f.seekg(0, std::ios::end); + text.reserve(f.tellg()); + f.seekg(0, std::ios::beg); + + text.assign((std::istreambuf_iterator(f)), + std::istreambuf_iterator()); + + return text; +} diff --git a/cosets/src/util/shader.hpp b/cosets/src/util/shader.hpp index 7db357c..cfa2d0c 100644 --- a/cosets/src/util/shader.hpp +++ b/cosets/src/util/shader.hpp @@ -5,6 +5,8 @@ #include #include +#include "files.hpp" + GLint build_shader(GLenum type, const std::string &name, const std::string &src) { const char *c_str = src.c_str(); @@ -28,6 +30,11 @@ GLint build_shader(GLenum type, const std::string &name, const std::string &src) return s; } +GLint build_shader_file(GLenum type, const std::string &name, const std::string &file) { + std::string src = read_all_text(file); + return build_shader(type, name, src); +} + GLint build_program(const std::string &name, GLint vs, GLint fs) { GLint p = glCreateProgram(); glAttachShader(p, vs);