diff --git a/FL/gl.h b/FL/gl.h index 4579be21a..a30d2ea75 100644 --- a/FL/gl.h +++ b/FL/gl.h @@ -91,6 +91,7 @@ FL_EXPORT void gl_draw(const char*, int x, int y, int w, int h, Fl_Align); FL_EXPORT void gl_measure(const char*, int& x, int& y); FL_EXPORT void gl_texture_pile_height(int max); FL_EXPORT int gl_texture_pile_height(); +FL_EXPORT void gl_texture_reset(); FL_EXPORT void gl_draw_image(const uchar *, int x,int y,int w,int h, int d=3, int ld=0); diff --git a/examples/OpenGL3test.cxx b/examples/OpenGL3test.cxx index 40d0bf74e..d9216c4a3 100644 --- a/examples/OpenGL3test.cxx +++ b/examples/OpenGL3test.cxx @@ -30,7 +30,7 @@ # endif # include #endif - +#include // for gl_texture_reset() void add_output(const char *format, ...); @@ -50,8 +50,7 @@ public: gl_version_major = 0; } void draw(void) { - if (gl_version_major < 3) return; - if (!shaderProgram) { + if (gl_version_major >= 3 && !shaderProgram) { GLuint vs; GLuint fs; int Mslv, mslv; // major and minor version numbers of the shading language @@ -135,9 +134,11 @@ public: } glClearColor(0.08, 0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT); - GLfloat p[]={0,0}; - glUniform2fv(positionUniform, 1, (const GLfloat *)&p); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + if (shaderProgram) { + GLfloat p[]={0,0}; + glUniform2fv(positionUniform, 1, (const GLfloat *)&p); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + } Fl_Gl_Window::draw(); // Draw FLTK child widgets. } virtual int handle(int event) { @@ -158,7 +159,12 @@ public: const uchar *glv = glGetString(GL_VERSION); add_output("GL_VERSION=%s\n", glv); sscanf((const char *)glv, "%d", &gl_version_major); - if (gl_version_major < 3) add_output("\nThis platform does not support OpenGL V3\n\n"); + if (gl_version_major < 3) { + add_output("\nThis platform does not support OpenGL V3 :\n" + "FLTK widgets will appear but the programmed " + "rendering pipeline will not run.\n"); + mode(mode() & !FL_OPENGL3); + } redraw(); } @@ -181,7 +187,7 @@ public: } return retval; } - void reset(void) { shaderProgram = 0; } + void reset(void) { shaderProgram = 0; gl_texture_reset(); } }; diff --git a/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx index bb4c53df1..3ee281b37 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx @@ -27,7 +27,6 @@ #include #include -extern void gl_texture_reset(); #ifdef __OBJC__ @class NSOpenGLPixelFormat; diff --git a/src/gl_draw.cxx b/src/gl_draw.cxx index 3104f161d..b786b830d 100644 --- a/src/gl_draw.cxx +++ b/src/gl_draw.cxx @@ -319,11 +319,6 @@ int gl_texture_fifo::already_known(const char *str, int n) static gl_texture_fifo *gl_fifo = NULL; // points to the texture pile class instance -void gl_texture_reset() -{ - if (gl_fifo) gl_texture_pile_height(gl_texture_pile_height()); -} - // Cross-platform implementation of the texture mechanism for text rendering // using textures with the alpha channel only. @@ -465,6 +460,15 @@ int gl_texture_pile_height(void) return gl_fifo->size(); } +/** To call after GL operations that may invalidate textures used to draw text in GL scenes + (e.g., switch between FL_DOUBLE / FL_SINGLE modes). + */ +void gl_texture_reset() +{ + if (gl_fifo) gl_texture_pile_height(gl_texture_pile_height()); +} + + /** Changes the maximum height of the pile of pre-computed string textures