PDA

View Full Version : Skybox or Text



Vlasko
05-10-2004, 09:25 AM
I have this little problem i can't show both skybox and text at the same time - if i comment glPrint skybox works but then i don't see the text and vice versa


void DrawGLScene()
{
double deltat;
deltat=GetTime();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
DrawSkybox(0.0f,0.0f,0.0f);
CalculateNewPos((float)deltat);
glRotatef(my_position.rot_x,1.0f,0.0f,0.0f);
glRotatef(my_position.rot_y,0.0f,1.0f,0.0f);
glTranslatef(-my_position.x,-my_position.x,-my_position.x);
DrawSkybox(0.0f,0.0f,0.0f); //problem here ?
glPushMatrix();
glTranslatef(EARTH->x,EARTH->y,EARTH->z);
ShowObject(EARTH->model);
glPopMatrix();
glPushMatrix();
glDisable(GL_CULL_FACE);
glTranslatef(0.0f,0.0f,5.0f);
glBegin(GL_TRIANGLES);
glVertex3f(-2.0f,-2.0f,0.0f);
glVertex3f(2.0f,-2.0f,0.0f);
glVertex3f(0.0f,2.0f,0.0f);
glEnd();
glEnable(GL_CULL_FACE);
glPopMatrix();
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(-1.0f,1.0f,-1.0,1.0f,-1.0f,1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1.0f,1.0f,1.0f);
glTranslatef(-0.9f,0.9f,0.0f);
glScalef(0.05f,0.05f,0.5f);
glPrint(10.0f,50.0f,0.0f,"x"); //problem here?
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}

void DrawSkybox(float x,float y,float z)
{
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST); //disables depth test
glDepthMask(0); //so skybox will never cover any geometry
glBindTexture(GL_TEXTURE_2D,skybox_texture_id);
glBegin(GL_QUADS);
glColor3f(0.25f,0.59f,0.78f);
glTexCoord2f(0.0f,1.0f); // front face
glVertex3f(-300.0f+x,-300.0f+y,-300.0f+z);
glTexCoord2f(1.0f,1.0f);
glVertex3f(300.0f+x,-300.0f+y,-300.0f+z);
glTexCoord2f(1.0f,0.0f);
glVertex3f(300.0f+x,300.0f+y,-300.0f+z);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-300.0f+x,300.0f+y,-300.0f+z);
glTexCoord2f(0.0f,1.0f); // left face
glVertex3f(-300.0f+x,-300.0f+y,300.0f+z);
glTexCoord2f(1.0f,1.0f);
glVertex3f(-300.0f+x,-300.0f+y,-300.0f+z);
glTexCoord2f(1.0f,0.0f);
glVertex3f(-300.0f+x,300.0f+y,-300.0f+z);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-300.0f+x,300.0f+y,300.0f+z);
glTexCoord2f(0.0f,1.0f); // right face
glVertex3f(300.0f+x,-300.0f+y,-300.0f+z);
glTexCoord2f(1.0f,1.0f);
glVertex3f(300.0f+x,-300.0f+y,300.0f+z);
glTexCoord2f(1.0f,0.0f);
glVertex3f(300.0f+x,300.0f+y,300.0f+z);
glTexCoord2f(0.0f,0.0f);
glVertex3f(300.0f+x,300.0f+y,-300.0f+z);
glTexCoord2f(0.0f,1.0f); // back face
glVertex3f(300.0f+x,-300.0f+y,300.0f+z);
glTexCoord2f(1.0f,1.0f);
glVertex3f(-300.0f+x,-300.0f+y,300.0f+z);
glTexCoord2f(1.0f,0.0f);
glVertex3f(-300.0f+x,300.0f+y,300.0f+z);
glTexCoord2f(0.0f,0.0f);
glVertex3f(300.0f+x,300.0f+y,300.0f+z);
glTexCoord2f(0.0f,1.0f); // upper face
glVertex3f(-300.0f+x,300.0f+y,-300.0f+z);
glTexCoord2f(1.0f,1.0f);
glVertex3f(300.0f+x,300.0f+y,-300.0f+z);
glTexCoord2f(1.0f,0.0f);
glVertex3f(300.0f+x,300.0f+y,300.0f+z);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-300.0f+x,300.0f+y,300.0f+z);
glTexCoord2f(0.0f,1.0f); // lower face
glVertex3f(-300.0f+x,-300.0f+y,300.0f+z);
glTexCoord2f(1.0f,1.0f);
glVertex3f(300.0f+x,-300.0f+y,300.0f+z);
glTexCoord2f(1.0f,0.0f);
glVertex3f(300.0f+x,-300.0f+y,-300.0f+z);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-300.0f+x,-300.0f+y,-300.0f+z);
glEnd();
glDepthMask(1);
glEnable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);

}

and glPrint func taken from NeHe



void glPrint(double xrot,double yrot,double zrot,const char *fmt, ...)
{
float length=0; // Used To Find The Length Of The Text
char text[256]; // Holds Our String
va_list ap; // Pointer To List Of Arguments
if (fmt == NULL) // If There's No Text
return; // Do Nothing
va_start(ap, fmt); // Parses The String For Variables
vsprintf(text, fmt, ap); // And Converts Symbols To Actual Numbers
va_end(ap); // Results Are Stored In Text
for (unsigned int i=0;i<(strlen(text));i++) // Loop To Find Text Length
{
length+=gmf[text[i]].gmfCellIncX; // Increase Length By Each Characters Width
}
glRotated(xrot,1,0,0); // Rotate Text
glRotated(yrot,0,1,0);
glRotated(zrot,0,0,1);
glTranslatef(-length/2,0.0f,0.0f); // Center Our Text On The Screen
glPushAttrib(GL_LIST_BIT); // Pushes The Display List Bits
glListBase(base); // Sets The Base Character to 0
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);// Draws The Display List Text
glPopAttrib(); // Pops The Display List Bits
}

dorbie
05-10-2004, 10:13 PM
Incidentally, you draw the skybox twice, the first when identity is on the modelview is almost certainly wrong, you'd at LEAST want the rotation.

Draw it once, probably before you load the view translate on the modelview after the rotate, but since it has a translate build into the rendering you could use that and leave the draw call after all the view xform is applied.

Onto your question:

w.r.t. the font disappearing, I suspect the problem is the depth test being enabled on the way out of the skydome, it may not be enabled exiting your other draw code, it's impossible to tell.

Vlasko
05-11-2004, 07:53 AM
The first one is removed(i tried something before and forgot to remove it)

for the text - depth buffer is enabled all the time(except for skybox) and every other object is shown