diff --git a/src/hardware/hw_clip.c b/src/hardware/hw_clip.c index a194d3e95..32b41d8a2 100644 --- a/src/hardware/hw_clip.c +++ b/src/hardware/hw_clip.c @@ -320,12 +320,12 @@ void gld_clipper_Clear(void) #define RMUL (1.6f/1.333333f) -angle_t gld_FrustumAngle(void) +angle_t gld_FrustumAngle(angle_t tiltangle) { double floatangle; angle_t a1; - float tilt = (float)fabs(((double)(int)aimingangle) / ANG1); + float tilt = (float)fabs(((double)(int)tiltangle) / ANG1); // NEWCLIP TODO: SRB2CBTODO: make a global render_fov for this function @@ -334,12 +334,10 @@ angle_t gld_FrustumAngle(void) float render_multiplier = 64.0f / render_fovratio / RMUL; if (tilt > 90.0f) - { tilt = 90.0f; - } // If the pitch is larger than this you can look all around at a FOV of 90 - if (abs((signed)aimingangle) > 46 * ANG1) + if (abs((signed)tiltangle) > 46 * ANG1) return 0xffffffff; // ok, this is a gross hack that barely works... diff --git a/src/hardware/hw_clip.h b/src/hardware/hw_clip.h index 3ba26e5e5..27a2ed1ef 100644 --- a/src/hardware/hw_clip.h +++ b/src/hardware/hw_clip.h @@ -17,7 +17,7 @@ boolean gld_clipper_SafeCheckRange(angle_t startAngle, angle_t endAngle); void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle); void gld_clipper_Clear(void); -angle_t gld_FrustumAngle(void); +angle_t gld_FrustumAngle(angle_t tiltangle); #ifdef HAVE_SPHEREFRUSTRUM void gld_FrustrumSetup(void); boolean gld_SphereInFrustum(float x, float y, float z, float radius); diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 6fea75bee..788661588 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -157,6 +157,7 @@ typedef struct #ifdef USE_FTRANSFORM_MIRROR boolean mirror; // SRB2Kart: Encore Mode #endif + boolean shearing; // 14042019 } FTransform; // Transformed vector, as passed to HWR API diff --git a/src/hardware/hw_drv.h b/src/hardware/hw_drv.h index b7f4b4b03..4f4f2b1d1 100644 --- a/src/hardware/hw_drv.h +++ b/src/hardware/hw_drv.h @@ -48,7 +48,7 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value); //Hurdler: added for new development EXPORT void HWRAPI(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, FSurfaceInfo *Surface); EXPORT void HWRAPI(CreateModelVBOs) (model_t *model); -EXPORT void HWRAPI(SetTransform) (FTransform *ptransform); +EXPORT void HWRAPI(SetTransform) (FTransform *ptransform, angle_t viewaiming); EXPORT INT32 HWRAPI(GetTextureUsed) (void); EXPORT void HWRAPI(FlushScreenTextures) (void); diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 3a688cb5b..5b30df0cf 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -118,6 +118,7 @@ FTransform atransform; // Float variants of viewx, viewy, viewz, etc. static float gr_viewx, gr_viewy, gr_viewz; static float gr_viewsin, gr_viewcos; +static angle_t gr_aimingangle; static INT32 drawcount = 0; @@ -3843,9 +3844,10 @@ void HWR_RenderDrawNodes(void) } //i++ } // loop++ - HWD.pfnSetTransform(&atransform); - HWD.pfnSetShader(0); // Okay! Let's draw it all! Woo! + HWD.pfnSetTransform(&atransform, aimingangle); + HWD.pfnSetShader(0); + for (i = 0; i < p; i++) { if (sortnode[sortindex[i]].plane) @@ -4464,7 +4466,19 @@ static void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox) atransform.scaley = (float)vid.width/vid.height; atransform.scalez = 1; - atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); + // 14042019 + if (!cv_grshearing.value) + { + gr_aimingangle = aimingangle; + atransform.shearing = false; + } + else + { + gr_aimingangle = 0; + atransform.shearing = true; + } + + atransform.anglex = (float)(gr_aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); atransform.fovxangle = fpov; // Tails @@ -4492,7 +4506,7 @@ static void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox) if (skybox) drewsky = true; - a1 = gld_FrustumAngle(); + a1 = gld_FrustumAngle(gr_aimingangle); gld_clipper_Clear(); gld_clipper_SafeAddClipRange(viewangle + a1, viewangle - a1); #ifdef HAVE_SPHEREFRUSTRUM @@ -4500,7 +4514,7 @@ static void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox) #endif // Set transform and shader - HWD.pfnSetTransform(&atransform); + HWD.pfnSetTransform(&atransform, aimingangle); HWD.pfnSetShader(0); // Check for shaders @@ -4529,7 +4543,7 @@ static void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox) HWR_RenderDrawNodes(); // Unset transform and shader - HWD.pfnSetTransform(NULL); + HWD.pfnSetTransform(NULL, 0.0f); HWD.pfnUnSetShader(); // Disable fog diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index 6ed5893f7..04f10f123 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -127,6 +127,7 @@ void HWR_CorrectSWTricks(void); // Console variables extern consvar_t cv_grshaders; +extern consvar_t cv_grshearing; extern consvar_t cv_grfov; extern consvar_t cv_grmd2; extern consvar_t cv_grfog; diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 5866e5716..37c6c74ac 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -185,8 +185,6 @@ FUNCPRINTF void GL_DBG_Printf(const char *format, ...) #define pglEnable glEnable #define pglDisable glDisable #define pglGetFloatv glGetFloatv -//glGetIntegerv -//glGetString /* Depth Buffer */ #define pglClearDepth glClearDepth @@ -253,7 +251,6 @@ FUNCPRINTF void GL_DBG_Printf(const char *format, ...) /* Miscellaneous */ typedef void (APIENTRY * PFNglClearColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); static PFNglClearColor pglClearColor; -//glClear typedef void (APIENTRY * PFNglColorMask) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); static PFNglColorMask pglColorMask; typedef void (APIENTRY * PFNglAlphaFunc) (GLenum func, GLclampf ref); @@ -272,8 +269,6 @@ typedef void (APIENTRY * PFNglDisable) (GLenum cap); static PFNglDisable pglDisable; typedef void (APIENTRY * PFNglGetFloatv) (GLenum pname, GLfloat *params); static PFNglGetFloatv pglGetFloatv; -//glGetIntegerv -//glGetString /* Depth Buffer */ typedef void (APIENTRY * PFNglClearDepth) (GLclampd depth); @@ -2183,7 +2178,7 @@ EXPORT void HWRAPI(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, // -----------------+ // SetTransform : // -----------------+ -EXPORT void HWRAPI(SetTransform) (FTransform *stransform) +EXPORT void HWRAPI(SetTransform) (FTransform *stransform, angle_t viewaiming) { static boolean special_splitscreen; pglLoadIdentity(); @@ -2204,12 +2199,27 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform) else pglScalef(stransform->scalex, stransform->scaley, -stransform->scalez); + pglMatrixMode(GL_MODELVIEW); pglRotatef(stransform->anglex, 1.0f, 0.0f, 0.0f); pglRotatef(stransform->angley+270.0f, 0.0f, 1.0f, 0.0f); pglTranslatef(-stransform->x, -stransform->z, -stransform->y); pglMatrixMode(GL_PROJECTION); pglLoadIdentity(); + + // jimita 14042019 + // Simulate Software's y-shearing + // https://zdoom.org/wiki/Y-shearing + if (stransform->shearing) + { + float tilt = (float)(viewaiming>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); + if (tilt >= 270.0f) + tilt = -(90.0f - (tilt - 270.0f)); + tilt /= 24.0f; // ????????? + + pglTranslatef(0.0f, -tilt, 0.0f); + } + fovx90 = stransform->fovxangle > 0.0f && fabsf(stransform->fovxangle - 90.0f) < 0.5f; special_splitscreen = (stransform->splitscreen && fovx90); if (special_splitscreen) diff --git a/src/hardware/r_opengl/r_opengl.h b/src/hardware/r_opengl/r_opengl.h index d74b9445a..3380bdcbc 100644 --- a/src/hardware/r_opengl/r_opengl.h +++ b/src/hardware/r_opengl/r_opengl.h @@ -71,7 +71,6 @@ boolean SetupGLfunc(void); void SetupGLFunc4(void); void Flush(void); INT32 isExtAvailable(const char *extension, const GLubyte *start); -int SetupPixelFormat(INT32 WantColorBits, INT32 WantStencilBits, INT32 WantDepthBits); void SetModelView(GLint w, GLint h); void SetStates(void); #ifdef USE_PALETTED_TEXTURE diff --git a/src/r_main.c b/src/r_main.c index bada24e48..9c143d488 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1395,6 +1395,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_grsoftwarefog); CV_RegisterVar(&cv_grfogdensity); CV_RegisterVar(&cv_grmd2); + CV_RegisterVar(&cv_grshearing); CV_RegisterVar(&cv_grshaders); #endif diff --git a/src/v_video.c b/src/v_video.c index bdebc06b1..b341076c4 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -72,9 +72,9 @@ consvar_t cv_grgammagreen = {"gr_gammagreen", "127", CV_SAVE|CV_CALL, grgamma_co consvar_t cv_grgammablue = {"gr_gammablue", "127", CV_SAVE|CV_CALL, grgamma_cons_t, CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grshearing = {"gr_shearing", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}}; -// console variables in development consvar_t cv_grmd2 = {"gr_md2", "Off", CV_SAVE, CV_MD2, NULL, 0, NULL, NULL, 0, 0, NULL}; #endif