diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2006-08-17 09:49:43 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2006-08-17 09:49:43 +0000 |
| commit | 51d67574ecae4a7e898a854b23b79be59197cc4e (patch) | |
| tree | a40de38ebf1471fca6f68181b107eba5719de5c2 | |
| parent | ef48f007a1a8463abfccb118a6836718d497eb29 (diff) | |
New context_changed() function for OpenGL windows allowing efficient texture loading (str #1372)
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@5322 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | CHANGES | 2 | ||||
| -rw-r--r-- | FL/Fl_Gl_Window.H | 9 | ||||
| -rw-r--r-- | documentation/Fl_Gl_Window.html | 13 | ||||
| -rw-r--r-- | src/Fl_Gl_Window.cxx | 17 | ||||
| -rw-r--r-- | test/CubeView.cxx | 4 | ||||
| -rw-r--r-- | test/CubeViewUI.fl | 10 |
6 files changed, 40 insertions, 15 deletions
@@ -1,5 +1,7 @@ CHANGES IN FLTK 1.1.8 + - Added "context_changed()" function for OpenGL windows + which allows efficent texture loading (STR #1372) - Added missing "const" to GLUT call (STR #1371) - Fixed stray FL_RELEASE events after clicking system areas on OS X (STR #1376) diff --git a/FL/Fl_Gl_Window.H b/FL/Fl_Gl_Window.H index 2ef824a94..d13b832ca 100644 --- a/FL/Fl_Gl_Window.H +++ b/FL/Fl_Gl_Window.H @@ -41,7 +41,7 @@ class FL_EXPORT Fl_Gl_Window : public Fl_Window { const int *alist; Fl_Gl_Choice *g; GLContext context_; - char valid_; + char valid_f_; char damage1_; // damage() of back buffer virtual void draw_overlay(); void init(); @@ -61,10 +61,13 @@ public: void hide(); void resize(int,int,int,int); - char valid() const {return valid_;} - void valid(char v) {valid_ = v;} + char valid() const {return valid_f_ & 1;} + void valid(char v) {if (v) valid_f_ |= 1; else valid_f_ &= 0xfe;} void invalidate(); + char context_valid() const {return valid_f_ & 2;} + void context_valid(char v) {if (v) valid_f_ |= 2; else valid_f_ &= 0xfd;} + static int can_do(int m) {return can_do(m,0);} static int can_do(const int *m) {return can_do(0, m);} int can_do() {return can_do(mode_,alist);} diff --git a/documentation/Fl_Gl_Window.html b/documentation/Fl_Gl_Window.html index 2367cbcdb..5ad853d7a 100644 --- a/documentation/Fl_Gl_Window.html +++ b/documentation/Fl_Gl_Window.html @@ -58,6 +58,7 @@ unless those Widgets are modified to draw using OpenGL calls.</P> </TD><TD align=left valign=top> <UL> <LI><A href=#Fl_Gl_Window.context>context</A></LI> +<LI><A href=#Fl_Gl_Window.context_valid>context_valid</A></LI> <LI><A href=#Fl_Gl_Window.draw>draw</A></LI> <LI><A href=#Fl_Gl_Window.draw_overlay>draw_overlay</A></LI> </UL> @@ -164,9 +165,11 @@ void mywindow::draw() { if (!valid()) { glViewport(0,0,w(),h()); glFrustum(...); - glLight(...); ...other initialization... } + if (!context_valid()) { + ...load textures, etc. ... + } ... draw your geometry here ... } </PRE></UL> @@ -178,6 +181,14 @@ draw()</TT> returns. <H4><A name=Fl_Gl_Window.invalidate>void Fl_Gl_Window::invalidate()</A></H4> The <TT>invalidate()</TT> method turns off <TT>valid()</TT> and is equivalent to calling <TT>value(0)</TT>. + +<H4><A name=Fl_Gl_Window.context_valid>char Fl_Gl_Window::context_valid() const +<BR> void Fl_Gl_Window::context_valid(char i)</A></H4> +<TT>Fl_Gl_Window::context_valid()</TT> will only be set if the +OpenGL context is created or recreated. It differs from +<TT>Fl_Gl_Window::valid()</TT> which is also set whenever the context +changes size. + <H4><A name=Fl_Gl_Window.ortho>void Fl_Gl_Window::ortho()</A></H4> Set the projection so 0,0 is in the lower left of the window and each pixel is 1 unit wide/tall. If you are drawing 2D images, your <TT> diff --git a/src/Fl_Gl_Window.cxx b/src/Fl_Gl_Window.cxx index 97246c278..f16f3ef28 100644 --- a/src/Fl_Gl_Window.cxx +++ b/src/Fl_Gl_Window.cxx @@ -88,8 +88,12 @@ void Fl_Gl_Window::show() { void Fl_Gl_Window::invalidate() { valid(0); + context_valid(0); #ifndef WIN32 - if (overlay) ((Fl_Gl_Window*)overlay)->valid(0); + if (overlay) { + ((Fl_Gl_Window*)overlay)->valid(0); + ((Fl_Gl_Window*)overlay)->context_valid(0); + } #endif } @@ -137,6 +141,7 @@ void Fl_Gl_Window::make_current() { mode_ &= ~NON_LOCAL_CONTEXT; context_ = fl_create_gl_context(this, g); valid(0); + context_valid(0); } fl_set_gl_context(this, context_); @@ -215,7 +220,10 @@ int fl_overlay_depth = 0; #endif void Fl_Gl_Window::flush() { - uchar save_valid = valid_; + uchar save_valid = valid_f_ & 1; +#if HAVE_GL_OVERLAY && defined(WIN32) + uchar save_valid_f = valid_f_; +#endif #ifdef __APPLE_QD__ //: clear previous clipping in this shared port @@ -256,7 +264,7 @@ void Fl_Gl_Window::flush() { fl_overlay = 1; draw_overlay(); fl_overlay = 0; - valid(save_valid); + valid_f_ = save_valid_f; wglSwapLayerBuffers(Fl_X::i(this)->private_dc, WGL_SWAP_OVERLAY1); // if only the overlay was damaged we are done, leave main layer alone: if (damage() == FL_DAMAGE_OVERLAY) { @@ -357,6 +365,7 @@ void Fl_Gl_Window::flush() { if (fixcursor) SetCursor(Fl_X::i(this)->cursor); #endif valid(1); + context_valid(1); } void Fl_Gl_Window::resize(int X,int Y,int W,int H) { @@ -408,7 +417,7 @@ void Fl_Gl_Window::init() { context_ = 0; g = 0; overlay = 0; - valid_ = 0; + valid_f_ = 0; damage1_ = 0; #if 0 // This breaks resizing on Linux/X11 diff --git a/test/CubeView.cxx b/test/CubeView.cxx index f59cbb1d3..ae260ade4 100644 --- a/test/CubeView.cxx +++ b/test/CubeView.cxx @@ -40,8 +40,8 @@ CubeView::CubeView(int x,int y,int w,int h,const char *l) vAng = 0.0; hAng=0.0; size=10.0; - xshift=0.0; - yshift=0.0; + xshift=0.0; + yshift=0.0; /* The cube definition. These are the vertices of a unit cube * centered on the origin.*/ diff --git a/test/CubeViewUI.fl b/test/CubeViewUI.fl index b742e21bf..da8e196e0 100644 --- a/test/CubeViewUI.fl +++ b/test/CubeViewUI.fl @@ -1,5 +1,5 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0100 +version 1.0108 header_name {.h} code_name {.cxx} class CubeViewUI {open @@ -7,7 +7,7 @@ class CubeViewUI {open Function {CubeViewUI()} {open } { Fl_Window mainWindow { - label CubeView open selected + label CubeView open private xywh {428 124 415 405} type Double box UP_BOX labelsize 12 resizable visible } { Fl_Group {} {open @@ -47,14 +47,14 @@ cube->redraw();} } } Fl_Group MainView {open - xywh {46 27 333 333} + xywh {46 27 333 333} resizable } { Fl_Box cframe { xywh {46 27 333 333} box DOWN_FRAME color 4 selection_color 69 } Fl_Box cube { - label {This is the cube_view} - xywh {48 29 329 329} align 16 + label {This is the cube_view} selected + xywh {48 29 329 329} align 16 resizable code0 {\#include "CubeView.h"} class CubeView } |
