PDA

View Full Version : FLTK texture problem



saultydog
09-02-2006, 09:15 AM
I've tried to implement some of the texture code from the redbook using FLTK. However, instead of the checkerboard pattern I'd like to see I only see white quads. Can anyone see where I've gone wrong? Or is there a problem with FLTK itself? The code is in three files: main.cpp, StippleWin.cpp, and StippleWin.h. Thanks in advance for any help.


/* main.cpp */
#include "FL/Fl.H"
#include "StippleWin.h"

int main(int argc, char *argv[])
{
StippleWin *mainwin = new StippleWin();
mainwin->mode(FL_RGB | FL_SINGLE | FL_DEPTH);
mainwin->show();
while(true)
{
if(!Fl::check())
{
break;
}
}
if(mainwin)
{
mainwin->hide();
delete mainwin;
}
return 0;
}
/* StippleWin.h */
#include "FL/Fl_Gl_Window.H"
class StippleWin : public Fl_Gl_Window
{
public:
StippleWin();
~StippleWin() {}

void draw();
};
/* StippleWin.cpp */
#include "StippleWin.h"

#include "GL/glut.h"
#include "GL/glu.h"

#define checkImageWidth 64
#define checkImageHeight 64
static GLubyte checkImage[checkImageHeight][checkImageWidth][4];

static GLuint texName;

void makeCheckImage(void)
{
int i, j, c;

for (i = 0; i < checkImageHeight; i++) {
for (j = 0; j < checkImageWidth; j++) {
c = ((((i&amp;0x8)==0)^((j&amp;0x8))==0))*255;
checkImage[i][j][0] = (GLubyte) c;
checkImage[i][j][1] = (GLubyte) c;
checkImage[i][j][2] = (GLubyte) c;
checkImage[i][j][3] = (GLubyte) 255;
}
}
}

StippleWin::StippleWin() : Fl_Gl_Window(100,100,250,250,"")
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);

makeCheckImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glGenTextures(1, &amp;texName);
glBindTexture(GL_TEXTURE_2D, texName);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth,
checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
checkImage);
}

void StippleWin::draw()
{
int w = this->w(), h = this->h();

glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -3.6);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, texName);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);

glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);
glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
glEnd();
glFlush();
glDisable(GL_TEXTURE_2D);
}

GuybrushThreepwood
09-02-2006, 10:19 AM
Just from a quick look, it might be because you are setting up your texture in the constructor which may not have a GL context setup yet, you can check by doing something like...



void *pContext = NULL;
pContext = context();

if( pContext )
{
// do GL calls
}obviously if the context is NULL then none of your GL calls are actually being done, which might be why you see your quads but not the texture on them.

saultydog
09-02-2006, 10:37 AM
That looks like it's my problem. I copied the constructor code into the draw() routine and now I see the texture. Coulda sworn I tried that at the very beginning, but apparently not. Thanks!