Support of FLTK widgets in OpenGL 3 windows - cont'd.

This commit allows to switch between FL_DOUBLE / FL_SINGLE modes
in widget-containing GL3 windows.
Demo program examples/OpenGL3test is modified to show FLTK widgets
even if the platform does not support OpenGL 3.
This commit is contained in:
ManoloFLTK 2022-09-29 09:39:21 +02:00
parent 283184a09a
commit da66e21e1d
4 changed files with 24 additions and 14 deletions

View File

@ -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_measure(const char*, int& x, int& y);
FL_EXPORT void gl_texture_pile_height(int max); FL_EXPORT void gl_texture_pile_height(int max);
FL_EXPORT int gl_texture_pile_height(); 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); FL_EXPORT void gl_draw_image(const uchar *, int x,int y,int w,int h, int d=3, int ld=0);

View File

@ -30,7 +30,7 @@
# endif # endif
# include <GL/glew.h> # include <GL/glew.h>
#endif #endif
#include <FL/gl.h> // for gl_texture_reset()
void add_output(const char *format, ...); void add_output(const char *format, ...);
@ -50,8 +50,7 @@ public:
gl_version_major = 0; gl_version_major = 0;
} }
void draw(void) { void draw(void) {
if (gl_version_major < 3) return; if (gl_version_major >= 3 && !shaderProgram) {
if (!shaderProgram) {
GLuint vs; GLuint vs;
GLuint fs; GLuint fs;
int Mslv, mslv; // major and minor version numbers of the shading language 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); glClearColor(0.08, 0.8, 0.8, 1.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
if (shaderProgram) {
GLfloat p[]={0,0}; GLfloat p[]={0,0};
glUniform2fv(positionUniform, 1, (const GLfloat *)&p); glUniform2fv(positionUniform, 1, (const GLfloat *)&p);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
Fl_Gl_Window::draw(); // Draw FLTK child widgets. Fl_Gl_Window::draw(); // Draw FLTK child widgets.
} }
virtual int handle(int event) { virtual int handle(int event) {
@ -158,7 +159,12 @@ public:
const uchar *glv = glGetString(GL_VERSION); const uchar *glv = glGetString(GL_VERSION);
add_output("GL_VERSION=%s\n", glv); add_output("GL_VERSION=%s\n", glv);
sscanf((const char *)glv, "%d", &gl_version_major); 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(); redraw();
} }
@ -181,7 +187,7 @@ public:
} }
return retval; return retval;
} }
void reset(void) { shaderProgram = 0; } void reset(void) { shaderProgram = 0; gl_texture_reset(); }
}; };

View File

@ -27,7 +27,6 @@
#include <FL/Fl_Image_Surface.H> #include <FL/Fl_Image_Surface.H>
#include <dlfcn.h> #include <dlfcn.h>
extern void gl_texture_reset();
#ifdef __OBJC__ #ifdef __OBJC__
@class NSOpenGLPixelFormat; @class NSOpenGLPixelFormat;

View File

@ -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 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 // Cross-platform implementation of the texture mechanism for text rendering
// using textures with the alpha channel only. // using textures with the alpha channel only.
@ -465,6 +460,15 @@ int gl_texture_pile_height(void)
return gl_fifo->size(); 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 Changes the maximum height of the pile of pre-computed string textures