Shitcan the nausea-inducing r_projectionhacks mode 2.

git-svn-id: https://svn.eduke32.com/eduke32@5241 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2015-05-26 00:48:04 +00:00
parent 5064e8b8cd
commit 008d845558

View file

@ -507,22 +507,14 @@ void calc_and_apply_fog_factor(int32_t tile, int32_t shade, int32_t vis, int32_t
static float get_projhack_ratio(void) static float get_projhack_ratio(void)
{ {
float rv = 1.f; if (glprojectionhacks)
if (glprojectionhacks == 1)
{ {
float const mul = (gshang * gshang); float const mul = (gshang * gshang);
rv = 1.05f + mul * mul * mul * mul; return 1.05f + mul * mul * mul * mul;
}
else if (glprojectionhacks == 2)
{
float const abs_shang = Bfabsf(gshang);
rv = (abs_shang > 0.7f) ?
1.05f + 4.f * (abs_shang - 0.7f) : 1.f;
} }
// No projection hacks (legacy or new-aspect) // No projection hacks (legacy or new-aspect)
return rv; return 1.f;
} }
static void resizeglcheck(void) static void resizeglcheck(void)
@ -570,7 +562,7 @@ static void resizeglcheck(void)
{ {
const int32_t ourxdimen = (windowx2-windowx1+1); const int32_t ourxdimen = (windowx2-windowx1+1);
float ratio = get_projhack_ratio(); float ratio = get_projhack_ratio();
const int32_t fovcorrect = (ratio==0) ? 0 : (int32_t)(ourxdimen*ratio - ourxdimen); const int32_t fovcorrect = (int32_t)(ourxdimen*ratio - ourxdimen);
ratio = 1.f/ratio; ratio = 1.f/ratio;
@ -2124,42 +2116,34 @@ skip: ;
void polymost_editorfunc(void) void polymost_editorfunc(void)
{ {
vec3_t v; const float ratio = 1.f/get_projhack_ratio();
vec3f_t o, o2;
int32_t cz, fz; vec3f_t tvect = { (searchx - ghalfx) * ratio, (searchy - ghoriz) * ratio, ghalfx };
hitdata_t hit;
vec3_t vect;
const float ratio = get_projhack_ratio();
o2.x = (searchx-ghalfx)/ratio;
o2.y = (searchy-ghoriz)/ratio; // ghoriz is (ydimen>>1) here
o2.z = ghalfx;
//Tilt rotation //Tilt rotation
o.x = o2.x*gctang + o2.y*gstang; vec3f_t o = { tvect.x * gctang + tvect.y * gstang, tvect.y * gctang - tvect.x * gstang, tvect.z };
o.y = o2.y*gctang - o2.x*gstang;
o.z = o2.z;
//Up/down rotation //Up/down rotation
o2.x = o.z*gchang - o.y*gshang; tvect.x = o.z*gchang - o.y*gshang;
o2.y = o.x; tvect.y = o.x;
o2.z = o.y*gchang + o.z*gshang; tvect.z = o.y*gchang + o.z*gshang;
//Standard Left/right rotation //Standard Left/right rotation
v.x = Blrintf (o2.x*fcosglobalang - o2.y*fsinglobalang); vec3_t v = { Blrintf(tvect.x * fcosglobalang - tvect.y * fsinglobalang),
v.y = Blrintf (o2.x*fsinglobalang + o2.y*fcosglobalang); Blrintf(tvect.x * fsinglobalang + tvect.y * fcosglobalang), Blrintf(tvect.z * 16384.f) };
v.z = Blrintf (o2.z*16384.f);
vect.x = globalposx; vec3_t vect = { globalposx, globalposy, globalposz };
vect.y = globalposy;
vect.z = globalposz; hitdata_t hit;
hitallsprites = 1; hitallsprites = 1;
hitscan((const vec3_t *) &vect, globalcursectnum, //Start position hitscan((const vec3_t *) &vect, globalcursectnum, //Start position
v.x>>10, v.y>>10, v.z>>6, &hit, 0xffff0030); v.x>>10, v.y>>10, v.z>>6, &hit, 0xffff0030);
if (hit.sect != -1) // if hitsect is -1, hitscan overflowed somewhere if (hit.sect != -1) // if hitsect is -1, hitscan overflowed somewhere
{ {
int32_t cz, fz;
getzsofslope(hit.sect, hit.pos.x, hit.pos.y, &cz, &fz); getzsofslope(hit.sect, hit.pos.x, hit.pos.y, &cz, &fz);
hitallsprites = 0; hitallsprites = 0;
@ -2171,7 +2155,6 @@ void polymost_editorfunc(void)
searchbottomwall = searchwall = hit.wall; searchstat = 0; searchbottomwall = searchwall = hit.wall; searchstat = 0;
if (wall[hit.wall].nextwall >= 0) if (wall[hit.wall].nextwall >= 0)
{ {
int32_t cz, fz;
getzsofslope(wall[hit.wall].nextsector, hit.pos.x, hit.pos.y, &cz, &fz); getzsofslope(wall[hit.wall].nextsector, hit.pos.x, hit.pos.y, &cz, &fz);
if (hit.pos.z > fz) if (hit.pos.z > fz)
{ {
@ -2190,7 +2173,6 @@ void polymost_editorfunc(void)
else if (hit.sprite >= 0) { searchwall = hit.sprite; searchstat = 3; } else if (hit.sprite >= 0) { searchwall = hit.sprite; searchstat = 3; }
else else
{ {
int32_t cz, fz;
getzsofslope(hit.sect, hit.pos.x, hit.pos.y, &cz, &fz); getzsofslope(hit.sect, hit.pos.x, hit.pos.y, &cz, &fz);
if ((hit.pos.z<<1) < cz+fz) searchstat = 1; else searchstat = 2; if ((hit.pos.z<<1) < cz+fz) searchstat = 1; else searchstat = 2;
//if (vz < 0) searchstat = 1; else searchstat = 2; //Won't work for slopes :/ //if (vz < 0) searchstat = 1; else searchstat = 2; //Won't work for slopes :/
@ -5627,7 +5609,7 @@ void polymost_initosdfuncs(void)
{ "r_vbocount","sets the number of Vertex Buffer Objects to use when drawing models",(void *) &r_vbocount, CVAR_INT, 1, 256 }, { "r_vbocount","sets the number of Vertex Buffer Objects to use when drawing models",(void *) &r_vbocount, CVAR_INT, 1, 256 },
{ "r_vbos"," enable/disable using Vertex Buffer Objects when drawing models",(void *) &r_vbos, CVAR_BOOL, 0, 1 }, { "r_vbos"," enable/disable using Vertex Buffer Objects when drawing models",(void *) &r_vbos, CVAR_BOOL, 0, 1 },
{ "r_vertexarrays","enable/disable using vertex arrays when drawing models",(void *) &r_vertexarrays, CVAR_BOOL, 0, 1 }, { "r_vertexarrays","enable/disable using vertex arrays when drawing models",(void *) &r_vertexarrays, CVAR_BOOL, 0, 1 },
{ "r_projectionhack", "enable/disable projection hack", (void *) &glprojectionhacks, CVAR_INT, 0, 2 }, { "r_projectionhack", "enable/disable projection hack", (void *) &glprojectionhacks, CVAR_INT, 0, 1 },
{ "r_wspr_offset", "anti-fighting offset for wall sprites", (void *) &r_wspr_offset, CVAR_FLOAT, 0, 1 }, { "r_wspr_offset", "anti-fighting offset for wall sprites", (void *) &r_wspr_offset, CVAR_FLOAT, 0, 1 },
{ "r_wspr_variance", "anti-fighting offset variance for wall sprites", (void *) &r_wspr_variance, CVAR_FLOAT, 0, 1 }, { "r_wspr_variance", "anti-fighting offset variance for wall sprites", (void *) &r_wspr_variance, CVAR_FLOAT, 0, 1 },