From aa4cfe91b9ec4b37c00bee373d8adc8f793fb238 Mon Sep 17 00:00:00 2001 From: Spoike Date: Mon, 21 Jun 2021 13:44:14 +0000 Subject: [PATCH] Fix oriented sprites - quake draws them backwards. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5893 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/renderer.c | 6 ++++++ engine/common/fs.c | 4 ++-- engine/gl/gl_alias.c | 27 +++++++++++++++++++++++++-- engine/gl/gl_model.c | 2 +- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 851c36f47..6b894bd7c 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -231,6 +231,9 @@ cvar_t r_menutint = CVARF ("r_menutint", "0.68 0.4 0.13", cvar_t r_netgraph = CVARD ("r_netgraph", "0", "Displays a graph of packet latency. A value of 2 will give additional info about what sort of data is being received from the server."); extern cvar_t r_lerpmuzzlehack; extern cvar_t mod_h2holey_bugged, mod_halftexel, mod_nomipmap; +#ifdef SPRMODELS +cvar_t r_sprite_backfacing = CVARD ("r_sprite_backfacing", "0", "Make oriented sprites face backwards relative to their orientation, for compat with q1."); +#endif cvar_t r_nolerp = CVARF ("r_nolerp", "0", CVAR_ARCHIVE); cvar_t r_noframegrouplerp = CVARF ("r_noframegrouplerp", "0", CVAR_ARCHIVE); cvar_t r_nolightdir = CVARF ("r_nolightdir", "0", CVAR_ARCHIVE); @@ -587,6 +590,9 @@ void GLRenderer_Init(void) Cvar_Register (&mod_h2holey_bugged, GLRENDEREROPTIONS); Cvar_Register (&mod_halftexel, GLRENDEREROPTIONS); Cvar_Register (&mod_nomipmap, GLRENDEREROPTIONS); +#endif +#ifdef SPRMODELS + Cvar_Register (&r_sprite_backfacing, GLRENDEREROPTIONS); #endif Cvar_Register (&r_lerpmuzzlehack, GLRENDEREROPTIONS); Cvar_Register (&r_noframegrouplerp, GLRENDEREROPTIONS); diff --git a/engine/common/fs.c b/engine/common/fs.c index 9fad02b01..181ea2fa4 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -3794,7 +3794,7 @@ void COM_Gamedir (const char *dir, const struct gamepacks *packagespaths) /*quake requires a few settings for compatibility*/ #define QRPCOMPAT "set cl_cursor_scale 0.2\nset cl_cursor_bias_x 7.5\nset cl_cursor_bias_y 0.8\n" #define QUAKESPASMSUCKS "set mod_h2holey_bugged 1\n" -#define QCFG "set v_gammainverted 1\nset con_stayhidden 0\nset com_parseutf8 0\nset allow_download_pakcontents 1\nset allow_download_refpackages 0\nset r_meshpitch -1\nset sv_bigcoords \"\"\nmap_autoopenportals 1\n" "sv_port "STRINGIFY(PORT_QWSERVER)" "STRINGIFY(PORT_NQSERVER)"\n" ZFIXHACK EZQUAKECOMPETITIVE QRPCOMPAT QUAKESPASMSUCKS +#define QCFG "set v_gammainverted 1\nset con_stayhidden 0\nset com_parseutf8 0\nset allow_download_pakcontents 1\nset allow_download_refpackages 0\nset r_meshpitch -1\nr_sprite_backfacing 1\nset sv_bigcoords \"\"\nmap_autoopenportals 1\n" "sv_port "STRINGIFY(PORT_QWSERVER)" "STRINGIFY(PORT_NQSERVER)"\n" ZFIXHACK EZQUAKECOMPETITIVE QRPCOMPAT QUAKESPASMSUCKS /*NetQuake reconfiguration, to make certain people feel more at home...*/ #define NQCFG "//disablehomedir 1\n//mainconfig ftenq\ncfg_save_auto 1\n" QCFG "set sv_nqplayerphysics 1\nset cl_loopbackprotocol auto\ncl_sbar 1\nset plug_sbar 0\nset sv_port "STRINGIFY(PORT_NQSERVER)"\ncl_defaultport "STRINGIFY(PORT_NQSERVER)"\nset m_preset_chosen 1\nset vid_wait 1\nset cl_demoreel 1\n" #define SPASMCFG NQCFG "fps_preset builtin_spasm\nset cl_demoreel 0\ncl_sbar 2\nset gl_load24bit 1\n" @@ -3810,7 +3810,7 @@ void COM_Gamedir (const char *dir, const struct gamepacks *packagespaths) /*some modern non-compat settings*/ #define DMFCFG "set com_parseutf8 1\npm_airstep 1\nsv_demoExtensions 1\n" /*set some stuff so our regular qw client appears more like hexen2. sv_mintic is required to 'fix' the ravenstaff so that its projectiles don't impact upon each other*/ -#define HEX2CFG "set v_gammainverted 1\nset com_parseutf8 -1\nset gl_font gfx/hexen2\nset in_builtinkeymap 0\nset_calc cl_playerclass int (random * 5) + 1\nset cl_forwardspeed 200\nset cl_backspeed 200\ncl_sidespeed 225\nset sv_maxspeed 640\ncl_run 0\nset watervis 1\nset r_lavaalpha 1\nset r_lavastyle -2\nset r_wateralpha 0.5\nset sv_pupglow 1\ngl_shaftlight 0.5\nsv_mintic 0.015\nset r_meshpitch -1\nset r_meshroll -1\nset mod_warnmodels 0\nset cl_model_bobbing 1\nsv_sound_watersplash \"misc/hith2o.wav\"\nsv_sound_land \"fx/thngland.wav\"\nset sv_walkpitch 0\n" +#define HEX2CFG "set v_gammainverted 1\nset com_parseutf8 -1\nset gl_font gfx/hexen2\nset in_builtinkeymap 0\nset_calc cl_playerclass int (random * 5) + 1\nset cl_forwardspeed 200\nset cl_backspeed 200\ncl_sidespeed 225\nset sv_maxspeed 640\ncl_run 0\nset watervis 1\nset r_lavaalpha 1\nset r_lavastyle -2\nset r_wateralpha 0.5\nset sv_pupglow 1\ngl_shaftlight 0.5\nsv_mintic 0.015\nset r_meshpitch -1\nset r_meshroll -1\nr_sprite_backfacing 1\nset mod_warnmodels 0\nset cl_model_bobbing 1\nsv_sound_watersplash \"misc/hith2o.wav\"\nsv_sound_land \"fx/thngland.wav\"\nset sv_walkpitch 0\n" /*yay q2!*/ #define Q2CFG "set v_gammainverted 1\nset com_parseutf8 0\ncom_nogamedirnativecode 0\nset sv_bigcoords 0\nsv_port "STRINGIFY(PORT_Q2SERVER)"\n" /*Q3's ui doesn't like empty model/headmodel/handicap cvars, even if the gamecode copes*/ diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index b6fe63b42..2756773ed 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -40,6 +40,7 @@ typedef struct extern cvar_t gl_part_flame, r_fullbrightSkins, r_fb_models, ruleset_allow_fbmodels; extern cvar_t r_noaliasshadows; extern cvar_t r_lodscale, r_lodbias; +extern cvar_t r_sprite_backfacing; extern cvar_t gl_ati_truform; extern cvar_t r_vertexdlights; @@ -2654,7 +2655,7 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode) sprtype = psprite->type; } - switch(sprtype) + safeswitch(sprtype) { case SPR_ORIENTED: // bullet marks on walls @@ -2662,9 +2663,13 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode) Matrix3_Multiply(e->axis, r_refdef.playerview->vw_axis, spraxis); else memcpy(spraxis, e->axis, sizeof(spraxis)); + if (!r_sprite_backfacing.ival) + VectorNegate(spraxis[1], spraxis[1]); break; case SPR_FACING_UPRIGHT: + //up vector is worldspace up + //side is crossproduct of (org-vieworg),up spraxis[2][0] = 0;spraxis[2][1] = 0;spraxis[2][2]=1; spraxis[1][0] = sprorigin[1] - r_origin[1]; spraxis[1][1] = -(sprorigin[0] - r_origin[0]); @@ -2672,13 +2677,31 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode) VectorNormalize (spraxis[1]); break; case SPR_VP_PARALLEL_UPRIGHT: + //up vector is worldspace up + //side vector matches view spraxis[2][0] = 0;spraxis[2][1] = 0;spraxis[2][2]=1; VectorCopy (vright, spraxis[1]); break; - default: + case SPR_VP_PARALLEL_ORIENTED: + //normal sprite, except rotating with roll angles + { + vec3_t ang; + int i; + float cr,sr; + VectorAngles(e->axis[0], e->axis[2], ang, false); //bah, slow. + cr = cos(ang[2] * M_PI/180); + sr = sin(ang[2]); + for (i=0 ; i<3 ; i++) + { + spraxis[1][i] = vright[i] * cr + vup[i] * sr; + spraxis[2][i] = vright[i] * -sr + vup[i] * cr; + } + } + break; case SPR_VP_PARALLEL: //normal sprite + safedefault: VectorCopy(vup, spraxis[2]); VectorCopy(vright, spraxis[1]); break; diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 1edfb18fe..dfde7b772 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -5887,7 +5887,7 @@ qboolean QDECL Mod_LoadSpriteModel (model_t *mod, void *buffer, size_t fsize) case SPR_FACING_UPRIGHT: case SPR_VP_PARALLEL: case SPR_ORIENTED: -// case SPR_VP_PARALLEL_ORIENTED: + case SPR_VP_PARALLEL_ORIENTED: // case SPRDP_LABEL: // case SPRDP_LABEL_SCALE: // case SPRDP_OVERHEAD: