Archived

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

Problems with glPushMatrix()

This topic is 5315 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

When i paint a background (Ortho Mode) and then in the foreground (in Perspective Mode) 3 Layers of Alpha Blended Cubes having some special MAterial and Lighning but no textures the cubes do not rotate as i expected and also the background switches to solid white after a very short while. I played around with glPushMatrix() at some positions of my code, but nothing seems to help. I post parts of the Code here, because it might be easier to see what i''m doing wrong: Would be nice, if someone could help.... void Draw (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); RenderBackground(); RenderCubes(); glFlush (); } void RenderBackground() { // switch to Ortho2D glMatrixMode (GL_PROJECTION); glLoadIdentity(); glOrtho(0.0f, g_window->init.width, g_window->init.height, 0.0f, -1.0f, 1.0f); glMatrixMode (GL_MODELVIEW); glLoadIdentity(); // glTranslatef(0.375, 0.375, 0.0); glEnable(GL_TEXTURE_2D); glDepthMask(GL_FALSE); // Draw Background int x_pos, y_pos; float width, height; y_pos = 0; x_pos = 0; for (int i=0; i < sizeof(tiles); i++) { glBindTexture(GL_TEXTURE_2D, tiles.texture); glBegin(GL_TRIANGLE_STRIP); glColor3f(1.0f, 1.0f, 1.0f); glTexCoord2d(1,1); glVertex2i( x_pos+tiles[i].width, y_pos); glTexCoord2d(0,1); glVertex2i( x_pos, y_pos); glTexCoord2d(1,0); glVertex2i( x_pos+tiles[i].width, y_pos+tiles[i].height); glTexCoord2d(0,0); glVertex2i( x_pos, y_pos+tiles[i].height); glEnd(); x_pos += tiles[i].width; if (x_pos >= g_window->init.width) { x_pos=0; y_pos += tiles[i].height; } } glDepthMask(GL_TRUE); } void RenderCubes() { long y = tickCount/1000; glPushMatrix(); // Switch to 3D Perspective glMatrixMode (GL_PROJECTION); glLoadIdentity (); // Calculate The Aspect Ratio Of The Window gluPerspective (45.0f, (GLfloat)(g_window->init.width)/(GLfloat)(g_window->init.height), 1.0f, 1000.0f); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); // Setup Lights glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_AMBIENT, light0.ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0.diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light0.specular); glLightfv(GL_LIGHT0, GL_POSITION, light0.position); glEnable(GL_LIGHT1); glLightfv(GL_LIGHT1, GL_AMBIENT, light1.ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1.diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, light1.specular); glLightfv(GL_LIGHT1, GL_POSITION, light1.position); // Enable Alpha Blending glDisable( GL_DEPTH_TEST ); glEnable( GL_BLEND ); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glDisable(GL_COLOR_SUM_EXT); for (int i=0; i < noCubeLayers; i++) { for (int j=0; j < noCubes; j++) { // update y position to move cubes from bottom // to top of screen cubes[i][j].pos.y += speedLayers[i]; if (cubes[i][j].pos.y > cubes[i][j].pos.z/-2 ) { cubes[i][j].pos.y = cubes[i][j].pos.z/2; } glTranslatef(cubes[i][j].pos.x, cubes[i][j].pos.y, cubes[i][j].pos.z); glRotatef(cubes[i][j].rot.rotX, 1.0f, 0.0f, 0.0f); glRotatef(cubes[i][j].rot.rotY, 0.0f, 1.0f, 0.0f); glRotatef(cubes[i][j].rot.rotZ, 0.0f, 0.0f, 1.0f); glBegin( GL_TRIANGLES ); SetMaterial(&outerMaterial); for (int count=0; count < outer.num_faces; count++) { glNormal3f( outer.normals[outer.n_idx[count]].x, outer.normals[outer.n_idx[count]].y, outer.normals[outer.n_idx[count]].z ); glVertex3f( outer.vertices[outer.v_idx[count]].x/100, outer.vertices[outer.v_idx[count]].y/100, outer.vertices[outer.v_idx[count]].z/100 ); } SetMaterial(&innerMaterial); for (int count=0; count < inner.num_faces; count++) { glNormal3f( inner.normals[innerCube.n_idx[count]].x, inner.normals[innerCube.n_idx[count]].y, inner.normals[innerCube.n_idx[count]].z); glVertex3f( inner.vertices[inner.v_idx[count]].x/100*1.35, inner.vertices[inner.v_idx[count]].y/100*1.35, inner.vertices[inner.v_idx[count]].z/100*1.35 ); } glEnd(); } } glDisable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glDisable( GL_BLEND ); glPopMatrix(); }

Share this post


Link to post
Share on other sites