mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2024-11-10 15:31:39 +00:00
gl_screen.c: some fov_adapt style syncing with uhexen2
git-svn-id: http://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@838 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
parent
b94d90a17a
commit
e82eb5b316
1 changed files with 21 additions and 27 deletions
|
@ -231,26 +231,24 @@ void SCR_CheckDrawCenterString (void)
|
|||
/*
|
||||
====================
|
||||
AdaptFovx
|
||||
|
||||
Adapts a 4:3 horizontal FOV to the current screen size (Hor+).
|
||||
Adapt a 4:3 horizontal FOV to the current screen size using the "Hor+" scaling:
|
||||
2.0 * atan(width / height * 3.0 / 4.0 * tan(fov_x / 2.0))
|
||||
====================
|
||||
*/
|
||||
float AdaptFovx (float fov43, float w, float h)
|
||||
float AdaptFovx (float fov_x, float width, float height)
|
||||
{
|
||||
static const float pi = M_PI; /* float instead of double. */
|
||||
float a, x;
|
||||
|
||||
if (w <= 0 || h <= 0)
|
||||
return fov43;
|
||||
if (fov_x < 1 || fov_x > 179)
|
||||
Sys_Error ("Bad fov: %f", fov_x);
|
||||
|
||||
/*
|
||||
* Formula:
|
||||
*
|
||||
* fov = 2.0 * atan(width / height * 3.0 / 4.0 * tan(fov43 / 2.0))
|
||||
*
|
||||
* The code below is equivalent but precalculates a few values and
|
||||
* converts between degrees and radians when needed.
|
||||
*/
|
||||
return (atanf(tanf(fov43 / 360.0f * pi) * (w / h) * 0.75f) / pi * 360.0f);
|
||||
if (!scr_fov_adapt.value)
|
||||
return fov_x;
|
||||
if ((x = height / width) == 0.75)
|
||||
return fov_x;
|
||||
a = atan(0.75 / x * tan(fov_x / 360 * M_PI));
|
||||
a = a * 360 / M_PI;
|
||||
return a;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -260,15 +258,15 @@ CalcFovy
|
|||
*/
|
||||
float CalcFovy (float fov_x, float width, float height)
|
||||
{
|
||||
float a, x;
|
||||
float a, x;
|
||||
|
||||
if (fov_x < 1 || fov_x > 179)
|
||||
Sys_Error ("Bad fov: %f", fov_x);
|
||||
if (fov_x < 1 || fov_x > 179)
|
||||
Sys_Error ("Bad fov: %f", fov_x);
|
||||
|
||||
x = width/tan(fov_x/360*M_PI);
|
||||
a = atan (height/x);
|
||||
a = a*360/M_PI;
|
||||
return a;
|
||||
x = width / tan(fov_x / 360 * M_PI);
|
||||
a = atan(height / x);
|
||||
a = a * 360 / M_PI;
|
||||
return a;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -323,11 +321,7 @@ static void SCR_CalcRefdef (void)
|
|||
r_refdef.vrect.y = (glheight - sb_lines - r_refdef.vrect.height)/2;
|
||||
//johnfitz
|
||||
|
||||
if (scr_fov_adapt.value)
|
||||
r_refdef.fov_x = AdaptFovx(scr_fov.value, r_refdef.vrect.width, r_refdef.vrect.height);
|
||||
else
|
||||
r_refdef.fov_x = scr_fov.value;
|
||||
r_refdef.fov_x = CLAMP (10, r_refdef.fov_x, 170);
|
||||
r_refdef.fov_x = AdaptFovx(scr_fov.value, r_refdef.vrect.width, r_refdef.vrect.height);
|
||||
r_refdef.fov_y = CalcFovy (r_refdef.fov_x, r_refdef.vrect.width, r_refdef.vrect.height);
|
||||
|
||||
scr_vrect = r_refdef.vrect;
|
||||
|
|
Loading…
Reference in a new issue