diff --git a/ref/gl/gl_local.h b/ref/gl/gl_local.h index 4b8cb8a1..2d243b6a 100644 --- a/ref/gl/gl_local.h +++ b/ref/gl/gl_local.h @@ -124,6 +124,8 @@ typedef struct gltexture_s typedef struct { + ref_viewpass_t rvp; + int params; // rendering parameters qboolean drawWorld; // ignore world for drawing PlayerModel @@ -131,13 +133,10 @@ typedef struct qboolean onlyClientDraw; // disabled by client request qboolean drawOrtho; // draw world as orthogonal projection - float fov_x, fov_y; // current view fov - cl_entity_t *currententity; model_t *currentmodel; cl_entity_t *currentbeam; // same as above but for beams - int viewport[4]; gl_frustum_t frustum; mleaf_t *viewleaf; diff --git a/ref/gl/gl_rmain.c b/ref/gl/gl_rmain.c index c73ab9bc..52789c69 100644 --- a/ref/gl/gl_rmain.c +++ b/ref/gl/gl_rmain.c @@ -370,7 +370,7 @@ void R_SetupFrustum( void ) } else { - GL_FrustumInitProj( &RI.frustum, 0.0f, R_GetFarClip(), RI.fov_x, RI.fov_y ); // NOTE: we ignore nearplane here (mirrors only) + GL_FrustumInitProj( &RI.frustum, 0.0f, R_GetFarClip(), RI.rvp.fov_x, RI.rvp.fov_y ); // NOTE: we ignore nearplane here (mirrors only) } } @@ -395,10 +395,10 @@ static void R_SetupProjectionMatrix( matrix4x4 m ) zNear = 4.0f; zFar = Q_max( 256.0f, RI.farClip ); - yMax = zNear * tan( RI.fov_y * M_PI_F / 360.0f ); + yMax = zNear * tan( RI.rvp.fov_y * M_PI_F / 360.0f ); yMin = -yMax; - xMax = zNear * tan( RI.fov_x * M_PI_F / 360.0f ); + xMax = zNear * tan( RI.rvp.fov_x * M_PI_F / 360.0f ); xMin = -xMax; if( tr.rotation & 1 ) @@ -560,10 +560,10 @@ void R_SetupGL( qboolean set_gl_state ) int x, x2, y, y2; // set up viewport (main, playersetup) - x = floor( RI.viewport[0] * gpGlobals->width / gpGlobals->width ); - x2 = ceil(( RI.viewport[0] + RI.viewport[2] ) * gpGlobals->width / gpGlobals->width ); - y = floor( gpGlobals->height - RI.viewport[1] * gpGlobals->height / gpGlobals->height ); - y2 = ceil( gpGlobals->height - ( RI.viewport[1] + RI.viewport[3] ) * gpGlobals->height / gpGlobals->height ); + x = floor( RI.rvp.viewport[0] * gpGlobals->width / gpGlobals->width ); + x2 = ceil(( RI.rvp.viewport[0] + RI.rvp.viewport[2] ) * gpGlobals->width / gpGlobals->width ); + y = floor( gpGlobals->height - RI.rvp.viewport[1] * gpGlobals->height / gpGlobals->height ); + y2 = ceil( gpGlobals->height - ( RI.rvp.viewport[1] + RI.rvp.viewport[3] ) * gpGlobals->height / gpGlobals->height ); if( tr.rotation & 1 ) pglViewport( y2, x, y - y2, x2 - x ); @@ -572,7 +572,7 @@ void R_SetupGL( qboolean set_gl_state ) else { // envpass, mirrorpass - pglViewport( RI.viewport[0], RI.viewport[1], RI.viewport[2], RI.viewport[3] ); + pglViewport( RI.rvp.viewport[0], RI.rvp.viewport[1], RI.rvp.viewport[2], RI.rvp.viewport[3] ); } pglMatrixMode( GL_PROJECTION ); @@ -1080,6 +1080,8 @@ set initial params for renderer */ void R_SetupRefParams( const ref_viewpass_t *rvp ) { + RI.rvp = *rvp; + RI.params = RP_NONE; RI.drawWorld = FBitSet( rvp->flags, RF_DRAW_WORLD ); RI.onlyClientDraw = FBitSet( rvp->flags, RF_ONLY_CLIENTDRAW ); @@ -1095,16 +1097,6 @@ void R_SetupRefParams( const ref_viewpass_t *rvp ) RI.drawOrtho = false; } - // setup viewport - RI.viewport[0] = rvp->viewport[0]; - RI.viewport[1] = rvp->viewport[1]; - RI.viewport[2] = rvp->viewport[2]; - RI.viewport[3] = rvp->viewport[3]; - - // calc FOV - RI.fov_x = rvp->fov_x; - RI.fov_y = rvp->fov_y; - VectorCopy( rvp->vieworigin, RI.vieworg ); VectorCopy( rvp->viewangles, RI.viewangles ); VectorCopy( rvp->vieworigin, RI.pvsorigin ); diff --git a/ref/gl/gl_sprite.c b/ref/gl/gl_sprite.c index ecb2a6c2..63d63aec 100644 --- a/ref/gl/gl_sprite.c +++ b/ref/gl/gl_sprite.c @@ -270,9 +270,9 @@ static qboolean R_SpriteOccluded( cl_entity_t *e, vec3_t origin, float *pscale ) TriWorldToScreen( origin, v ); - if( v[0] < RI.viewport[0] || v[0] > RI.viewport[0] + RI.viewport[2] ) + if( v[0] < RI.rvp.viewport[0] || v[0] > RI.rvp.viewport[0] + RI.rvp.viewport[2] ) return true; // do scissor - if( v[1] < RI.viewport[1] || v[1] > RI.viewport[1] + RI.viewport[3] ) + if( v[1] < RI.rvp.viewport[1] || v[1] > RI.rvp.viewport[1] + RI.rvp.viewport[3] ) return true; // do scissor blend = R_SpriteGlowBlend( origin, e->curstate.rendermode, e->curstate.renderfx, pscale ); diff --git a/ref/gl/gl_triapi.c b/ref/gl/gl_triapi.c index 59828eb4..6f580f0b 100644 --- a/ref/gl/gl_triapi.c +++ b/ref/gl/gl_triapi.c @@ -226,10 +226,10 @@ int TriWorldToScreen( const float *world, float *screen ) retval = R_WorldToScreen( world, screen ); - screen[0] = 0.5f * screen[0] * (float)RI.viewport[2]; - screen[1] = -0.5f * screen[1] * (float)RI.viewport[3]; - screen[0] += 0.5f * (float)RI.viewport[2]; - screen[1] += 0.5f * (float)RI.viewport[3]; + screen[0] = 0.5f * screen[0] * (float)RI.rvp.viewport[2]; + screen[1] = -0.5f * screen[1] * (float)RI.rvp.viewport[3]; + screen[0] += 0.5f * (float)RI.rvp.viewport[2]; + screen[1] += 0.5f * (float)RI.rvp.viewport[3]; return retval; }