mirror of https://github.com/fltk/fltk
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:
parent
283184a09a
commit
da66e21e1d
1
FL/gl.h
1
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_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);
|
||||||
|
|
||||||
|
|
|
@ -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(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue