From: Steinar H. Gunderson Date: Wed, 7 Oct 2015 18:12:25 +0000 (+0200) Subject: Make the demo program run with core contexts. X-Git-Tag: 1.3.0~28 X-Git-Url: https://git.sesse.net/?p=movit;a=commitdiff_plain;h=1349c2cabb17a3637aa5bc2520c058333d8d48d7 Make the demo program run with core contexts. Also, if SDL2 is in use, actually _ask_ for a core context. --- diff --git a/color.130.frag b/color.130.frag new file mode 100644 index 0000000..d546844 --- /dev/null +++ b/color.130.frag @@ -0,0 +1,11 @@ +#version 130 + +in vec2 tc; +in vec4 frag_color; + +out vec4 FragColor; + +void main() +{ + FragColor = frag_color; +} diff --git a/color.150.frag b/color.150.frag new file mode 100644 index 0000000..9d3d2db --- /dev/null +++ b/color.150.frag @@ -0,0 +1,11 @@ +#version 150 + +in vec2 tc; +in vec4 frag_color; + +out vec4 FragColor; + +void main() +{ + FragColor = frag_color; +} diff --git a/demo.cpp b/demo.cpp index ba96291..dbbb4cb 100644 --- a/demo.cpp +++ b/demo.cpp @@ -191,6 +191,9 @@ int main(int argc, char **argv) SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); #ifdef HAVE_SDL2 + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); // SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG); SDL_Window *window = SDL_CreateWindow("OpenGL window", SDL_WINDOWPOS_UNDEFINED, @@ -223,13 +226,6 @@ int main(int argc, char **argv) EffectChain chain(WIDTH, HEIGHT); glViewport(0, 0, WIDTH, HEIGHT); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - ImageFormat inout_format; inout_format.color_space = COLORSPACE_sRGB; inout_format.gamma_curve = GAMMA_sRGB; @@ -254,7 +250,8 @@ int main(int argc, char **argv) glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pbo); glBufferData(GL_PIXEL_PACK_BUFFER_ARB, WIDTH * HEIGHT * 4, NULL, GL_STREAM_READ); - make_hsv_wheel_texture(); + init_hsv_resources(); + check_error(); int frame = 0; bool screenshot = false; @@ -302,7 +299,6 @@ int main(int argc, char **argv) glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); check_error(); - glLoadIdentity(); draw_hsv_wheel(0.0f, lift_rad, lift_theta, lift_v); draw_hsv_wheel(0.2f, gamma_rad, gamma_theta, gamma_v); draw_hsv_wheel(0.4f, gain_rad, gain_theta, gain_v); @@ -361,5 +357,6 @@ int main(int argc, char **argv) } #endif } + cleanup_hsv_resources(); return 0; } diff --git a/vs-color.130.vert b/vs-color.130.vert new file mode 100644 index 0000000..2f46e2c --- /dev/null +++ b/vs-color.130.vert @@ -0,0 +1,17 @@ +#version 130 + +in vec2 position; +in vec4 color; +out vec4 frag_color; + +void main() +{ + // The result of glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) is: + // + // 2.000 0.000 0.000 -1.000 + // 0.000 2.000 0.000 -1.000 + // 0.000 0.000 -2.000 -1.000 + // 0.000 0.000 0.000 1.000 + gl_Position = vec4(2.0 * position.x - 1.0, 2.0 * position.y - 1.0, -1.0, 1.0); + frag_color = color; +} diff --git a/vs-color.150.vert b/vs-color.150.vert new file mode 100644 index 0000000..0bdd74d --- /dev/null +++ b/vs-color.150.vert @@ -0,0 +1,17 @@ +#version 150 + +in vec2 position; +in vec4 color; +out vec4 frag_color; + +void main() +{ + // The result of glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) is: + // + // 2.000 0.000 0.000 -1.000 + // 0.000 2.000 0.000 -1.000 + // 0.000 0.000 -2.000 -1.000 + // 0.000 0.000 0.000 1.000 + gl_Position = vec4(2.0 * position.x - 1.0, 2.0 * position.y - 1.0, -1.0, 1.0); + frag_color = color; +} diff --git a/widgets.cpp b/widgets.cpp index 8726021..529d902 100644 --- a/widgets.cpp +++ b/widgets.cpp @@ -1,6 +1,7 @@ #include #include +#include "resource_pool.h" #include "widgets.h" #include "util.h" @@ -8,109 +9,152 @@ namespace movit { -GLuint hsv_wheel_num; +GLuint hsv_wheel_texnum = 0; +GLuint textured_program_num = 0, colored_program_num = 0, hsv_vao = 0; +ResourcePool resource_pool; -void draw_hsv_wheel(float y, float rad, float theta, float value) +void draw_black_point(float x, float y, float point_size) { - glUseProgram(0); - check_error(); - glActiveTexture(GL_TEXTURE0); + glUseProgram(colored_program_num); check_error(); - glEnable(GL_TEXTURE_2D); + + float vertices[] = { x, y }; + float colors[] = { 0.0f, 0.0f, 0.0f }; + + glPointSize(point_size); check_error(); - glBindTexture(GL_TEXTURE_2D, hsv_wheel_num); + GLuint position_vbo = fill_vertex_attribute(colored_program_num, "position", 2, GL_FLOAT, sizeof(vertices), vertices); + GLuint color_vbo = fill_vertex_attribute(colored_program_num, "color", 3, GL_FLOAT, sizeof(colors), colors); check_error(); - glActiveTexture(GL_TEXTURE1); + glDrawArrays(GL_POINTS, 0, 1); check_error(); - glBindTexture(GL_TEXTURE_2D, 0); + cleanup_vertex_attribute(colored_program_num, "position", position_vbo); + cleanup_vertex_attribute(colored_program_num, "color", color_vbo); +} + +void draw_hsv_wheel(float y, float rad, float theta, float value) +{ + glUseProgram(textured_program_num); check_error(); glActiveTexture(GL_TEXTURE0); + check_error(); + glBindTexture(GL_TEXTURE_2D, hsv_wheel_texnum); + check_error(); + glUniform1i(glGetUniformLocation(textured_program_num, "tex"), 0); // Bind the 2D sampler. + check_error(); glEnable(GL_BLEND); check_error(); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); check_error(); - // wheel - glBegin(GL_QUADS); - - glTexCoord2f(0.0f, 1.0f); - glVertex2f(0.0f, y); - - glTexCoord2f(1.0f, 1.0f); - glVertex2f(0.2f * 9.0f / 16.0f, y); + GLuint vao; + glGenVertexArrays(1, &vao); + check_error(); + glBindVertexArray(vao); + check_error(); - glTexCoord2f(1.0f, 0.0f); - glVertex2f(0.2f * 9.0f / 16.0f, y + 0.2f); + // wheel + float wheel_vertices[] = { + 0.0f, y, + 0.0f, y + 0.2f, + 0.2f * 9.0f / 16.0f, y, + 0.2f * 9.0f / 16.0f, y + 0.2f, + }; + float wheel_texcoords[] = { + 0.0f, 1.0f, + 0.0f, 0.0f, + 1.0f, 1.0f, + 1.0f, 0.0f, + }; + GLuint position_vbo = fill_vertex_attribute(textured_program_num, "position", 2, GL_FLOAT, sizeof(wheel_vertices), wheel_vertices); + GLuint texcoord_vbo = fill_vertex_attribute(textured_program_num, "texcoord", 2, GL_FLOAT, sizeof(wheel_texcoords), wheel_texcoords); + check_error(); - glTexCoord2f(0.0f, 0.0f); - glVertex2f(0.0f, y + 0.2f); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + check_error(); - glEnd(); + cleanup_vertex_attribute(textured_program_num, "position", position_vbo); + cleanup_vertex_attribute(textured_program_num, "texcoord", texcoord_vbo); // wheel selector - glDisable(GL_TEXTURE_2D); - glColor3f(0.0f, 0.0f, 0.0f); - glPointSize(5.0f); - glBegin(GL_POINTS); - glVertex2f((0.1f + rad * cos(theta) * 0.1f) * 9.0f / 16.0f, y + 0.1f - rad * sin(theta) * 0.1f); - glEnd(); - - // value slider - glDisable(GL_TEXTURE_2D); - glBegin(GL_QUADS); - - glColor3f(0.0f, 0.0f, 0.0f); - glVertex2f(0.22f * 9.0f / 16.0f, y); - glVertex2f(0.24f * 9.0f / 16.0f, y); + draw_black_point( + (0.1f + rad * cos(theta) * 0.1f) * 9.0f / 16.0f, + y + 0.1f - rad * sin(theta) * 0.1f, + 5.0f); - glColor3f(1.0f, 1.0f, 1.0f); - glVertex2f(0.24f * 9.0f / 16.0f, y + 0.2f); - glVertex2f(0.22f * 9.0f / 16.0f, y + 0.2f); - - glEnd(); + // value slider + glUseProgram(colored_program_num); + float value_vertices[] = { + 0.22f * 9.0f / 16.0f, y, + 0.22f * 9.0f / 16.0f, y + 0.2f, + 0.24f * 9.0f / 16.0f, y, + 0.24f * 9.0f / 16.0f, y + 0.2f, + }; + float value_colors[] = { + 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 1.0f, + }; + position_vbo = fill_vertex_attribute(colored_program_num, "position", 2, GL_FLOAT, sizeof(value_vertices), value_vertices); + GLuint color_vbo = fill_vertex_attribute(colored_program_num, "color", 3, GL_FLOAT, sizeof(value_colors), value_colors); + check_error(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + check_error(); + cleanup_vertex_attribute(colored_program_num, "position", position_vbo); + cleanup_vertex_attribute(colored_program_num, "color", color_vbo); // value selector - glColor3f(0.0f, 0.0f, 0.0f); - glPointSize(5.0f); - glBegin(GL_POINTS); - glVertex2f(0.23f * 9.0f / 16.0f, y + value * 0.2f); - glEnd(); + draw_black_point(0.23f * 9.0f / 16.0f, y + value * 0.2f, 5.0f); - glColor3f(1.0f, 1.0f, 1.0f); + glDeleteVertexArrays(1, &vao); + check_error(); + glUseProgram(0); + check_error(); } void draw_saturation_bar(float y, float saturation) { - glUseProgram(0); + GLuint vao; + glGenVertexArrays(1, &vao); + check_error(); + glBindVertexArray(vao); check_error(); // value slider - glDisable(GL_TEXTURE_2D); - glBegin(GL_QUADS); - - glColor3f(0.0f, 0.0f, 0.0f); - glVertex2f(0.0f * 9.0f / 16.0f, y + 0.02f); - glVertex2f(0.0f * 9.0f / 16.0f, y); - - glColor3f(1.0f, 1.0f, 1.0f); - glVertex2f(0.2f * 9.0f / 16.0f, y); - glVertex2f(0.2f * 9.0f / 16.0f, y + 0.02f); - - glEnd(); + glUseProgram(colored_program_num); + float value_vertices[] = { + 0.0f * 9.0f / 16.0f, y + 0.02f, + 0.2f * 9.0f / 16.0f, y + 0.02f, + 0.0f * 9.0f / 16.0f, y, + 0.2f * 9.0f / 16.0f, y, + }; + float value_colors[] = { + 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 1.0f, + }; + GLuint position_vbo = fill_vertex_attribute(colored_program_num, "position", 2, GL_FLOAT, sizeof(value_vertices), value_vertices); + GLuint color_vbo = fill_vertex_attribute(colored_program_num, "color", 3, GL_FLOAT, sizeof(value_colors), value_colors); + check_error(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + check_error(); + cleanup_vertex_attribute(colored_program_num, "position", position_vbo); + cleanup_vertex_attribute(colored_program_num, "color", color_vbo); // value selector - glColor3f(0.0f, 0.0f, 0.0f); - glPointSize(5.0f); - glBegin(GL_POINTS); - glVertex2f(0.2f * saturation * 9.0f / 16.0f, y + 0.01f); - glEnd(); + draw_black_point(0.2f * saturation * 9.0f / 16.0f, y + 0.01f, 5.0f); - glColor3f(1.0f, 1.0f, 1.0f); + glDeleteVertexArrays(1, &vao); + check_error(); + glUseProgram(0); + check_error(); } void make_hsv_wheel_texture() { - glGenTextures(1, &hsv_wheel_num); + glGenTextures(1, &hsv_wheel_texnum); static unsigned char hsv_pix[HSV_WHEEL_SIZE * HSV_WHEEL_SIZE * 4]; for (int y = 0; y < HSV_WHEEL_SIZE; ++y) { @@ -134,7 +178,7 @@ void make_hsv_wheel_texture() } } - glBindTexture(GL_TEXTURE_2D, hsv_wheel_num); + glBindTexture(GL_TEXTURE_2D, hsv_wheel_texnum); check_error(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); check_error(); @@ -142,6 +186,23 @@ void make_hsv_wheel_texture() check_error(); } +void init_hsv_resources() +{ + textured_program_num = resource_pool.compile_glsl_program( + read_version_dependent_file("vs", "vert"), + read_version_dependent_file("texture1d", "frag")); + colored_program_num = resource_pool.compile_glsl_program( + read_version_dependent_file("vs-color", "vert"), + read_version_dependent_file("color", "frag")); + make_hsv_wheel_texture(); +} + +void cleanup_hsv_resources() +{ + resource_pool.release_glsl_program(textured_program_num); + resource_pool.release_glsl_program(colored_program_num); +} + void read_colorwheel(float xf, float yf, float *rad, float *theta, float *value) { if (xf < 0.2f && yf < 0.2f) { diff --git a/widgets.h b/widgets.h index eb89a74..ddf997c 100644 --- a/widgets.h +++ b/widgets.h @@ -7,7 +7,8 @@ namespace movit { void draw_hsv_wheel(float y, float rad, float theta, float value); void draw_saturation_bar(float y, float saturation); -void make_hsv_wheel_texture(); +void init_hsv_resources(); +void cleanup_hsv_resources(); void read_colorwheel(float xf, float yf, float *rad, float *theta, float *value); } // namespace movit