summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2006-08-17 09:49:43 +0000
committerMatthias Melcher <fltk@matthiasm.com>2006-08-17 09:49:43 +0000
commit51d67574ecae4a7e898a854b23b79be59197cc4e (patch)
treea40de38ebf1471fca6f68181b107eba5719de5c2
parentef48f007a1a8463abfccb118a6836718d497eb29 (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--CHANGES2
-rw-r--r--FL/Fl_Gl_Window.H9
-rw-r--r--documentation/Fl_Gl_Window.html13
-rw-r--r--src/Fl_Gl_Window.cxx17
-rw-r--r--test/CubeView.cxx4
-rw-r--r--test/CubeViewUI.fl10
6 files changed, 40 insertions, 15 deletions
diff --git a/CHANGES b/CHANGES
index e2ab68583..1a192405c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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
}