mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-25 05:51:01 +00:00
Add "horplus" cvar to get Hor+ behavior with default FOV
If "horplus" is set, the "fov" cvar is interpreted as the horizontal FOV in a 4:3 screen, and is adapted automatically to the current screen aspect ratio accordingly. If not set, use the old Vert- approach. In addition, "horplus" can also be set from the video menu by selecting the "Auto" option for aspect ratio, which also resets the FOV value to the standard 90 degrees. Finally, add a 5:4 aspect ratio (1280x1024) and correct the 16:9 angle slightly.
This commit is contained in:
parent
a9bea1ede8
commit
74beca0d11
4 changed files with 85 additions and 12 deletions
|
@ -24,6 +24,7 @@
|
||||||
* =======================================================================
|
* =======================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
#include "header/client.h"
|
#include "header/client.h"
|
||||||
|
|
||||||
extern struct model_s *cl_mod_powerscreen;
|
extern struct model_s *cl_mod_powerscreen;
|
||||||
|
@ -724,6 +725,28 @@ CL_AddViewWeapon(player_state_t *ps, player_state_t *ops)
|
||||||
V_AddEntity(&gun);
|
V_AddEntity(&gun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Adapts a 4:3 aspect FOV to the current aspect (Hor+)
|
||||||
|
*/
|
||||||
|
static inline float
|
||||||
|
AdaptFov(float fov, float w, float h)
|
||||||
|
{
|
||||||
|
static const float pi = M_PI; /* float instead of double */
|
||||||
|
|
||||||
|
if (w <= 0 || h <= 0)
|
||||||
|
return fov;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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(fov / 360.0f * pi) * (w / h * 0.75f)) / pi * 360.0f);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets cl.refdef view values
|
* Sets cl.refdef view values
|
||||||
*/
|
*/
|
||||||
|
@ -731,7 +754,7 @@ void
|
||||||
CL_CalcViewValues(void)
|
CL_CalcViewValues(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
float lerp, backlerp;
|
float lerp, backlerp, ifov;
|
||||||
frame_t *oldframe;
|
frame_t *oldframe;
|
||||||
player_state_t *ps, *ops;
|
player_state_t *ps, *ops;
|
||||||
|
|
||||||
|
@ -820,7 +843,15 @@ CL_CalcViewValues(void)
|
||||||
AngleVectors(cl.refdef.viewangles, cl.v_forward, cl.v_right, cl.v_up);
|
AngleVectors(cl.refdef.viewangles, cl.v_forward, cl.v_right, cl.v_up);
|
||||||
|
|
||||||
/* interpolate field of view */
|
/* interpolate field of view */
|
||||||
cl.refdef.fov_x = ops->fov + lerp * (ps->fov - ops->fov);
|
ifov = ops->fov + lerp * (ps->fov - ops->fov);
|
||||||
|
if (horplus->value)
|
||||||
|
{
|
||||||
|
cl.refdef.fov_x = AdaptFov(ifov, cl.refdef.width, cl.refdef.height);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cl.refdef.fov_x = ifov;
|
||||||
|
}
|
||||||
|
|
||||||
/* don't interpolate blend color */
|
/* don't interpolate blend color */
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
|
|
|
@ -87,6 +87,7 @@ cvar_t *name;
|
||||||
cvar_t *skin;
|
cvar_t *skin;
|
||||||
cvar_t *rate;
|
cvar_t *rate;
|
||||||
cvar_t *fov;
|
cvar_t *fov;
|
||||||
|
cvar_t *horplus;
|
||||||
cvar_t *msg;
|
cvar_t *msg;
|
||||||
cvar_t *hand;
|
cvar_t *hand;
|
||||||
cvar_t *gender;
|
cvar_t *gender;
|
||||||
|
@ -538,6 +539,7 @@ CL_InitLocal(void)
|
||||||
msg = Cvar_Get("msg", "1", CVAR_USERINFO | CVAR_ARCHIVE);
|
msg = Cvar_Get("msg", "1", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
hand = Cvar_Get("hand", "0", CVAR_USERINFO | CVAR_ARCHIVE);
|
hand = Cvar_Get("hand", "0", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
fov = Cvar_Get("fov", "90", CVAR_USERINFO | CVAR_ARCHIVE);
|
fov = Cvar_Get("fov", "90", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
|
horplus = Cvar_Get("horplus", "1", CVAR_ARCHIVE);
|
||||||
gender = Cvar_Get("gender", "male", CVAR_USERINFO | CVAR_ARCHIVE);
|
gender = Cvar_Get("gender", "male", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
gender_auto = Cvar_Get("gender_auto", "1", CVAR_ARCHIVE);
|
gender_auto = Cvar_Get("gender_auto", "1", CVAR_ARCHIVE);
|
||||||
gender->modified = false;
|
gender->modified = false;
|
||||||
|
|
|
@ -287,6 +287,7 @@ extern cvar_t *cl_lightlevel;
|
||||||
extern cvar_t *cl_paused;
|
extern cvar_t *cl_paused;
|
||||||
extern cvar_t *cl_timedemo;
|
extern cvar_t *cl_timedemo;
|
||||||
extern cvar_t *cl_vwep;
|
extern cvar_t *cl_vwep;
|
||||||
|
extern cvar_t *horplus;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|
|
@ -113,8 +113,24 @@ ApplyChanges(void *unused)
|
||||||
Cvar_SetValue("gl_mode", -1);
|
Cvar_SetValue("gl_mode", -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fov */
|
/* horplus */
|
||||||
if (s_aspect_list.curvalue == 0)
|
if (s_aspect_list.curvalue == 0)
|
||||||
|
{
|
||||||
|
if (horplus->value != 1)
|
||||||
|
{
|
||||||
|
Cvar_SetValue("horplus", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (horplus->value != 0)
|
||||||
|
{
|
||||||
|
Cvar_SetValue("horplus", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fov */
|
||||||
|
if (s_aspect_list.curvalue == 0 || s_aspect_list.curvalue == 1)
|
||||||
{
|
{
|
||||||
if (fov->value != 90)
|
if (fov->value != 90)
|
||||||
{
|
{
|
||||||
|
@ -122,7 +138,15 @@ ApplyChanges(void *unused)
|
||||||
Cvar_SetValue("fov", 90);
|
Cvar_SetValue("fov", 90);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (s_aspect_list.curvalue == 1)
|
else if (s_aspect_list.curvalue == 2)
|
||||||
|
{
|
||||||
|
if (fov->value != 86)
|
||||||
|
{
|
||||||
|
/* Restarts automatically */
|
||||||
|
Cvar_SetValue("fov", 86);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (s_aspect_list.curvalue == 3)
|
||||||
{
|
{
|
||||||
if (fov->value != 100)
|
if (fov->value != 100)
|
||||||
{
|
{
|
||||||
|
@ -130,12 +154,12 @@ ApplyChanges(void *unused)
|
||||||
Cvar_SetValue("fov", 100);
|
Cvar_SetValue("fov", 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (s_aspect_list.curvalue == 2)
|
else if (s_aspect_list.curvalue == 4)
|
||||||
{
|
{
|
||||||
if (fov->value != 105)
|
if (fov->value != 106)
|
||||||
{
|
{
|
||||||
/* Restarts automatically */
|
/* Restarts automatically */
|
||||||
Cvar_SetValue("fov", 105);
|
Cvar_SetValue("fov", 106);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +209,9 @@ VID_MenuInit(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *aspect_names[] = {
|
static const char *aspect_names[] = {
|
||||||
|
"Auto",
|
||||||
"4:3",
|
"4:3",
|
||||||
|
"5:4",
|
||||||
"16:10",
|
"16:10",
|
||||||
"16:9",
|
"16:9",
|
||||||
"Custom",
|
"Custom",
|
||||||
|
@ -219,27 +245,40 @@ VID_MenuInit(void)
|
||||||
CVAR_USERINFO | CVAR_ARCHIVE);
|
CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!horplus)
|
||||||
|
{
|
||||||
|
horplus = Cvar_Get("horplus", "1", CVAR_ARCHIVE);
|
||||||
|
}
|
||||||
|
|
||||||
if (!fov)
|
if (!fov)
|
||||||
{
|
{
|
||||||
fov = Cvar_Get("fov", "90", CVAR_USERINFO | CVAR_ARCHIVE);
|
fov = Cvar_Get("fov", "90", CVAR_USERINFO | CVAR_ARCHIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fov->value == 90)
|
if (horplus->value == 1)
|
||||||
{
|
{
|
||||||
s_aspect_list.curvalue = 0;
|
s_aspect_list.curvalue = 0;
|
||||||
}
|
}
|
||||||
else if (fov->value == 100)
|
else if (fov->value == 90)
|
||||||
{
|
{
|
||||||
s_aspect_list.curvalue = 1;
|
s_aspect_list.curvalue = 1;
|
||||||
}
|
}
|
||||||
else if (fov->value == 105)
|
else if (fov->value == 86)
|
||||||
{
|
{
|
||||||
s_aspect_list.curvalue = 2;
|
s_aspect_list.curvalue = 2;
|
||||||
}
|
}
|
||||||
else
|
else if (fov->value == 100)
|
||||||
{
|
{
|
||||||
s_aspect_list.curvalue = 3;
|
s_aspect_list.curvalue = 3;
|
||||||
}
|
}
|
||||||
|
else if (fov->value == 106)
|
||||||
|
{
|
||||||
|
s_aspect_list.curvalue = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s_aspect_list.curvalue = 5;
|
||||||
|
}
|
||||||
|
|
||||||
/* custom mode */
|
/* custom mode */
|
||||||
if (gl_mode->value >= 0)
|
if (gl_mode->value >= 0)
|
||||||
|
|
Loading…
Reference in a new issue