-void GL_SetupView_Orientation_Identity (void)
-{
- backend_viewmatrix = identitymatrix;
- GL_SetMirrorState(false);
- memset(&backend_modelmatrix, 0, sizeof(backend_modelmatrix));
-}
-
-void GL_SetupView_Orientation_FromEntity(const matrix4x4_t *matrix)
-{
- matrix4x4_t tempmatrix, basematrix;
- Matrix4x4_Invert_Full(&tempmatrix, matrix);
- Matrix4x4_CreateRotate(&basematrix, -90, 1, 0, 0);
- Matrix4x4_ConcatRotate(&basematrix, 90, 0, 0, 1);
- Matrix4x4_Concat(&backend_viewmatrix, &basematrix, &tempmatrix);
-
- GL_SetMirrorState(v_flipped.integer);
- if(v_flipped_state)
- {
- Matrix4x4_Transpose(&basematrix, &backend_viewmatrix);
- Matrix4x4_ConcatScale3(&basematrix, -1, 1, 1);
- Matrix4x4_Transpose(&backend_viewmatrix, &basematrix);
- }
-
- //Matrix4x4_ConcatRotate(&backend_viewmatrix, -angles[2], 1, 0, 0);
- //Matrix4x4_ConcatRotate(&backend_viewmatrix, -angles[0], 0, 1, 0);
- //Matrix4x4_ConcatRotate(&backend_viewmatrix, -angles[1], 0, 0, 1);
- //Matrix4x4_ConcatTranslate(&backend_viewmatrix, -origin[0], -origin[1], -origin[2]);
-
- // force an update of the model matrix by copying it off, resetting it, and then calling the R_Mesh_Matrix function with it
- tempmatrix = backend_modelmatrix;
- memset(&backend_modelmatrix, 0, sizeof(backend_modelmatrix));
- R_Mesh_Matrix(&tempmatrix);
-}
-
-static void GL_BuildFrustum(double m[16], double left, double right, double bottom, double top, double nearVal, double farVal)
-{
- m[0] = 2 * nearVal / (right - left);
- m[1] = 0;
- m[2] = 0;
- m[3] = 0;
-
- m[4] = 0;
- m[5] = 2 * nearVal / (top - bottom);
- m[6] = 0;
- m[7] = 0;
-
- m[8] = (right + left) / (right - left);
- m[9] = (top + bottom) / (top - bottom);
- m[10] = - (farVal + nearVal) / (farVal - nearVal);
- m[11] = -1;
-
- m[12] = 0;
- m[13] = 0;
- m[14] = - 2 * farVal * nearVal / (farVal - nearVal);
- m[15] = 0;
-}
-
-void GL_SetupView_Mode_Perspective (double frustumx, double frustumy, double zNear, double zFar)
-{
- double m[16];
-
- // set up viewpoint
- CHECKGLERROR
- qglMatrixMode(GL_PROJECTION);CHECKGLERROR
- // set view pyramid
-#if 1
- // avoid glGetDoublev whenever possible, it may stall the render pipeline
- // in the tested cases (nvidia) no measurable fps difference, but it sure
- // makes a difference over a network line with GLX
- GL_BuildFrustum(m, -frustumx * zNear, frustumx * zNear, -frustumy * zNear, frustumy * zNear, zNear, zFar);
- qglLoadMatrixd(m);CHECKGLERROR
-#else
- qglLoadIdentity();CHECKGLERROR
- qglFrustum(-frustumx * zNear, frustumx * zNear, -frustumy * zNear, frustumy * zNear, zNear, zFar);CHECKGLERROR
- qglGetDoublev(GL_PROJECTION_MATRIX, m);CHECKGLERROR
-#endif
- Matrix4x4_FromArrayDoubleGL(&backend_projectmatrix, m);
- qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
- GL_SetupView_Orientation_Identity();
- CHECKGLERROR
-}
-
-void GL_SetupView_Mode_PerspectiveInfiniteFarClip (double frustumx, double frustumy, double zNear)
-{
- double nudge, m[16];
-
- // set up viewpoint
- CHECKGLERROR
- qglMatrixMode(GL_PROJECTION);CHECKGLERROR
- qglLoadIdentity();CHECKGLERROR
- // set view pyramid
- nudge = 1.0 - 1.0 / (1<<23);
- m[ 0] = 1.0 / frustumx;
- m[ 1] = 0;
- m[ 2] = 0;
- m[ 3] = 0;
- m[ 4] = 0;
- m[ 5] = 1.0 / frustumy;
- m[ 6] = 0;
- m[ 7] = 0;
- m[ 8] = 0;
- m[ 9] = 0;
- m[10] = -nudge;
- m[11] = -1;
- m[12] = 0;
- m[13] = 0;
- m[14] = -2 * zNear * nudge;
- m[15] = 0;
- qglLoadMatrixd(m);CHECKGLERROR
- qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
- GL_SetupView_Orientation_Identity();
- CHECKGLERROR
- Matrix4x4_FromArrayDoubleGL(&backend_projectmatrix, m);
-}
-
-static void GL_BuildOrtho(double m[16], double left, double right, double bottom, double top, double zNear, double zFar)