diff --git a/include/config.hpp b/include/config.hpp index 047d462..9fead75 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -25,29 +25,43 @@ #ifdef OUR_DICK_DEBUG #define OUR_DICK_ENABLE_DEBUG_OUTPUT_LEVEL OUR_DICK_DEBUG + + #if OUR_DICK_DEBUG > 1 + #define OUR_DICK_ENABLE_DEBUG_CONTEXT + #endif #else #define OUR_DICK_ENABLE_DEBUG_OUTPUT_LEVEL 0 #endif + + +//Debug output section #if OUR_DICK_ENABLE_DEBUG_OUTPUT_LEVEL > 0 #define OUR_DICK_ENABLE_DEBUG_OUTPUT #endif -#if OUR_DICK_ENABLE_DEBUG_OUTPUT_LEVEL > 1 +#if OUR_DICK_ENABLE_DEBUG_OUTPUT_LEVEL > 2 #define OUR_DICK_ENABLE_DEBUG_VERBOSE_OUTPUT #endif + #ifdef OUR_DICK_ENABLE_DEBUG_OUTPUT #include - #define debug_print(...) (fprintf(stderr, __FILE__":%s:%d: ", __func__, __LINE__), fprintf(stderr, __VA_ARGS__)) + #define debug_print(...) do{fprintf(stderr, __FILE__ ":%s:%d: ", __func__, __LINE__); fprintf(stderr, __VA_ARGS__);}while(0) + #ifdef OUR_DICK_ENABLE_DEBUG_VERBOSE_OUTPUT + #define debug_print_verbose(...) debug_print(__VA_ARGS__) + #else + #define debug_print_verbose(...) + #endif #ifdef OUR_DICK_ENABLE_COLOR_DEBUG #define OUR_DICK_DEBUG_PRINT_RED "\033[38;5;9m" #define OUR_DICK_DEBUG_PRINT_YELLOW "\033[38;5;11m" #define OUR_DICK_DEBUG_PRINT_GREEN "\033[38;5;2m" #define OUR_DICK_DEBUG_PRINT_CLEAR "\033[0m" - #define debug_print_error(...) (fprintf(stderr, OUR_DICK_DEBUG_PRINT_RED __FILE__ ":%s:%d: ", __func__, __LINE__), fprintf(stderr, __VA_ARGS__), fprintf(stderr, OUR_DICK_DEBUG_PRINT_CLEAR)) - #define debug_print_warn(...) (fprintf(stderr, OUR_DICK_DEBUG_PRINT_YELLOW __FILE__ ":%s:%d: ", __func__, __LINE__), fprintf(stderr, __VA_ARGS__), fprintf(stderr, OUR_DICK_DEBUG_PRINT_CLEAR)) - #define debug_print_succ(...) (fprintf(stderr, OUR_DICK_DEBUG_PRINT_GREEN __FILE__ ":%s:%d: ", __func__, __LINE__), fprintf(stderr, __VA_ARGS__), fprintf(stderr, OUR_DICK_DEBUG_PRINT_CLEAR)) + #define debug_print_color_base(color, ...) do{fprintf(stderr, color); debug_print(__VA_ARGS__); fprintf(stderr, OUR_DICK_DEBUG_PRINT_CLEAR);}while(0) + #define debug_print_warn(...) debug_print_color_base(OUR_DICK_DEBUG_PRINT_YELLOW, __VA_ARGS__) + #define debug_print_error(...) debug_print_color_base(OUR_DICK_DEBUG_PRINT_RED, __VA_ARGS__) + #define debug_print_succ(...) debug_print_color_base(OUR_DICK_DEBUG_PRINT_GREEN, __VA_ARGS__) #else #define debug_print_error(...) debug_print(__VA_ARGS__) #define debug_print_warn(...) debug_print(__VA_ARGS__) @@ -59,6 +73,7 @@ #define debug_print_error(...) #define debug_print_warn(...) #define debug_print_succ(...) + #define debug_print_verbose(...) #endif #endif diff --git a/include/graphics/rbo.hpp b/include/graphics/rbo.hpp index 6ac5008..46736ae 100644 --- a/include/graphics/rbo.hpp +++ b/include/graphics/rbo.hpp @@ -30,6 +30,7 @@ namespace gfx{ GLenum m_format; GLsizei m_width; GLsizei m_height; + GLsizei m_samples; public: rbo(GLsizei width, GLsizei height, GLenum format, GLsizei samples = 0); @@ -46,6 +47,7 @@ namespace gfx{ void unbind()const; void resize(GLsizei w, GLsizei h); + void resize(GLsizei w, GLsizei h, GLenum format, GLsizei samples); void reformat(GLenum format); GLuint release(); diff --git a/include/graphics/shader.hpp b/include/graphics/shader.hpp index 1d8befd..6d3ac7b 100644 --- a/include/graphics/shader.hpp +++ b/include/graphics/shader.hpp @@ -63,8 +63,7 @@ namespace gfx{ type get_type()const; //raw access to shader handle - operator GLuint()const; - GLuint get_id()const; + GLuint raw()const; //get most recently generated error from this shader's infolog std::string get_error()const; diff --git a/include/graphics/shader_program.hpp b/include/graphics/shader_program.hpp index 8b530a0..39d27de 100644 --- a/include/graphics/shader_program.hpp +++ b/include/graphics/shader_program.hpp @@ -70,8 +70,7 @@ namespace gfx{ GLint get_uniform_loc(const char* u)const; //raw access to the program handle - GLuint get_id()const; - operator GLuint()const; + GLuint raw()const; //check if an error exists after a link attempt bool has_link_error()const; @@ -209,6 +208,8 @@ namespace gfx{ //Texture void set_uniform(const char* name, const texture&, GLuint tex_unit = 0); void set_uniform(GLuint loc, const texture&, GLuint tex_unit = 0); + void set_uniform(const char* name, const weak_texture_handle&, GLuint tex_unit = 0); + void set_uniform(GLuint loc, const weak_texture_handle&, GLuint tex_unit = 0); //Float vectors void set_uniform(const char* name, const vec2&); diff --git a/include/graphics/texture.hpp b/include/graphics/texture.hpp index cf53c37..70357f3 100644 --- a/include/graphics/texture.hpp +++ b/include/graphics/texture.hpp @@ -21,9 +21,34 @@ #include "image.hpp" #include "gl_include.hpp" +#include "math/vec.hpp" namespace gfx{ + class texture; + + class weak_texture_handle + { + private: + const texture* m_texture; + + public: + weak_texture_handle(const texture& tex); + weak_texture_handle(const weak_texture_handle&) = default; + weak_texture_handle(weak_texture_handle&&) = default; + ~weak_texture_handle() = default; + + weak_texture_handle& operator=(const weak_texture_handle&) = default; + weak_texture_handle& operator=(weak_texture_handle&&) = default; + + GLuint raw()const; + GLsizei get_width()const; + GLsizei get_height()const; + + void bind()const; + void bind_unit(GLuint tunit)const; + }; + //class representing an opengl 2D texture class texture { @@ -52,16 +77,18 @@ namespace gfx{ }; private: GLuint m_tex_id = 0; //handle to texture object - int m_width = 0; - int m_height = 0; + GLsizei m_width = 0; + GLsizei m_height = 0; + GLenum m_format = GL_RGBA; + GLenum m_type = GL_UNSIGNED_BYTE; public: //create the texture with no image data texture(); + texture(const unsigned char* data, GLenum format, GLsizei w, GLsizei h, GLenum type); texture(GLenum format, GLsizei w, GLsizei h, GLenum type); //create the texture with image data from 'i' texture(const image& i); - //TODO image data from raw unsigned char array texture(const texture&) = delete; texture(texture&&); ~texture(); @@ -73,12 +100,6 @@ namespace gfx{ //overwrite the current image data with 'i' bool set_image(const image& i); - void resize(GLenum format, GLsizei w, GLsizei h, GLenum type); - - //set the size of the texture, will wrap the image according to the chosen wrap mode - void set_width(int w); - void set_height(int h); - void set_size(int w, int h); //change wrap mode for both x and y void set_wrap_mode(wrap w); @@ -92,8 +113,15 @@ namespace gfx{ void set_mag_filter(magfilter m); void set_min_filter(minfilter m); - int get_width()const; - int get_height()const; + magfilter get_mag_filter()const; + minfilter get_min_filter()const; + math::vec4 get_border_color()const; + + wrap get_wrap_x()const; + wrap get_wrap_y()const; + + GLsizei get_width()const; + GLsizei get_height()const; //release ownership of this texture object GLuint release(); @@ -102,6 +130,8 @@ namespace gfx{ void bind()const; //bind to given texture unit and load into given program uniform location void bind_unit(GLuint tunit)const; + + weak_texture_handle create_handle()const; }; } diff --git a/include/graphics/vbo.hpp b/include/graphics/vbo.hpp index ae4302c..31f3f2a 100644 --- a/include/graphics/vbo.hpp +++ b/include/graphics/vbo.hpp @@ -58,6 +58,7 @@ namespace gfx{ public: //create a buffer with given capacity with predicted usage case 't' vbo(size_t cap, usage t); + vbo(const void* data, size_t datasize, usage t); vbo(const vbo&); vbo(vbo&&); ~vbo(); diff --git a/makefile b/makefile index 564d2de..136a179 100644 --- a/makefile +++ b/makefile @@ -28,7 +28,7 @@ INCLUDE_DIRS::=include CFLAGS::=-std=c18 -Wall -pedantic -Wextra CXXFLAGS::=-std=c++17 -Wall -pedantic -Wextra DEBUG_CFLAGS::= -DEBUG_CXXFLAGS::=-DOUR_DICK_DEBUG=1 +DEBUG_CXXFLAGS::=-DOUR_DICK_DEBUG=2 EXT::=cpp LANG::=$(EXT) MAIN_EXECUTABLE::=tester diff --git a/src/graphics/image.cpp b/src/graphics/image.cpp index 2d2c3dd..3f4786a 100644 --- a/src/graphics/image.cpp +++ b/src/graphics/image.cpp @@ -18,6 +18,7 @@ #include "graphics/image.hpp" #include "graphics/stb_include.hpp" +#include "config.hpp" #include //memcpy #include //exchange @@ -26,6 +27,8 @@ namespace gfx{ image::image(const char* file, bool flip, int req_chan){ stbi_set_flip_vertically_on_load(flip); m_data = stbi_load(file, &m_width, &m_height, &m_channels, req_chan); + if(!m_data) + debug_print_error("Unable to load image file %s\n", file); } image::image(const image& i): m_width(i.m_width), m_height(i.m_height), m_channels(i.m_channels), diff --git a/src/graphics/rbo.cpp b/src/graphics/rbo.cpp index dd57a2d..7bd343e 100644 --- a/src/graphics/rbo.cpp +++ b/src/graphics/rbo.cpp @@ -24,12 +24,11 @@ namespace gfx{ rbo::rbo(GLsizei width, GLsizei height, GLenum format, GLsizei samples): m_format(format), m_width(width), - m_height(height) + m_height(height), + m_samples(samples) { - glGenRenderbuffers(1, &m_buffer); - bind(); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, m_format, m_width, m_height); - unbind(); + glCreateRenderbuffers(1, &m_buffer); + glNamedRenderbufferStorageMultisample(m_buffer, m_samples, m_format, m_width, m_height); } rbo::rbo(rbo&& r): m_buffer(std::exchange(r.m_buffer, 0)), @@ -61,10 +60,20 @@ namespace gfx{ } void rbo::resize(GLsizei w, GLsizei h){ - *this = rbo(w, h, m_format); + m_width = w; + m_height = h; + glNamedRenderbufferStorageMultisample(m_buffer, m_samples, m_format, m_width, m_height); + } + void rbo::resize(GLsizei w, GLsizei h, GLenum format, GLsizei samples){ + m_width = w; + m_height = h; + m_format = format; + m_samples = samples; + glNamedRenderbufferStorageMultisample(m_buffer, m_samples, m_format, m_width, m_height); } void rbo::reformat(GLenum format){ - *this = rbo(m_width, m_height, format); + m_format = format; + glNamedRenderbufferStorageMultisample(m_buffer, m_samples, m_format, m_width, m_height); } GLuint rbo::release(){ diff --git a/src/graphics/shader.cpp b/src/graphics/shader.cpp index 2ef2b27..cff439a 100644 --- a/src/graphics/shader.cpp +++ b/src/graphics/shader.cpp @@ -17,6 +17,7 @@ */ #include "graphics/shader.hpp" +#include "config.hpp" #include //exchange, swap #include @@ -35,12 +36,14 @@ namespace gfx{ { GLint len; GLsizei retlen; - glGetShaderiv(s.get_id(), GL_SHADER_SOURCE_LENGTH, &len); - if(!len) + glGetShaderiv(s.raw(), GL_SHADER_SOURCE_LENGTH, &len); + if(!len){ + debug_print_error("Refusing to compile empty shader source\n"); return; + } std::string data; data.resize(len - 1); - glGetShaderSource(s.get_id(), len, &retlen, data.data()); + glGetShaderSource(s.raw(), len, &retlen, data.data()); load(data.data()); } shader::shader(shader&& s): @@ -77,11 +80,7 @@ namespace gfx{ glGetShaderiv(m_shader_id, GL_SHADER_TYPE, &t); return static_cast(t); } - GLuint shader::get_id()const{ - return m_shader_id; - } - - shader::operator GLuint()const{ + GLuint shader::raw()const{ return m_shader_id; } @@ -89,8 +88,10 @@ namespace gfx{ GLint len; GLsizei retlen; glGetShaderiv(m_shader_id, GL_INFO_LOG_LENGTH, &len); - if(!len) + if(!len){ + debug_print_error("Attempt to read shader error log when no error exists\n"); return{}; + } std::string retval; retval.resize(len - 1); //exclude null terminator from length glGetShaderInfoLog(m_shader_id, len, &retlen, retval.data()); diff --git a/src/graphics/shader_program.cpp b/src/graphics/shader_program.cpp index 068552c..ea9b408 100644 --- a/src/graphics/shader_program.cpp +++ b/src/graphics/shader_program.cpp @@ -17,6 +17,7 @@ */ #include "graphics/shader_program.hpp" +#include "config.hpp" #include //exchange, swap #include @@ -42,7 +43,7 @@ namespace gfx{ } void shader_program::attach_shader(const shader& s){ - glAttachShader(m_shader_id, s); + glAttachShader(m_shader_id, s.raw()); } bool shader_program::link(){ glLinkProgram(m_shader_id); @@ -57,10 +58,7 @@ namespace gfx{ return glGetUniformLocation(m_shader_id, u); } - GLuint shader_program::get_id()const{ - return m_shader_id; - } - shader_program::operator GLuint()const{ + GLuint shader_program::raw()const{ return m_shader_id; } @@ -73,8 +71,10 @@ namespace gfx{ GLint len; GLsizei retlen; glGetProgramiv(m_shader_id, GL_INFO_LOG_LENGTH, &len); - if(!len) + if(!len){ + debug_print_error("Attempt to read shader program error log when no error exists\n"); return{}; + } std::string retval; retval.resize(len - 1); //exclude null terminator from length glGetProgramInfoLog(m_shader_id, len, &retlen, retval.data()); @@ -494,6 +494,13 @@ namespace gfx{ t.bind_unit(tex_unit); glProgramUniform1i(m_shader_id, loc, tex_unit); } + void shader_program::set_uniform(const char* name, const weak_texture_handle& t, GLuint tex_unit){ + set_uniform(get_uniform_loc(name), t, tex_unit); + } + void shader_program::set_uniform(GLuint loc, const weak_texture_handle& t, GLuint tex_unit){ + t.bind_unit(tex_unit); + glProgramUniform1i(m_shader_id, loc, tex_unit); + } void shader_program::set_uniform(const char* name, const vec2& v){ set_uniform(get_uniform_loc(name), v); diff --git a/src/graphics/texture.cpp b/src/graphics/texture.cpp index 96d2a39..ba61e93 100644 --- a/src/graphics/texture.cpp +++ b/src/graphics/texture.cpp @@ -17,6 +17,7 @@ */ #include "graphics/texture.hpp" +#include "config.hpp" #include //exchange, swap @@ -25,12 +26,30 @@ namespace gfx{ texture::texture(){ glCreateTextures(GL_TEXTURE_2D, 1, &m_tex_id); } - texture::texture(GLenum format, GLsizei w, GLsizei h, GLenum type): - m_width(w), m_height(h) + texture::texture(const unsigned char* data, GLenum format, GLsizei w, GLsizei h, GLenum type): + m_width(w), m_height(h), + m_format(format), m_type(type) { glCreateTextures(GL_TEXTURE_2D, 1, &m_tex_id); - resize(format, w, h, type); + switch(m_format){ + case GL_RED: + glTextureStorage2D(m_tex_id, 1, GL_R8, m_width, m_height); + break; + case GL_RG: + glTextureStorage2D(m_tex_id, 1, GL_RG8, m_width, m_height); + break; + case GL_RGB: + glTextureStorage2D(m_tex_id, 1, GL_RGB8, m_width, m_height); + break; + case GL_RGBA: + glTextureStorage2D(m_tex_id, 1, GL_RGBA8, m_width, m_height); + break; + }; + glTextureSubImage2D(m_tex_id, 0, 0, 0, m_width, m_height, m_format, m_type, data); + glGenerateTextureMipmap(m_tex_id); } + texture::texture(GLenum format, GLsizei w, GLsizei h, GLenum type): + texture(nullptr, format, w, h, type){} texture::texture(const image& i): texture() { @@ -51,65 +70,42 @@ namespace gfx{ } bool texture::set_image(const image& i){ - if(!i) + if(!i){ + debug_print_error("Image is invalid\n"); return false; + } - if(!m_tex_id) + if(!m_tex_id){ + debug_print("Generating texture after texture construction\n"); glCreateTextures(GL_TEXTURE_2D, 1, &m_tex_id); + } m_width = i.get_width(); m_height = i.get_height(); switch(i.get_channels()){ case 1: + m_format = GL_RED; glTextureStorage2D(m_tex_id, 1, GL_R8, m_width, m_height); - glTextureSubImage2D(m_tex_id, 0, 0, 0, m_width, m_height, GL_RED, GL_UNSIGNED_BYTE, i.data()); break; case 2: + m_format = GL_RG; glTextureStorage2D(m_tex_id, 1, GL_RG8, m_width, m_height); - glTextureSubImage2D(m_tex_id, 0, 0, 0, m_width, m_height, GL_RG, GL_UNSIGNED_BYTE, i.data()); break; case 3: + m_format = GL_RGB; glTextureStorage2D(m_tex_id, 1, GL_RGB8, m_width, m_height); - glTextureSubImage2D(m_tex_id, 0, 0, 0, m_width, m_height, GL_RGB, GL_UNSIGNED_BYTE, i.data()); break; case 4: + m_format = GL_RGBA; glTextureStorage2D(m_tex_id, 1, GL_RGBA8, m_width, m_height); - glTextureSubImage2D(m_tex_id, 0, 0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, i.data()); break; default: + debug_print_error("Invalid format for texture\n"); return false; } + glTextureSubImage2D(m_tex_id, 0, 0, 0, m_width, m_height, m_format, GL_UNSIGNED_BYTE, i.data()); glGenerateTextureMipmap(m_tex_id); return true; } - void texture::resize(GLenum format, GLsizei w, GLsizei h, GLenum type){ - switch(format){ - case GL_RED: - glTextureStorage2D(m_tex_id, 1, GL_R8, w, h); - break; - case GL_RG: - glTextureStorage2D(m_tex_id, 1, GL_RG8, w, h); - break; - case GL_RGB: - glTextureStorage2D(m_tex_id, 1, GL_RGB8, w, h); - break; - case GL_RGBA: - glTextureStorage2D(m_tex_id, 1, GL_RGBA8, w, h); - break; - }; - glTextureSubImage2D(m_tex_id, 0, 0, 0, w, h, format, type, NULL); - glGenerateTextureMipmap(m_tex_id); - } - - void texture::set_width(int w){ - m_width = w; - } - void texture::set_height(int h){ - m_height = h; - } - void texture::set_size(int w, int h){ - m_width = w; - m_height = h; - } void texture::set_wrap_mode(wrap w){ glTextureParameteri(m_tex_id, GL_TEXTURE_WRAP_S, static_cast(w)); @@ -140,11 +136,35 @@ namespace gfx{ void texture::set_min_filter(minfilter m){ glTextureParameteri(m_tex_id, GL_TEXTURE_MIN_FILTER, static_cast(m)); } - - int texture::get_width()const{ + auto texture::get_mag_filter()const -> magfilter{ + GLint filter; + glGetTextureParameteriv(m_tex_id, GL_TEXTURE_MAG_FILTER, &filter); + return static_cast(filter); + } + auto texture::get_min_filter()const -> minfilter{ + GLint filter; + glGetTextureParameteriv(m_tex_id, GL_TEXTURE_MIN_FILTER, &filter); + return static_cast(filter); + } + math::vec4 texture::get_border_color()const{ + math::vec4 color; + glGetTextureParameterfv(m_tex_id, GL_TEXTURE_BORDER_COLOR, color); + return color; + } + auto texture::get_wrap_x()const -> wrap{ + GLint w; + glGetTextureParameteriv(m_tex_id, GL_TEXTURE_WRAP_S, &w); + return static_cast(w); + } + auto texture::get_wrap_y()const -> wrap{ + GLint w; + glGetTextureParameteriv(m_tex_id, GL_TEXTURE_WRAP_T, &w); + return static_cast(w); + } + GLsizei texture::get_width()const{ return m_width; } - int texture::get_height()const{ + GLsizei texture::get_height()const{ return m_height; } @@ -158,6 +178,29 @@ namespace gfx{ void texture::bind_unit(GLuint tunit)const{ glBindTextureUnit(tunit, m_tex_id); } + weak_texture_handle texture::create_handle()const{ + return weak_texture_handle(*this); + } + weak_texture_handle::weak_texture_handle(const texture& tex): + m_texture(&tex){} + + GLuint weak_texture_handle::raw()const{ + return m_texture->raw(); + } + GLsizei weak_texture_handle::get_width()const{ + return m_texture->get_width(); + } + GLsizei weak_texture_handle::get_height()const{ + return m_texture->get_height(); + } + + void weak_texture_handle::bind()const{ + m_texture->bind(); + } + void weak_texture_handle::bind_unit(GLuint tunit)const{ + m_texture->bind_unit(tunit); + } + } diff --git a/src/graphics/vao.cpp b/src/graphics/vao.cpp index 77f2a9e..4a5ce5b 100644 --- a/src/graphics/vao.cpp +++ b/src/graphics/vao.cpp @@ -32,28 +32,28 @@ namespace gfx{ } void vertex_attribute::set_float_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_FLOAT, GL_FALSE, offset); } void vertex_attribute::set_double_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_DOUBLE, GL_FALSE, sizeof(GLdouble) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_DOUBLE, GL_FALSE, offset); } void vertex_attribute::set_byte_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_BYTE, GL_FALSE, sizeof(GLbyte) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_BYTE, GL_FALSE, offset); } void vertex_attribute::set_ubyte_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(GLubyte) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_UNSIGNED_BYTE, GL_FALSE, offset); } void vertex_attribute::set_short_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_SHORT, GL_FALSE, sizeof(GLshort) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_SHORT, GL_FALSE, offset); } void vertex_attribute::set_ushort_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_UNSIGNED_SHORT, GL_FALSE, sizeof(GLushort) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_UNSIGNED_SHORT, GL_FALSE, offset); } void vertex_attribute::set_int_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_INT, GL_FALSE, sizeof(GLint) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_INT, GL_FALSE, offset); } void vertex_attribute::set_uint_array(GLint size, GLsizei offset){ - glVertexArrayAttribFormat(m_vao, m_index, size, GL_UNSIGNED_INT, GL_FALSE, sizeof(GLuint) * offset); + glVertexArrayAttribFormat(m_vao, m_index, size, GL_UNSIGNED_INT, GL_FALSE, offset); } diff --git a/src/graphics/vbo.cpp b/src/graphics/vbo.cpp index cafb28f..272ff1e 100644 --- a/src/graphics/vbo.cpp +++ b/src/graphics/vbo.cpp @@ -29,6 +29,12 @@ namespace gfx{ glCreateBuffers(1, &m_buffer); glNamedBufferData(m_buffer, size, NULL, static_cast(t)); } + vbo::vbo(const void* data, size_t size, usage t): + m_buffer_size(size) + { + glCreateBuffers(1, &m_buffer); + glNamedBufferData(m_buffer, size, data, static_cast(t)); + } vbo::vbo(const vbo& v): m_buffer_size(v.m_buffer_size) { diff --git a/src/graphics/window.cpp b/src/graphics/window.cpp index c71e7c6..82f18f0 100644 --- a/src/graphics/window.cpp +++ b/src/graphics/window.cpp @@ -25,7 +25,7 @@ namespace gfx{ -#ifdef OUR_DICK_ENABLE_DEBUG_OUTPUT +#ifdef OUR_DICK_ENABLE_DEBUG_CONTEXT static void APIENTRY our_dick_gl_debug_output(GLenum source, GLenum type, unsigned int /*id*/, GLenum severity, GLsizei /*length*/, const char* message, const void* /*user_ptr*/) { @@ -113,9 +113,9 @@ static void enable_opengl_debug_context(){ glDebugMessageCallback(our_dick_gl_debug_output, nullptr); glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE); }else if(GLAD_GL_ARB_debug_output){ - debug_print("Debug output enabled using opengl extensions\n"); - glDebugMessageCallbackARB(our_dick_gl_debug_output, nullptr); - glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE); + debug_print_warn("Debug output enabled using GL_ARB_debug_output extension\n"); + glDebugMessageCallback(our_dick_gl_debug_output, nullptr); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE); } } #endif @@ -124,7 +124,15 @@ static void enable_opengl_debug_context(){ if(GLAD_GL_VERSION_4_5){ return true; } - if(GLAD_GL_ARB_direct_state_access){ + if(GLAD_GL_VERSION_4_3){ + if(GLAD_GL_ARB_direct_state_access){ + debug_print_warn("Using GL_ARB_direct_state_access extension\n"); + return true; + } + } + if(GLAD_GL_ARB_direct_state_access && GLAD_GL_ARB_explicit_uniform_location){ + debug_print_warn("Using GL_ARB_direct_state_access extension\n"); + debug_print_warn("Using GL_ARB_explicit_uniform_location extension\n"); return true; } return false; @@ -152,7 +160,7 @@ static void enable_opengl_debug_context(){ GLFWwindow* current_context = glfwGetCurrentContext(); -#ifdef OUR_DICK_ENABLE_DEBUG_OUTPUT +#ifdef OUR_DICK_ENABLE_DEBUG_CONTEXT glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); #else glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_FALSE); @@ -186,8 +194,10 @@ static void enable_opengl_debug_context(){ } debug_print("Using opengl profile version %s\n", glGetString(GL_VERSION)); -#ifdef OUR_DICK_ENABLE_DEBUG_OUTPUT +#ifdef OUR_DICK_ENABLE_DEBUG_CONTEXT enable_opengl_debug_context(); +#else + debug_print("OpenGL debug context is disabled\n"); #endif glfwMakeContextCurrent(m_window); m_root_fbo.set_viewport(0, 0, width, height); @@ -207,7 +217,7 @@ static void enable_opengl_debug_context(){ GLFWwindow* current_context = glfwGetCurrentContext(); -#ifdef OUR_DICK_ENABLE_DEBUG_OUTPUT +#ifdef OUR_DICK_ENABLE_DEBUG_CONTEXT glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE); #else glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_FALSE); @@ -237,8 +247,10 @@ static void enable_opengl_debug_context(){ } debug_print("Using opengl profile version %s\n", glGetString(GL_VERSION)); -#ifdef OUR_DICK_ENABLE_DEBUG_OUTPUT +#ifdef OUR_DICK_ENABLE_DEBUG_CONTEXT enable_opengl_debug_context(); +#else + debug_print("OpenGL debug context is disabled\n"); #endif glfwMakeContextCurrent(m_window);