Yes please do it,
I think it can help beginners like me in the future...
Thanks again.
> Loic wrote:
> > You are right...
> > I guess it can't be in the constructor because OpenGL is not yet necessary
> > started up at constructor time...
>
> Correct -- all opengl init should be done inside the
> draw() 'if (!valid())' test.
>
> Pretty sure the docs for Fl_Gl_Window and the "Using OpenGL"
> cover the reasoning behind this, though it probably needs
> to be made clearer.
>
> A documentation overhaul of sorts has been in the works,
> I'll see if we can make this a little more explicit in
> both the above pages.
>
> > for your other comments, I ofcourse agree on it...
> > But this was just a dummy example, just to check my texture problem...
> > My project is of course better code than this ;)
>
> Right, as I looked at your code, I could tell snippets
> were being moved around to try to make things work..
>
> Must've been maddening cause you knew your glut version
> worked right.
>
> FWIW, I took one of my offline examples, and merged in
> your cube object in place of what I had (a spinning square),
> which makes it a better example.
>
> This has the timer, a perspective frustum, and a
> "checkerboard" pattern for the texturemap.
>
> If you want, I can added this as an example on my
> 'cheat page' of FLTK demo examples..
>
> * * *
>
> #include <stdio.h>
> #include <math.h>
> #include <FL/Fl.h>
> #include <FL/Fl_Window.h>
> #include <FL/Fl_Gl_Window.h>
> #include <FL/gl.h>
> //
> // OpenGL spinning cube with checker texturemap -- erco/loic 03/17/09
> //
> #define WIN_W 400 // window width
> #define WIN_H 400 // window height
> #define TEX_W 64 // texturemap width
> #define TEX_H 64 // texturemap height
> #define FPS (1.0/24.0) // frames per second playback
> //
> // OpenGL class to show texturemapped cube
> //
> class MyGlWindow : public Fl_Gl_Window {
> double spin;
> GLuint TexID;
> // TIMER CALLBACK
> // Handles rotation the object
> //
> static void Timer_CB(void *userdata) {
> MyGlWindow *mygl = (MyGlWindow*)userdata;
> mygl->spin += 2.0; // spin
> mygl->redraw();
> Fl::repeat_timeout(FPS, Timer_CB, userdata);
> }
> public:
> // CTOR
> MyGlWindow(int x,int y,int w,int h,const char *l=0) :
> Fl_Gl_Window(x,y,w,h,l) {
> spin = 0.0;
> Fl::add_timeout(FPS, Timer_CB, (void*)this); // 24fps timer
> }
> // PERSPECTIVE VIEW
> // Same as gluPerspective()..
> //
> void Perspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble
> zFar) {
> GLdouble xmin, xmax, ymin, ymax;
> ymax = zNear * tan(fovy * M_PI / 360.0);
> ymin = -ymax;
> xmin = ymin * aspect;
> xmax = ymax * aspect;
> glFrustum(xmin, xmax, ymin, ymax, zNear, zFar);
> }
> // RESHAPED VIEWPORT
> // OpenGL stuff to do whenever window changes size
> //
> void ReshapeViewport() {
> // Viewport
> glViewport(0, 0, w(), h());
> // Projection
> glMatrixMode(GL_PROJECTION);
> glLoadIdentity();
> GLfloat ratio = w() / h();
> Perspective(30.0, 1.0*ratio, 1.0, 30.0);
> glTranslatef(0.0, 0.0, -8.0);
> // Model view
> glMatrixMode(GL_MODELVIEW);
> glLoadIdentity();
> }
> // OPENGL INITIALIZATION
> // OpenGL stuff to do *only once* on startup.
> //
> void GlInit() {
> // Make sure we only do this once
> static int first_time = 1;
> if ( first_time ) {
> first_time = 0;
> // Texture Map Init
> GLubyte img[TEX_W][TEX_H][3]; // after glTexImage2D(), array
> is no longer needed
> glGenTextures(1, &TexID);
> glBindTexture(GL_TEXTURE_2D, TexID);
> for (int x=0; x<TEX_W; x++) {
> for (int y=0; y<TEX_H; y++) {
> GLubyte c = ((x&16)^(y&16)) ? 255 : 0;
> // checkerboard
> //GLubyte c = ((x&16)^(y&16)) ? ((x%16)<<4) : (((x%16)^15)<<4);
> // basket weave
> img[x][y][0] = c;
> img[x][y][1] = c;
> img[x][y][2] = c;
> }
> }
> glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEX_W, TEX_H, 0, GL_RGB,
> GL_UNSIGNED_BYTE, &img[0][0][0]);
> glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
> glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
> glEnable(GL_TEXTURE_2D);
> // Misc OpenGL settings
> glShadeModel(GL_FLAT);
> glEnable(GL_DEPTH_TEST);
> glDepthFunc(GL_LEQUAL);
> }
> }
> // FLTK DRAW
> // Called by FLTK to draw the scene.
> //
> void draw() {
> // Initialize/handle reshaped viewport
> if ( !valid() ) {
> valid(1);
> GlInit();
> ReshapeViewport();
> }
> // Clear
> glClearColor(.5,.5,.5, 0.0);
> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
> // Setup model matrix
> glLoadIdentity();
> glRotatef(spin, 0.5, 1.0, 0.0); // show all sides of cube
> // Draw cube with texture assigned to each face
> glBegin(GL_QUADS);
> // Front Face
> glColor3f(1.0, 0.0, 0.0); // red
> glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); // Top
> Left Of The Texture and Quad
> glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); // Top
> Right Of The Texture and Quad
> glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); //
> Bottom Right Of The Texture and Quad
> glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); //
> Bottom Left Of The Texture and Quad
> // Back Face
> glColor3f(0.0, 1.0, 1.0); // cyn
> glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); // Top
> Left Of The Texture and Quad
> glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); // Top
> Right Of The Texture and Quad
> glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); //
> Bottom Right Of The Texture and Quad
> glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); //
> Bottom Left Of The Texture and Quad
> // Top Face
> glColor3f(0.0, 1.0, 0.0); // grn
> glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); // Top
> Left Of The Texture and Quad
> glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); // Top
> Right Of The Texture and Quad
> glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0); //
> Bottom Right Of The Texture and Quad
> glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); //
> Bottom Left Of The Texture and Quad
> // Bottom Face
> glColor3f(1.0, 0.0, 1.0); // mag
> glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0); // Top
> Left Of The Texture and Quad
> glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0); // Top
> Right Of The Texture and Quad
> glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); //
> Bottom Right Of The Texture and Quad
> glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); //
> Bottom Left Of The Texture and Quad
> // Right face
> glColor3f(0.0, 0.0, 1.0); // blu
> glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); // Top
> Left Of The Texture and Quad
> glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); // Top
> Right Of The Texture and Quad
> glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); //
> Bottom Right Of The Texture and Quad
> glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); //
> Bottom Left Of The Texture and Quad
> // Left Face
> glColor3f(1.0, 1.0, 0.0); // yel
> glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); // Top
> Left Of The Texture and Quad
> glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); // Top
> Right Of The Texture and Quad
> glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); //
> Bottom Right Of The Texture and Quad
> glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); //
> Bottom Left Of The Texture and Quad
> glEnd();
> // DEBUG: CHECK FOR ERRORS
> GLenum err = glGetError();
> if ( err != GL_NO_ERROR ) {
> fprintf(stderr, "GLGETERROR=%d\n", (int)err);
> }
> }
> };
> int main(int argc, char *argv[]) {
> MyGlWindow* mygl = new MyGlWindow(10, 10, WIN_W-20, WIN_H-20, "Texture
> Test");
> mygl->end();
> mygl->resizable(mygl);
> mygl->show();
> return(Fl::run());
> }
>
>
>
>
_______________________________________________
fltk-opengl mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-opengl