Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

Sparky

Push/PopMatrix

This topic is 6428 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I''ve been looking through the Blue and Red books to find out more about glPushMatrix() and I understand that it essentialy makes a copy of the matrix on the stack. However, I am having a problem getting this to work properly. I''m attempting to display 3D objects and 2D text at the same time and I start out with an Ortho view. My question is do I need to start with a Projection view or does that even matter? Depending on where I place glPushMatrix, I either get the text or I get the 3D object but not both. I''m assuming that this is because I''m not Pushin and a Popin where I need to! (Heheh). Here''s the drawing code: int DrawGLScene(GLvoid) { GLfloat yrot=0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer glPushMatrix(); glPushAttrib(GL_PROJECTION); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,0.0f); glRotatef(yrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glRotatef(yrot,0.0f,0.0f,1.0f); // Select the earth texture map glBindTexture(GL_TEXTURE_2D, texture[1]); gluSphere(quadratic,20.2f,32,32); yrot-=0.02f; glPopMatrix(); glPopAttrib(); glDisable(GL_DEPTH_TEST); // Select the font texture glBindTexture(GL_TEXTURE_2D, texture[0]); glColor3f(1.0f,0.0f,0.0f); glPrint(20,20,1,"FPS:%2i",(int)fps); glPrint(20,40,1,"Pitch:%2i",pitch); glPrint(20,60,1,"Roll:%2i",roll); return TRUE; } I''ve tried several different sequences and nothing seems to get both on the screen. Any suggestions? Maybe a tutorial on combining 2D and 3D would help. I just can''t seem to find enough info on glPush/PopMatrix to figure out what I''m doing wrong. Thanks for any help in advance... Sparky "Keep the dirty side down"

Share this post


Link to post
Share on other sites
Advertisement
This is how I would do it... Not certain it works.. Untested...

int DrawGLScene(GLvoid)
{
GLfloat yrot=0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glTranslatef(0.0f,0.0f,0.0f);
glRotatef(yrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(yrot,0.0f,0.0f,1.0f);
glBindTexture(GL_TEXTURE_2D, texture[1]);
gluSphere(quadratic,20.2f,32,32);
yrot-=0.02f;

glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glColor3f(1.0f,0.0f,0.0f);
glPrint(20,20,1,"FPS:%2i",(int)fps); glPrint(20,40,1,"Pitch:%2i",pitch);
glPrint(20,60,1,"Roll:%2i",roll);
return TRUE;
}

or

int DrawGLScene(GLvoid)
{
GLfloat yrot=0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glPushMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glTranslatef(0.0f,0.0f,0.0f);
glRotatef(yrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(yrot,0.0f,0.0f,1.0f);
glBindTexture(GL_TEXTURE_2D, texture[1]);
gluSphere(quadratic,20.2f,32,32);
yrot-=0.02f;
glPopMatrix();

glPushMatrix();
glDisable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glColor3f(1.0f,0.0f,0.0f);
glPrint(20,20,1,"FPS:%2i",(int)fps); glPrint(20,40,1,"Pitch:%2i",pitch);
glPrint(20,60,1,"Roll:%2i",roll);
glPopMatrix();

return TRUE;
}

What do you use glMatrixMode(GL_MODELVIEW) for?

Mvh
Søren Olesen

Share this post


Link to post
Share on other sites
The glMatrixMode(GL_MODEL_VIEW) was just something I tried to get it working. I didn''t mean to add that part in my question.
Still having the same problem though (scratching head & pulling on what''s left of my hair!)

I know it can be done because I''ve seen demo''s with the FPS showing while 3D stuff is on the screen.......grrrrrrrr!

Robert Snyder

Share this post


Link to post
Share on other sites
Well, from what I understand, Push & PopMatrix push/pop the *currently active* matrix onto the matrix stack. If you are in ModelView mode, only the ModelView matrix will be pushed/popped. If you push a matrix in one mode, pop it off *before* switching to a different matrix mode.

Hope that helps.



/**************************************
* Hookt on Fonix relly werked fer mee!
* WarAmp
***************************************/

Share this post


Link to post
Share on other sites
Here''s a couple Ideas. I don''t know if they''ll work though.

int DrawGLScene(GLvoid)
{
// make this a global variable or a static variable or it will reinitialize every time and you''ll get no rotation
GLfloat yrot=0;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// not needed - glPushMatrix();
// not needed - glPushAttrib(GL_PROJECTION);

// this line could be moved to the init code as all objects are being drawn with textures
glEnable(GL_TEXTURE_2D);

glEnable(GL_DEPTH_TEST);

// this line could be moved to the init code as blending is never enabled
glDisable(GL_BLEND);

// not needed - glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f,0.0f,0.0f);
glRotatef(yrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(yrot,0.0f,0.0f,1.0f);
// Select the earth texture map
glBindTexture(GL_TEXTURE_2D, texture[1]);
gluSphere(quadratic,20.2f,32,32);

yrot-=0.02f;

// not needed - glPopMatrix();
// not needed - glPopAttrib();

// add this line to clear the matrix (the text dosn''t need to be transformed)
glLoadIdentity();

glDisable(GL_DEPTH_TEST);
// Select the font texture
glBindTexture(GL_TEXTURE_2D, texture[0]);
glColor3f(1.0f,0.0f,0.0f);

glPrint(20,20,1,"FPS:%2i",(int)fps);
glPrint(20,40,1,"Pitch:%2i",pitch);
glPrint(20,60,1,"Roll:%2i",roll);

return TRUE;
}

Share this post


Link to post
Share on other sites
Hi there,

this is the code i use.

  
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0,Width,Height,0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
//all orthographic output here

glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);

Hope its of some help

Share this post


Link to post
Share on other sites
This is what i''m doing :


Draw your 3d stuff
Enable2D();

draw2d stuff

Disable2D();

draw 3d stuff again




void Enable2D()
{
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, v_x, 0, v_y, -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
}

void Disable2D()
{

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!