/* gluLookAt. The result is pre-multiplied to the matrix (M = L * M) instead of * post-multiplied. */ void RageDisplay::LoadLookAt(float fov, const RageVector3 &Eye, const RageVector3 &At, const RageVector3 &Up) { float aspect = GetVideoModeParams().fDisplayAspectRatio; g_ProjectionStack.LoadMatrix( GetPerspectiveMatrix(fov, aspect, 1, 1000) ); /* Flip the Y coordinate, so positive numbers go down. */ g_ProjectionStack.Scale(1, -1, 1); g_ViewStack.LoadMatrix(RageLookAt(Eye.x, Eye.y, Eye.z, At.x, At.y, At.z, Up.x, Up.y, Up.z)); }
void RageDisplay::LoadMenuPerspective( float fovDegrees, float fVanishPointX, float fVanishPointY ) { /* fovDegrees == 0 looks the same as an ortho projection. However, * we don't want to mess with the ModelView stack because * EnterPerspectiveMode's preserve location feature expectes there * not to be any camera transforms. So, do a true ortho projection * if fovDegrees == 0. Perhaps it would be more convenient to keep * separate model and view stacks like D3D? */ if( fovDegrees == 0 ) { float left = 0, right = SCREEN_WIDTH, bottom = SCREEN_HEIGHT, top = 0; g_ProjectionStack.LoadMatrix( GetOrthoMatrix(left, right, bottom, top, SCREEN_NEAR, SCREEN_FAR) ); g_ViewStack.LoadIdentity(); } else { CLAMP( fovDegrees, 0.1f, 179.9f ); float fovRadians = fovDegrees / 180.f * PI; float theta = fovRadians/2; float fDistCameraFromImage = SCREEN_WIDTH/2 / tanf( theta ); fVanishPointX = SCALE( fVanishPointX, SCREEN_LEFT, SCREEN_RIGHT, SCREEN_RIGHT, SCREEN_LEFT ); fVanishPointY = SCALE( fVanishPointY, SCREEN_TOP, SCREEN_BOTTOM, SCREEN_BOTTOM, SCREEN_TOP ); fVanishPointX -= SCREEN_CENTER_X; fVanishPointY -= SCREEN_CENTER_Y; /* It's the caller's responsibility to push first. */ g_ProjectionStack.LoadMatrix( GetFrustumMatrix( (fVanishPointX-SCREEN_WIDTH/2)/fDistCameraFromImage, (fVanishPointX+SCREEN_WIDTH/2)/fDistCameraFromImage, (fVanishPointY+SCREEN_HEIGHT/2)/fDistCameraFromImage, (fVanishPointY-SCREEN_HEIGHT/2)/fDistCameraFromImage, 1, fDistCameraFromImage+1000 ) ); g_ViewStack.LoadMatrix( RageLookAt( -fVanishPointX+SCREEN_CENTER_X, -fVanishPointY+SCREEN_CENTER_Y, fDistCameraFromImage, -fVanishPointX+SCREEN_CENTER_X, -fVanishPointY+SCREEN_CENTER_Y, 0, 0.0f, 1.0f, 0.0f) ); } }
void RageDisplay::LoadMenuPerspective( float fovDegrees, float fWidth, float fHeight, float fVanishPointX, float fVanishPointY ) { // fovDegrees == 0 gives ortho projection. if( fovDegrees == 0 ) { float left = 0, right = fWidth, bottom = fHeight, top = 0; g_ProjectionStack.LoadMatrix( GetOrthoMatrix(left, right, bottom, top, -1000, +1000) ); g_ViewStack.LoadIdentity(); } else { CLAMP( fovDegrees, 0.1f, 179.9f ); float fovRadians = fovDegrees / 180.f * PI; float theta = fovRadians/2; float fDistCameraFromImage = fWidth/2 / tanf( theta ); fVanishPointX = SCALE( fVanishPointX, 0, fWidth, fWidth, 0 ); fVanishPointY = SCALE( fVanishPointY, 0, fHeight, fHeight, 0 ); fVanishPointX -= fWidth/2; fVanishPointY -= fHeight/2; // It's the caller's responsibility to push first. g_ProjectionStack.LoadMatrix( GetFrustumMatrix( (fVanishPointX-fWidth/2)/fDistCameraFromImage, (fVanishPointX+fWidth/2)/fDistCameraFromImage, (fVanishPointY+fHeight/2)/fDistCameraFromImage, (fVanishPointY-fHeight/2)/fDistCameraFromImage, 1, fDistCameraFromImage+1000 ) ); g_ViewStack.LoadMatrix( RageLookAt( -fVanishPointX+fWidth/2, -fVanishPointY+fHeight/2, fDistCameraFromImage, -fVanishPointX+fWidth/2, -fVanishPointY+fHeight/2, 0, 0.0f, 1.0f, 0.0f) ); } }
void TriageGame::Draw(Transform & transform) { // config OpenGL MatrixStack * proj = transform.GetProjectionStack(); proj->LoadMatrix(glm::ortho(0.f, (float)g_App.GetWidth(), 0.f, (float)g_App.GetHeight(), -1.f, 1.f)); glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); // render the current state state.Draw(transform); fps.Render(transform); // restore OpenGL state glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); }