From 4e67034d5ab092b41e2eb9683cd20348fc004308 Mon Sep 17 00:00:00 2001 From: hairball Date: Mon, 10 Feb 2014 10:35:01 +0000 Subject: [PATCH 01/21] Add support for x86_64 cross compiling in Travis CI --- .travis.yml | 1 + travis-ci-build.sh | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 4d623137..9d2da385 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ compiler: - gcc - clang - i686-w64-mingw32-gcc + - x86_64-w64-mingw32-gcc script: ./travis-ci-build.sh diff --git a/travis-ci-build.sh b/travis-ci-build.sh index d5119431..97b49699 100755 --- a/travis-ci-build.sh +++ b/travis-ci-build.sh @@ -8,6 +8,11 @@ if [ "$CC" = "i686-w64-mingw32-gcc" ]; then export ARCH=x86 export CC= haveExternalLibs=0 +elif [ "$CC" = "x86_64-w64-mingw32-gcc" ]; then + export PLATFORM=mingw32 + export ARCH=x86_64 + export CC= + haveExternalLibs=0 else haveExternalLibs=1 fi From 7beff8bc7e6192597be56ea7a8c3ae725743f417 Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Tue, 22 Apr 2014 19:50:39 -0700 Subject: [PATCH 02/21] OpenGL2: Remove misleading documentation for gamma cvars. --- opengl2-readme.txt | 92 +++++++--------------------------------------- 1 file changed, 14 insertions(+), 78 deletions(-) diff --git a/opengl2-readme.txt b/opengl2-readme.txt index a08c0611..77721832 100644 --- a/opengl2-readme.txt +++ b/opengl2-readme.txt @@ -18,7 +18,6 @@ compatibility with existing Quake 3 mods. - Texture upsampling. - Advanced materials support. - Advanced shading and specular methods. - - Separate material/light/framebuffer/tonemap gamma. - LATC and BPTC texture compression support. - Screen-space ambient occlusion. @@ -311,29 +310,6 @@ Cvars for the sunlight and cascaded shadow maps: 4096 - 4096x4096, indistinguishable from 2048. -Cvars for adjusting gamma values: - r_materialGamma - Gamma level for material textures. - (diffuse, specular) - 1.0 - Quake 3, fastest. (default) - 2.0 - More accurate, slower. - 2.2 - Most accurate, slowest. - - r_lightGamma - Gamma level for light. - (lightmap, lightgrid, vertex lights) - 1.0 - Quake 3, fastest. (default) - 2.0 - More accurate, slower. - 2.2 - Most accurate, slowest. - - r_framebufferGamma - Gamma level for framebuffers. - 1.0 - Quake 3, fastest. (default) - 2.0 - More accurate, slower. - 2.2 - Most accurate, slowest. - - r_tonemapGamma - Gamma applied after tonemapping. - 1.0 - Quake 3, fastest. (default) - 2.0 - More accurate, slower. - 2.2 - Most accurate, slowest. - Cvars that you probably don't care about or shouldn't mess with: r_mergeMultidraws - Optimize number of calls to glMultiDrawElements(). @@ -381,7 +357,20 @@ Cvars that you probably don't care about or shouldn't mess with: r_shadowCascadeZBias - Z-bias for shadow cascade frustums. -256 - Default. - + r_materialGamma - Gamma level for material textures. + (diffuse, specular) + 1.0 - Quake 3, fastest. (default) + + r_lightGamma - Gamma level for light. + (lightmap, lightgrid, vertex lights) + 1.0 - Quake 3, fastest. (default) + + r_framebufferGamma - Gamma level for framebuffers. + 1.0 - Quake 3, fastest. (default) + + r_tonemapGamma - Gamma applied after tonemapping. + 1.0 - Quake 3, fastest. (default) + Cvars that have broken bits: r_dlightMode - Change how dynamic lights look. 0 - Quake 3 style dlights, fake @@ -615,59 +604,6 @@ Each of these settings corresponds to a matching cvar, so you can view and adjust the effect before settling on fixed settings. -------------------------------------------------------------------------------- - MATERIAL/LIGHT/FRAMEBUFFER/TONEMAP GAMMA -------------------------------------------------------------------------------- - -This adds four cvars, r_materialGamma, r_lightGamma, r_framebufferGamma, and -r_tonemapGamma. These adjust the gamma levels of their corresponding texture -or color, allowing for more realistic lighting and shading. - -These settings are fastest: - - r_materialGamma 1 - r_lightGamma 1 - r_framebufferGamma 1 - r_tonemapGamma 1 - -This is the same as Quake 3 behaviour, where colors are not adjusted for gamma -until presentation to the screen. - -These settings are more accurate: - - r_materialGamma 2 - r_lightGamma 2 - r_framebufferGamma 2 - r_tonemapGamma 2 - -This converts diffuse/specular from gamma 2 space to linear space -(r_materialGamma 2), converts light values similarly (r_lightGamma 2), -converts those to the gamma 2 of the framebuffer (r_framebufferGamma 2), and -converts to a monitor gamma of 2 after tonemapping (r_tonemapGamma 2). - -These settings are the most accurate: - - r_materialGamma 2.2 - r_lightGamma 2.2 - r_framebufferGamma 2.2 - r_tonemapGamma 2.2 - -This is the same as the previous, except using a more correct gamma of 2.2, -which approximates sRGB. - -The only issue with these last two examples are that dlights aren't added -linearly, since they are still performed as a straight add to a non-linear -framebuffer. To fix this, these settings are possible: - - r_materialGamma 2.2 - r_lightGamma 2.2 - r_framebufferGamma 1.0 - r_tonemapGamma 2.2 - -But these cause UI draws to have the wrong gamma, as these are rendered after -tonemapping. I recommend the use of the second or third set of settings. - - ------------------------------------------------------------------------------- THANKS ------------------------------------------------------------------------------- From b9061c84473bc439529b6fe54ac2c8241297c408 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Thu, 1 May 2014 20:41:47 -0500 Subject: [PATCH 03/21] Fix cg.skulltrails out of bounds access in Team Arena Harvester mode In Team Arena's Harvester mode, players corrupt your memory from beyond the grave. Gib the players to stop the corruption! CG_PlayerTokens is called for player entities, including corpses. The entity number is used for the index in cg.skulltrails which only has MAX_CLIENTS elements. This results in incorrect memory being overwritten for corpse entities (as the entity number is >= MAX_CLIENTS). So limit skull trails to valid entities (entity number < MAX_CLIENTS). --- code/cgame/cg_players.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/cgame/cg_players.c b/code/cgame/cg_players.c index 59f52320..9c76aac3 100644 --- a/code/cgame/cg_players.c +++ b/code/cgame/cg_players.c @@ -1774,6 +1774,9 @@ static void CG_PlayerTokens( centity_t *cent, int renderfx ) { refEntity_t ent; vec3_t dir, origin; skulltrail_t *trail; + if ( cent->currentState.number >= MAX_CLIENTS ) { + return; + } trail = &cg.skulltrails[cent->currentState.number]; tokens = cent->currentState.generic1; if ( !tokens ) { From 3a7298d6aeca9957c9dcf7ff80df33f32785c7ec Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Tue, 6 May 2014 20:39:17 -0500 Subject: [PATCH 04/21] Make R_LerpTag return qfalse if MDR tag does not exist Elite Force SDK has trap_R_LerpTag return void, so this shouldn't cause issues for iostvef. Allows new games to check if a tag exists in a MDR model. --- code/renderergl1/tr_model.c | 33 +++++++++++++-------------------- code/renderergl2/tr_model.c | 32 +++++++++++++------------------- 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/code/renderergl1/tr_model.c b/code/renderergl1/tr_model.c index a3f91aee..51269a51 100644 --- a/code/renderergl1/tr_model.c +++ b/code/renderergl1/tr_model.c @@ -966,7 +966,7 @@ static md3Tag_t *R_GetTag( md3Header_t *mod, int frame, const char *tagName ) { return NULL; } -void R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, md3Tag_t * dest) +md3Tag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, md3Tag_t * dest) { int i, j, k; int frameSize; @@ -1001,13 +1001,11 @@ void R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, md3Tag_t dest->origin[1]=frame->bones[tag->boneIndex].matrix[1][3]; dest->origin[2]=frame->bones[tag->boneIndex].matrix[2][3]; - return; + return dest; } } - AxisClear( dest->axis ); - VectorClear( dest->origin ); - strcpy(dest->name,""); + return NULL; } /* @@ -1028,34 +1026,29 @@ int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFram { if(model->type == MOD_MDR) { - start = &start_space; - end = &end_space; - R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, start); - R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, end); + start = R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, &start_space); + end = R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, &end_space); } else if( model->type == MOD_IQM ) { return R_IQMLerpTag( tag, model->modelData, startFrame, endFrame, frac, tagName ); } else { - - AxisClear( tag->axis ); - VectorClear( tag->origin ); - return qfalse; - + start = end = NULL; } } else { start = R_GetTag( model->md3[0], startFrame, tagName ); end = R_GetTag( model->md3[0], endFrame, tagName ); - if ( !start || !end ) { - AxisClear( tag->axis ); - VectorClear( tag->origin ); - return qfalse; - } } - + + if ( !start || !end ) { + AxisClear( tag->axis ); + VectorClear( tag->origin ); + return qfalse; + } + frontLerp = frac; backLerp = 1.0f - frac; diff --git a/code/renderergl2/tr_model.c b/code/renderergl2/tr_model.c index c0dbeaa2..f2f55425 100644 --- a/code/renderergl2/tr_model.c +++ b/code/renderergl2/tr_model.c @@ -1230,7 +1230,7 @@ static mdvTag_t *R_GetTag( mdvModel_t *mod, int frame, const char *_tagName ) { return NULL; } -void R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdvTag_t * dest) +mdvTag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdvTag_t * dest) { int i, j, k; int frameSize; @@ -1263,12 +1263,11 @@ void R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdvTag_t dest->origin[1]=frame->bones[tag->boneIndex].matrix[1][3]; dest->origin[2]=frame->bones[tag->boneIndex].matrix[2][3]; - return; + return dest; } } - AxisClear( dest->axis ); - VectorClear( dest->origin ); + return NULL; } /* @@ -1289,34 +1288,29 @@ int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFram { if(model->type == MOD_MDR) { - start = &start_space; - end = &end_space; - R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, start); - R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, end); + start = R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, &start_space); + end = R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, &end_space); } else if( model->type == MOD_IQM ) { return R_IQMLerpTag( tag, model->modelData, startFrame, endFrame, frac, tagName ); } else { - - AxisClear( tag->axis ); - VectorClear( tag->origin ); - return qfalse; - + start = end = NULL; } } else { start = R_GetTag( model->mdv[0], startFrame, tagName ); end = R_GetTag( model->mdv[0], endFrame, tagName ); - if ( !start || !end ) { - AxisClear( tag->axis ); - VectorClear( tag->origin ); - return qfalse; - } } - + + if ( !start || !end ) { + AxisClear( tag->axis ); + VectorClear( tag->origin ); + return qfalse; + } + frontLerp = frac; backLerp = 1.0f - frac; From adc1b2cbd1fab57fbc2e7756000cfa205aa7391f Mon Sep 17 00:00:00 2001 From: Roberto Estrada Date: Wed, 7 May 2014 10:37:42 +0200 Subject: [PATCH 05/21] Switched runtime library to Multithreaded DLL to fix build on VS2012. --- misc/msvc11/quake3.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/msvc11/quake3.vcxproj b/misc/msvc11/quake3.vcxproj index 7050463d..4f203d9e 100644 --- a/misc/msvc11/quake3.vcxproj +++ b/misc/msvc11/quake3.vcxproj @@ -177,7 +177,7 @@ ..\..\code\SDL12\include;..\..\code\libcurl;..\..\code\AL;..\..\code\libspeex\include;..\..\code\zlib;..\..\code\jpeg-8c;%(AdditionalIncludeDirectories) _WIN32;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;BOTLIB;USE_ICON;USE_CURL;USE_CURL_DLOPEN;USE_OPENAL;USE_OPENAL_DLOPEN;USE_VOIP;USE_INTERNAL_JPEG;HAVE_CONFIG_H;MISSIONPACK;%(PreprocessorDefinitions) true - MultiThreaded + MultiThreadedDLL true @@ -393,7 +393,7 @@ ..\..\code\SDL12\include;..\..\code\libcurl;..\..\code\AL;..\..\code\libspeex\include;..\..\code\zlib;..\..\code\jpeg-8c;%(AdditionalIncludeDirectories) _WIN32;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;BOTLIB;USE_ICON;USE_CURL;USE_CURL_DLOPEN;USE_OPENAL;USE_OPENAL_DLOPEN;USE_VOIP;USE_INTERNAL_JPEG;HAVE_CONFIG_H;%(PreprocessorDefinitions) true - MultiThreaded + MultiThreadedDLL true From 6d47ff88a667f4be95ea5272c6237a7eefdf93ac Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Mon, 12 May 2014 21:30:39 -0500 Subject: [PATCH 06/21] Don't install libvorbis-dev on Travis The in-tree copy of vorbis is used. No reason to install the package anymore. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4d623137..bc9dd4a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ script: ./travis-ci-build.sh before_install: - sudo apt-get update -qq - sudo apt-get remove -qq -y mingw32 - - sudo apt-get install -q -y libgl1-mesa-dev libsdl1.2-dev libvorbis-dev libfreetype6-dev mingw-w64 + - sudo apt-get install -q -y libgl1-mesa-dev libsdl1.2-dev libfreetype6-dev mingw-w64 notifications: email: false From daa570c1933228f3bb5b9a3f10487b79c37f473a Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 18 May 2014 20:27:18 -0500 Subject: [PATCH 07/21] Fix always switching back to mgun in Q3 controls menu Caused by 120e296a74b0317f29d7f516d904bdc70f71b006. --- code/q3_ui/ui_controls2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/q3_ui/ui_controls2.c b/code/q3_ui/ui_controls2.c index 55d33289..f5806a19 100644 --- a/code/q3_ui/ui_controls2.c +++ b/code/q3_ui/ui_controls2.c @@ -216,7 +216,7 @@ typedef struct vec3_t playerMoveangles; int playerLegs; int playerTorso; - int playerWeapon; + weapon_t playerWeapon; qboolean playerChat; menubitmap_s back; @@ -434,7 +434,7 @@ static void Controls_UpdateModel( int anim ) { s_controls.playerMoveangles[YAW] = s_controls.playerViewangles[YAW]; s_controls.playerLegs = LEGS_IDLE; s_controls.playerTorso = TORSO_STAND; - s_controls.playerWeapon = -1; + s_controls.playerWeapon = WP_NUM_WEAPONS; s_controls.playerChat = qfalse; switch( anim ) { From a3c2f77236d3c10faf7f82190e9c63876b550bd3 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 18 May 2014 20:37:43 -0500 Subject: [PATCH 08/21] Fix Gauntlet barrel axis in UI UI's PositionRotatedEntityOnTag is different than CGame's and UI has switched pitch/roll for Gauntlet/BFG axis to get it to look like /close to/ how it looks in CGame. Making UI use the same *PositionRotatedEntityOnTag and axis as CGame fixes the Gauntlet blade being wobbly in controls menu. --- code/q3_ui/ui_players.c | 8 ++------ code/ui/ui_players.c | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/code/q3_ui/ui_players.c b/code/q3_ui/ui_players.c index ad15fe78..b91073a9 100644 --- a/code/q3_ui/ui_players.c +++ b/code/q3_ui/ui_players.c @@ -332,8 +332,8 @@ static void UI_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_ } // cast away const because of compiler problems - MatrixMultiply( entity->axis, ((refEntity_t *)parent)->axis, tempAxis ); - MatrixMultiply( lerped.axis, tempAxis, entity->axis ); + MatrixMultiply( entity->axis, lerped.axis, tempAxis ); + MatrixMultiply( tempAxis, ((refEntity_t *)parent)->axis, entity->axis ); } @@ -845,10 +845,6 @@ void UI_DrawPlayer( float x, float y, float w, float h, playerInfo_t *pi, int ti angles[YAW] = 0; angles[PITCH] = 0; angles[ROLL] = UI_MachinegunSpinAngle( pi ); - if( pi->realWeapon == WP_GAUNTLET || pi->realWeapon == WP_BFG ) { - angles[PITCH] = angles[ROLL]; - angles[ROLL] = 0; - } AnglesToAxis( angles, barrel.axis ); UI_PositionRotatedEntityOnTag( &barrel, &gun, pi->weaponModel, "tag_barrel"); diff --git a/code/ui/ui_players.c b/code/ui/ui_players.c index ee30febc..e6355690 100644 --- a/code/ui/ui_players.c +++ b/code/ui/ui_players.c @@ -333,8 +333,8 @@ static void UI_PositionRotatedEntityOnTag( refEntity_t *entity, const refEntity_ } // cast away const because of compiler problems - MatrixMultiply( entity->axis, ((refEntity_t *)parent)->axis, tempAxis ); - MatrixMultiply( lerped.axis, tempAxis, entity->axis ); + MatrixMultiply( entity->axis, lerped.axis, tempAxis ); + MatrixMultiply( tempAxis, ((refEntity_t *)parent)->axis, entity->axis ); } @@ -845,10 +845,6 @@ void UI_DrawPlayer( float x, float y, float w, float h, playerInfo_t *pi, int ti angles[YAW] = 0; angles[PITCH] = 0; angles[ROLL] = UI_MachinegunSpinAngle( pi ); - if( pi->realWeapon == WP_GAUNTLET || pi->realWeapon == WP_BFG ) { - angles[PITCH] = angles[ROLL]; - angles[ROLL] = 0; - } AnglesToAxis( angles, barrel.axis ); UI_PositionRotatedEntityOnTag( &barrel, &gun, pi->weaponModel, "tag_barrel"); From 494789664e3c958efd964d722556a56cb0cc0268 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Mon, 19 May 2014 17:27:25 -0500 Subject: [PATCH 09/21] Try to fix Travis CI MinGW builds Listing i686-w64-mingw32-gcc as a compiler stopped working. Travis tries to print version before installing it. $ i686-w64-mingw32-gcc --version /home/travis/build.sh: line 201: i686-w64-mingw32-gcc: command not found The command "i686-w64-mingw32-gcc --version" failed and exited with 127 during setup. --- .travis.yml | 16 +++++++++++----- travis-ci-build.sh | 22 +--------------------- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/.travis.yml b/.travis.yml index 326b7c35..21f80696 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,15 @@ language: c -compiler: - - gcc - - clang - - i686-w64-mingw32-gcc - - x86_64-w64-mingw32-gcc + +env: + # standard builds + - CC=gcc + - CC=clang + # extra libs + - CC=gcc USE_CODEC_VORBIS=1 USE_FREETYPE=1 + - CC=clang USE_CODEC_VORBIS=1 USE_FREETYPE=1 + # cross-compile using mingw + - CC= PLATFORM="mingw32" ARCH="x86" + - CC= PLATFORM="mingw32" ARCH="x86_64" script: ./travis-ci-build.sh diff --git a/travis-ci-build.sh b/travis-ci-build.sh index 97b49699..008bc7e1 100755 --- a/travis-ci-build.sh +++ b/travis-ci-build.sh @@ -2,33 +2,13 @@ failed=0; -# check if testing mingw -if [ "$CC" = "i686-w64-mingw32-gcc" ]; then - export PLATFORM=mingw32 - export ARCH=x86 - export CC= - haveExternalLibs=0 -elif [ "$CC" = "x86_64-w64-mingw32-gcc" ]; then - export PLATFORM=mingw32 - export ARCH=x86_64 - export CC= - haveExternalLibs=0 -else - haveExternalLibs=1 -fi - # Default Build (make clean release) || failed=1; -# Test additional options -if [ $haveExternalLibs -eq 1 ]; then - (make clean release USE_CODEC_VORBIS=1 USE_FREETYPE=1) || failed=1; -fi - if [ $failed -eq 1 ]; then echo "Build failure."; else - echo "All builds successful."; + echo "Build successful."; fi exit $failed; From 9d74227559d46b85d0c43d395cd280d3de7ae8f4 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 15:59:09 -0500 Subject: [PATCH 10/21] Fix potential out of bounds access caused by CM_GridPlane Coverity doesn't care if there is a warning, out of bounds access is bad. --- code/qcommon/cm_patch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/qcommon/cm_patch.c b/code/qcommon/cm_patch.c index 77cf368f..3a4e37cc 100644 --- a/code/qcommon/cm_patch.c +++ b/code/qcommon/cm_patch.c @@ -607,7 +607,7 @@ static int CM_GridPlane( int gridPlanes[MAX_GRID_SIZE][MAX_GRID_SIZE][2], int i, } // should never happen - Com_Printf( "WARNING: CM_GridPlane unresolvable\n" ); + Com_Error( ERR_DROP, "CM_GridPlane unresolvable" ); return -1; } From e21ff01946c425b345abd8c0910864eaa61a6848 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 16:10:01 -0500 Subject: [PATCH 11/21] Don't use memset with non-zero value to fill ints Coverity reported using value -2 as a bad memset. Really doesn't make sense when filling ints and not bytes too. --- code/renderergl2/tr_model.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/renderergl2/tr_model.c b/code/renderergl2/tr_model.c index f2f55425..b385dee6 100644 --- a/code/renderergl2/tr_model.c +++ b/code/renderergl2/tr_model.c @@ -1132,6 +1132,7 @@ static qboolean R_LoadMDR( model_t *mod, void *buffer, int filesize, const char ** RE_BeginRegistration */ void RE_BeginRegistration( glconfig_t *glconfigOut ) { + int i; R_Init(); @@ -1140,7 +1141,10 @@ void RE_BeginRegistration( glconfig_t *glconfigOut ) { R_IssuePendingRenderCommands(); tr.visIndex = 0; - memset(tr.visClusters, -2, sizeof(tr.visClusters)); // force markleafs to regenerate + // force markleafs to regenerate + for(i = 0; i < MAX_VISCOUNTS; i++) { + tr.visClusters[i] = -2; + } R_ClearFlares(); RE_ClearScene(); From 078d004dc272759154caf83ca9549c3a4c0cb5ee Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 16:28:38 -0500 Subject: [PATCH 12/21] Fix potential buffer overflow in PS_ReadPrimitive Found by Coverity. --- code/botlib/l_script.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/botlib/l_script.c b/code/botlib/l_script.c index cc74404a..766032ab 100644 --- a/code/botlib/l_script.c +++ b/code/botlib/l_script.c @@ -828,7 +828,7 @@ int PS_ReadPrimitive(script_t *script, token_t *token) len = 0; while(*script->script_p > ' ' && *script->script_p != ';') { - if (len >= MAX_TOKEN) + if (len >= MAX_TOKEN - 1) { ScriptError(script, "primitive token longer than MAX_TOKEN = %d", MAX_TOKEN); return 0; From eea9fbdb61d95cf48cbcdaa3b5f38daadc0ce1c6 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 17:02:33 -0500 Subject: [PATCH 13/21] Fix unchecked buffer size issues in l_script.c and l_precomp.c Found by Coverity. --- code/botlib/l_precomp.c | 19 ++++++++++++------- code/botlib/l_script.c | 6 ++++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/code/botlib/l_precomp.c b/code/botlib/l_precomp.c index bfa7564c..a98213a4 100644 --- a/code/botlib/l_precomp.c +++ b/code/botlib/l_precomp.c @@ -995,14 +995,14 @@ int PC_Directive_include(source_t *source) script = LoadScriptFile(token.string); if (!script) { - strcpy(path, source->includepath); - strcat(path, token.string); + Q_strncpyz(path, source->includepath, sizeof(path)); + Q_strcat(path, sizeof(path), token.string); script = LoadScriptFile(path); } //end if } //end if else if (token.type == TT_PUNCTUATION && *token.string == '<') { - strcpy(path, source->includepath); + Q_strncpyz(path, source->includepath, sizeof(path)); while(PC_ReadSourceToken(source, &token)) { if (token.linescrossed > 0) @@ -1011,7 +1011,7 @@ int PC_Directive_include(source_t *source) break; } //end if if (token.type == TT_PUNCTUATION && *token.string == '>') break; - strncat(path, token.string, MAX_PATH - 1); + Q_strcat(path, sizeof(path), token.string); } //end while if (*token.string != '>') { @@ -2831,6 +2831,7 @@ int PC_ExpectTokenType(source_t *source, int type, int subtype, token_t *token) { if ((token->subtype & subtype) != subtype) { + strcpy(str, ""); if (subtype & TT_DECIMAL) strcpy(str, "decimal"); if (subtype & TT_HEX) strcpy(str, "hex"); if (subtype & TT_OCTAL) strcpy(str, "octal"); @@ -2954,10 +2955,14 @@ void PC_UnreadToken(source_t *source, token_t *token) //============================================================================ void PC_SetIncludePath(source_t *source, char *path) { - strncpy(source->includepath, path, MAX_PATH); + size_t len; + + Q_strncpyz(source->includepath, path, MAX_PATH-1); + + len = strlen(source->includepath); //add trailing path seperator - if (source->includepath[strlen(source->includepath)-1] != '\\' && - source->includepath[strlen(source->includepath)-1] != '/') + if (len > 0 && source->includepath[len-1] != '\\' && + source->includepath[len-1] != '/') { strcat(source->includepath, PATHSEPERATOR_STR); } //end if diff --git a/code/botlib/l_script.c b/code/botlib/l_script.c index 766032ab..ee9cddc0 100644 --- a/code/botlib/l_script.c +++ b/code/botlib/l_script.c @@ -956,6 +956,7 @@ int PS_ExpectTokenType(script_t *script, int type, int subtype, token_t *token) if (token->type != type) { + strcpy(str, ""); if (type == TT_STRING) strcpy(str, "string"); if (type == TT_LITERAL) strcpy(str, "literal"); if (type == TT_NUMBER) strcpy(str, "number"); @@ -968,6 +969,7 @@ int PS_ExpectTokenType(script_t *script, int type, int subtype, token_t *token) { if ((token->subtype & subtype) != subtype) { + strcpy(str, ""); if (subtype & TT_DECIMAL) strcpy(str, "decimal"); if (subtype & TT_HEX) strcpy(str, "hex"); if (subtype & TT_OCTAL) strcpy(str, "octal"); @@ -1350,7 +1352,7 @@ script_t *LoadScriptFile(const char *filename) buffer = GetClearedMemory(sizeof(script_t) + length + 1); script = (script_t *) buffer; Com_Memset(script, 0, sizeof(script_t)); - strcpy(script->filename, filename); + Q_strncpyz(script->filename, filename, sizeof(script->filename)); script->buffer = (char *) buffer + sizeof(script_t); script->buffer[length] = 0; script->length = length; @@ -1396,7 +1398,7 @@ script_t *LoadScriptMemory(char *ptr, int length, char *name) buffer = GetClearedMemory(sizeof(script_t) + length + 1); script = (script_t *) buffer; Com_Memset(script, 0, sizeof(script_t)); - strcpy(script->filename, name); + Q_strncpyz(script->filename, name, sizeof(script->filename)); script->buffer = (char *) buffer + sizeof(script_t); script->buffer[length] = 0; script->length = length; From 7a4ef47476e52e10828453b033c8546a55ef8081 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 17:38:50 -0500 Subject: [PATCH 14/21] Fix max bans range check in SV_AddBanToList Adding too many bans would write out of bounds. Found by Coverity. --- code/server/sv_ccmds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/server/sv_ccmds.c b/code/server/sv_ccmds.c index ca73290a..1b723399 100644 --- a/code/server/sv_ccmds.c +++ b/code/server/sv_ccmds.c @@ -846,7 +846,7 @@ static void SV_AddBanToList(qboolean isexception) return; } - if(serverBansCount > ARRAY_LEN(serverBans)) + if(serverBansCount >= ARRAY_LEN(serverBans)) { Com_Printf ("Error: Maximum number of bans/exceptions exceeded.\n"); return; From 9c99cf29db06807fd96acfdbc6c59bbbbcd4a814 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 18:07:45 -0500 Subject: [PATCH 15/21] Have OpenGL2 "map $lightmap" check for NULL tr.lightmaps too Zero length lightmap lump will have NULL tr.lightmaps. OpenGL1 already has this check, because r_vertexLight 1 would crash Team Arena. OpenGL2 does not disable loading lightmaps when r_vertexLight is 1 though, so it does not have that issue. --- code/renderergl2/tr_shader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/renderergl2/tr_shader.c b/code/renderergl2/tr_shader.c index 295dad7b..ed8212d2 100644 --- a/code/renderergl2/tr_shader.c +++ b/code/renderergl2/tr_shader.c @@ -639,7 +639,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) else if ( !Q_stricmp( token, "$lightmap" ) ) { stage->bundle[0].isLightmap = qtrue; - if ( shader.lightmapIndex < 0 ) { + if ( shader.lightmapIndex < 0 || !tr.lightmaps ) { stage->bundle[0].image[0] = tr.whiteImage; } else { stage->bundle[0].image[0] = tr.lightmaps[shader.lightmapIndex]; From eeeaf3f1252d95a6037f33d30fdf2e945e340f79 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 18:44:17 -0500 Subject: [PATCH 16/21] Fix potential buffer overflow caused by long tcMod args Found by Coverity. --- code/renderergl1/tr_shader.c | 4 ++-- code/renderergl2/tr_shader.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/renderergl1/tr_shader.c b/code/renderergl1/tr_shader.c index de3a45c4..103d329f 100644 --- a/code/renderergl1/tr_shader.c +++ b/code/renderergl1/tr_shader.c @@ -1010,8 +1010,8 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) token = COM_ParseExt( text, qfalse ); if ( token[0] == 0 ) break; - strcat( buffer, token ); - strcat( buffer, " " ); + Q_strcat( buffer, sizeof (buffer), token ); + Q_strcat( buffer, sizeof (buffer), " " ); } ParseTexMod( buffer, stage ); diff --git a/code/renderergl2/tr_shader.c b/code/renderergl2/tr_shader.c index ed8212d2..cbb01121 100644 --- a/code/renderergl2/tr_shader.c +++ b/code/renderergl2/tr_shader.c @@ -1265,8 +1265,8 @@ static qboolean ParseStage( shaderStage_t *stage, char **text ) token = COM_ParseExt( text, qfalse ); if ( token[0] == 0 ) break; - strcat( buffer, token ); - strcat( buffer, " " ); + Q_strcat( buffer, sizeof (buffer), token ); + Q_strcat( buffer, sizeof (buffer), " " ); } ParseTexMod( buffer, stage ); From 077ab4cbd107f6e685bcb96b73349962b1ca9d58 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sun, 25 May 2014 22:54:56 -0500 Subject: [PATCH 17/21] Fix OOB access in CM_EdgePlaneNum without erroring in CM_GridPlane I changed warning to error in 9d74227559d46b85d0c43d395cd280d3de7ae8f4, which broke JA's mp/ctf4 map and probably others. --- code/qcommon/cm_patch.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/code/qcommon/cm_patch.c b/code/qcommon/cm_patch.c index 3a4e37cc..3cd7bcaf 100644 --- a/code/qcommon/cm_patch.c +++ b/code/qcommon/cm_patch.c @@ -607,7 +607,7 @@ static int CM_GridPlane( int gridPlanes[MAX_GRID_SIZE][MAX_GRID_SIZE][2], int i, } // should never happen - Com_Error( ERR_DROP, "CM_GridPlane unresolvable" ); + Com_Printf( "WARNING: CM_GridPlane unresolvable\n" ); return -1; } @@ -626,6 +626,9 @@ static int CM_EdgePlaneNum( cGrid_t *grid, int gridPlanes[MAX_GRID_SIZE][MAX_GRI p1 = grid->points[i][j]; p2 = grid->points[i+1][j]; p = CM_GridPlane( gridPlanes, i, j, 0 ); + if ( p == -1 ) { + return -1; + } VectorMA( p1, 4, planes[ p ].plane, up ); return CM_FindPlane( p1, p2, up ); @@ -633,6 +636,9 @@ static int CM_EdgePlaneNum( cGrid_t *grid, int gridPlanes[MAX_GRID_SIZE][MAX_GRI p1 = grid->points[i][j+1]; p2 = grid->points[i+1][j+1]; p = CM_GridPlane( gridPlanes, i, j, 1 ); + if ( p == -1 ) { + return -1; + } VectorMA( p1, 4, planes[ p ].plane, up ); return CM_FindPlane( p2, p1, up ); @@ -640,6 +646,9 @@ static int CM_EdgePlaneNum( cGrid_t *grid, int gridPlanes[MAX_GRID_SIZE][MAX_GRI p1 = grid->points[i][j]; p2 = grid->points[i][j+1]; p = CM_GridPlane( gridPlanes, i, j, 1 ); + if ( p == -1 ) { + return -1; + } VectorMA( p1, 4, planes[ p ].plane, up ); return CM_FindPlane( p2, p1, up ); @@ -647,6 +656,9 @@ static int CM_EdgePlaneNum( cGrid_t *grid, int gridPlanes[MAX_GRID_SIZE][MAX_GRI p1 = grid->points[i+1][j]; p2 = grid->points[i+1][j+1]; p = CM_GridPlane( gridPlanes, i, j, 0 ); + if ( p == -1 ) { + return -1; + } VectorMA( p1, 4, planes[ p ].plane, up ); return CM_FindPlane( p1, p2, up ); @@ -654,6 +666,9 @@ static int CM_EdgePlaneNum( cGrid_t *grid, int gridPlanes[MAX_GRID_SIZE][MAX_GRI p1 = grid->points[i+1][j+1]; p2 = grid->points[i][j]; p = CM_GridPlane( gridPlanes, i, j, 0 ); + if ( p == -1 ) { + return -1; + } VectorMA( p1, 4, planes[ p ].plane, up ); return CM_FindPlane( p1, p2, up ); @@ -661,6 +676,9 @@ static int CM_EdgePlaneNum( cGrid_t *grid, int gridPlanes[MAX_GRID_SIZE][MAX_GRI p1 = grid->points[i][j]; p2 = grid->points[i+1][j+1]; p = CM_GridPlane( gridPlanes, i, j, 1 ); + if ( p == -1 ) { + return -1; + } VectorMA( p1, 4, planes[ p ].plane, up ); return CM_FindPlane( p1, p2, up ); From 347b429fdb7cc6235b2bf9a6237acb47b20ebaf7 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Mon, 26 May 2014 23:11:56 -0500 Subject: [PATCH 18/21] Fix potential OOB in Windows Dedicated TTY CON_Show Found by Coverity. --- code/sys/con_win32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/sys/con_win32.c b/code/sys/con_win32.c index ea64e013..454012e0 100644 --- a/code/sys/con_win32.c +++ b/code/sys/con_win32.c @@ -208,7 +208,7 @@ static void CON_Show( void ) { if( i < qconsole_linelen ) { - if( Q_IsColorString( qconsole_line + i ) ) + if( i + 1 < qconsole_linelen && Q_IsColorString( qconsole_line + i ) ) attrib = CON_ColorCharToAttrib( *( qconsole_line + i + 1 ) ); line[ i ].Char.AsciiChar = qconsole_line[ i ]; From 318d45cff528f62214d7626d901ffd02d4b29036 Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Tue, 27 May 2014 18:20:12 -0700 Subject: [PATCH 19/21] OpenGL2: Reimplement MD3 tangent space calculation. --- code/renderergl2/tr_init.c | 2 - code/renderergl2/tr_local.h | 6 +-- code/renderergl2/tr_main.c | 37 ++++++++--------- code/renderergl2/tr_model.c | 81 ++++++++++++++++--------------------- 4 files changed, 56 insertions(+), 70 deletions(-) diff --git a/code/renderergl2/tr_init.c b/code/renderergl2/tr_init.c index 015b661c..2a681007 100644 --- a/code/renderergl2/tr_init.c +++ b/code/renderergl2/tr_init.c @@ -143,7 +143,6 @@ cvar_t *r_baseNormalY; cvar_t *r_baseParallax; cvar_t *r_baseSpecular; cvar_t *r_baseGloss; -cvar_t *r_recalcMD3Normals; cvar_t *r_mergeLightmaps; cvar_t *r_dlightMode; cvar_t *r_pshadowDist; @@ -1204,7 +1203,6 @@ void R_Register( void ) r_baseGloss = ri.Cvar_Get( "r_baseGloss", "0.3", CVAR_ARCHIVE | CVAR_LATCH ); r_dlightMode = ri.Cvar_Get( "r_dlightMode", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_pshadowDist = ri.Cvar_Get( "r_pshadowDist", "128", CVAR_ARCHIVE ); - r_recalcMD3Normals = ri.Cvar_Get( "r_recalcMD3Normals", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_mergeLightmaps = ri.Cvar_Get( "r_mergeLightmaps", "1", CVAR_ARCHIVE | CVAR_LATCH ); r_imageUpsample = ri.Cvar_Get( "r_imageUpsample", "0", CVAR_ARCHIVE | CVAR_LATCH ); r_imageUpsampleMaxSize = ri.Cvar_Get( "r_imageUpsampleMaxSize", "1024", CVAR_ARCHIVE | CVAR_LATCH ); diff --git a/code/renderergl2/tr_local.h b/code/renderergl2/tr_local.h index 10614f32..7bfa8769 100644 --- a/code/renderergl2/tr_local.h +++ b/code/renderergl2/tr_local.h @@ -1804,7 +1804,6 @@ extern cvar_t *r_baseSpecular; extern cvar_t *r_baseGloss; extern cvar_t *r_dlightMode; extern cvar_t *r_pshadowDist; -extern cvar_t *r_recalcMD3Normals; extern cvar_t *r_mergeLightmaps; extern cvar_t *r_imageUpsample; extern cvar_t *r_imageUpsampleMaxSize; @@ -1865,8 +1864,9 @@ void R_DecomposeSort( unsigned sort, int *entityNum, shader_t **shader, void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader, int fogIndex, int dlightMap, int pshadowMap, int cubemap ); -void R_CalcTangentSpace(vec3_t tangent, vec3_t bitangent, vec3_t normal, - const vec3_t v0, const vec3_t v1, const vec3_t v2, const vec2_t t0, const vec2_t t1, const vec2_t t2); +void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2, + const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3); +void R_CalcTbnFromNormalAndTexDirs(vec3_t tangent, vec3_t bitangent, vec3_t normal, vec3_t sdir, vec3_t tdir); qboolean R_CalcTangentVectors(srfVert_t * dv[3]); #define CULL_IN 0 // completely unclipped diff --git a/code/renderergl2/tr_main.c b/code/renderergl2/tr_main.c index 3e614394..7ea837ae 100644 --- a/code/renderergl2/tr_main.c +++ b/code/renderergl2/tr_main.c @@ -294,13 +294,11 @@ void R_CalcTangentSpaceFast(vec3_t tangent, vec3_t bitangent, vec3_t normal, /* http://www.terathon.com/code/tangent.html */ -void R_CalcTBN(vec3_t tangent, vec3_t bitangent, vec3_t normal, - const vec3_t v1, const vec3_t v2, const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3) +void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2, + const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3) { - vec3_t u, v; float x1, x2, y1, y2, z1, z2; - float s1, s2, t1, t2; - float r, dot; + float s1, s2, t1, t2, r; x1 = v2[0] - v1[0]; x2 = v3[0] - v1[0]; @@ -316,24 +314,27 @@ void R_CalcTBN(vec3_t tangent, vec3_t bitangent, vec3_t normal, r = 1.0f / (s1 * t2 - s2 * t1); - VectorSet(tangent, (t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r); - VectorSet(bitangent, (s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r); + VectorSet(sdir, (t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r); + VectorSet(tdir, (s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r); +} - // compute the face normal based on vertex points - VectorSubtract(v3, v1, u); - VectorSubtract(v2, v1, v); - CrossProduct(u, v, normal); - - VectorNormalize(normal); +void R_CalcTbnFromNormalAndTexDirs(vec3_t tangent, vec3_t bitangent, vec3_t normal, vec3_t sdir, vec3_t tdir) +{ + vec3_t n_cross_t; + vec_t n_dot_t, handedness; // Gram-Schmidt orthogonalize - //tangent[a] = (t - n * Dot(n, t)).Normalize(); - dot = DotProduct(normal, tangent); - VectorMA(tangent, -dot, normal, tangent); + n_dot_t = DotProduct(normal, sdir); + VectorMA(sdir, -n_dot_t, normal, tangent); VectorNormalize(tangent); - // B=NxT - //CrossProduct(normal, tangent, bitangent); + // Calculate handedness + CrossProduct(normal, sdir, n_cross_t); + handedness = (DotProduct(n_cross_t, tdir) < 0.0f) ? -1.0f : 1.0f; + + // Calculate bitangent + CrossProduct(normal, tangent, bitangent); + VectorScale(bitangent, handedness, bitangent); } void R_CalcTBN2(vec3_t tangent, vec3_t bitangent, vec3_t normal, diff --git a/code/renderergl2/tr_model.c b/code/renderergl2/tr_model.c index b385dee6..a477a349 100644 --- a/code/renderergl2/tr_model.c +++ b/code/renderergl2/tr_model.c @@ -372,7 +372,7 @@ R_LoadMD3 */ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize, const char *modName) { - int f, i, j, k; + int f, i, j; md3Header_t *md3Model; md3Frame_t *md3Frame; @@ -598,71 +598,58 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize, #ifdef USE_VERT_TANGENT_SPACE // calc tangent spaces { - // Valgrind complaints: Conditional jump or move depends on uninitialised value(s) - // So lets Initialize them. - const float *v0 = NULL, *v1 = NULL, *v2 = NULL; - const float *t0 = NULL, *t1 = NULL, *t2 = NULL; - vec3_t tangent = { 0, 0, 0 }; - vec3_t bitangent = { 0, 0, 0 }; - vec3_t normal = { 0, 0, 0 }; + vec3_t *sdirs, *tdirs; - for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++) + sdirs = ri.Malloc(sizeof(*sdirs) * surf->numVerts * mdvModel->numFrames); + tdirs = ri.Malloc(sizeof(*tdirs) * surf->numVerts * mdvModel->numFrames); + + for (j = 0; j < (surf->numVerts * mdvModel->numFrames); j++) { - VectorClear(v->tangent); - VectorClear(v->bitangent); - if (r_recalcMD3Normals->integer) - VectorClear(v->normal); + VectorSet(sdirs[j], 0.0f, 0.0f, 0.0f); + VectorSet(tdirs[j], 0.0f, 0.0f, 0.0f); } for(f = 0; f < mdvModel->numFrames; f++) { for(j = 0, tri = surf->indexes; j < surf->numIndexes; j += 3, tri += 3) { - v0 = surf->verts[surf->numVerts * f + tri[0]].xyz; - v1 = surf->verts[surf->numVerts * f + tri[1]].xyz; - v2 = surf->verts[surf->numVerts * f + tri[2]].xyz; + vec3_t sdir, tdir; + const float *v0, *v1, *v2, *t0, *t1, *t2; + glIndex_t index0, index1, index2; + + index0 = surf->numVerts * f + tri[0]; + index1 = surf->numVerts * f + tri[1]; + index2 = surf->numVerts * f + tri[2]; + + v0 = surf->verts[index0].xyz; + v1 = surf->verts[index1].xyz; + v2 = surf->verts[index2].xyz; t0 = surf->st[tri[0]].st; t1 = surf->st[tri[1]].st; t2 = surf->st[tri[2]].st; - if (!r_recalcMD3Normals->integer) - VectorCopy(v->normal, normal); - else - VectorClear(normal); - - #if 1 - R_CalcTangentSpace(tangent, bitangent, normal, v0, v1, v2, t0, t1, t2); - #else - R_CalcNormalForTriangle(normal, v0, v1, v2); - R_CalcTangentsForTriangle(tangent, bitangent, v0, v1, v2, t0, t1, t2); - #endif - - for(k = 0; k < 3; k++) - { - float *v; - - v = surf->verts[surf->numVerts * f + tri[k]].tangent; - VectorAdd(v, tangent, v); - - v = surf->verts[surf->numVerts * f + tri[k]].bitangent; - VectorAdd(v, bitangent, v); - - if (r_recalcMD3Normals->integer) - { - v = surf->verts[surf->numVerts * f + tri[k]].normal; - VectorAdd(v, normal, v); - } - } + R_CalcTexDirs(sdir, tdir, v0, v1, v2, t0, t1, t2); + + VectorAdd(sdir, sdirs[index0], sdirs[index0]); + VectorAdd(sdir, sdirs[index1], sdirs[index1]); + VectorAdd(sdir, sdirs[index2], sdirs[index2]); + VectorAdd(tdir, tdirs[index0], tdirs[index0]); + VectorAdd(tdir, tdirs[index1], tdirs[index1]); + VectorAdd(tdir, tdirs[index2], tdirs[index2]); } } for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++) { - VectorNormalize(v->tangent); - VectorNormalize(v->bitangent); - VectorNormalize(v->normal); + VectorNormalize(sdirs[j]); + VectorNormalize(tdirs[j]); + + R_CalcTbnFromNormalAndTexDirs(v->tangent, v->bitangent, v->normal, sdirs[j], tdirs[j]); } + + ri.Free(sdirs); + ri.Free(tdirs); } #endif From 9efaf819dcb71dd9eace32b2770be0789f4ddfd3 Mon Sep 17 00:00:00 2001 From: SmileTheory Date: Tue, 27 May 2014 20:52:36 -0700 Subject: [PATCH 20/21] OpenGL2: Really obvious optimization to previous commit. --- code/renderergl2/tr_model.c | 39 +++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/code/renderergl2/tr_model.c b/code/renderergl2/tr_model.c index a477a349..2dbecee7 100644 --- a/code/renderergl2/tr_model.c +++ b/code/renderergl2/tr_model.c @@ -598,15 +598,10 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize, #ifdef USE_VERT_TANGENT_SPACE // calc tangent spaces { - vec3_t *sdirs, *tdirs; - - sdirs = ri.Malloc(sizeof(*sdirs) * surf->numVerts * mdvModel->numFrames); - tdirs = ri.Malloc(sizeof(*tdirs) * surf->numVerts * mdvModel->numFrames); - - for (j = 0; j < (surf->numVerts * mdvModel->numFrames); j++) + for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++) { - VectorSet(sdirs[j], 0.0f, 0.0f, 0.0f); - VectorSet(tdirs[j], 0.0f, 0.0f, 0.0f); + VectorClear(v->tangent); + VectorClear(v->bitangent); } for(f = 0; f < mdvModel->numFrames; f++) @@ -630,26 +625,28 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize, t2 = surf->st[tri[2]].st; R_CalcTexDirs(sdir, tdir, v0, v1, v2, t0, t1, t2); - - VectorAdd(sdir, sdirs[index0], sdirs[index0]); - VectorAdd(sdir, sdirs[index1], sdirs[index1]); - VectorAdd(sdir, sdirs[index2], sdirs[index2]); - VectorAdd(tdir, tdirs[index0], tdirs[index0]); - VectorAdd(tdir, tdirs[index1], tdirs[index1]); - VectorAdd(tdir, tdirs[index2], tdirs[index2]); + + VectorAdd(sdir, surf->verts[index0].tangent, surf->verts[index0].tangent); + VectorAdd(sdir, surf->verts[index1].tangent, surf->verts[index1].tangent); + VectorAdd(sdir, surf->verts[index2].tangent, surf->verts[index2].tangent); + VectorAdd(tdir, surf->verts[index0].bitangent, surf->verts[index0].bitangent); + VectorAdd(tdir, surf->verts[index1].bitangent, surf->verts[index1].bitangent); + VectorAdd(tdir, surf->verts[index2].bitangent, surf->verts[index2].bitangent); } } for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++) { - VectorNormalize(sdirs[j]); - VectorNormalize(tdirs[j]); + vec3_t sdir, tdir; - R_CalcTbnFromNormalAndTexDirs(v->tangent, v->bitangent, v->normal, sdirs[j], tdirs[j]); + VectorCopy(v->tangent, sdir); + VectorCopy(v->bitangent, tdir); + + VectorNormalize(sdir); + VectorNormalize(tdir); + + R_CalcTbnFromNormalAndTexDirs(v->tangent, v->bitangent, v->normal, sdir, tdir); } - - ri.Free(sdirs); - ri.Free(tdirs); } #endif From af79d2cb38bf816b25a349afa59a48c02833d7bc Mon Sep 17 00:00:00 2001 From: Ensiform Date: Thu, 29 May 2014 22:27:00 -0500 Subject: [PATCH 21/21] Fix an invalid null deref check in the slider code. --- code/ui/ui_shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ui/ui_shared.c b/code/ui/ui_shared.c index 0cc74f7b..a7bdd31c 100644 --- a/code/ui/ui_shared.c +++ b/code/ui/ui_shared.c @@ -1491,7 +1491,7 @@ float Item_Slider_ThumbPosition(itemDef_t *item) { x = item->window.rect.x; } - if (editDef == NULL && item->cvar) { + if (!editDef || !item->cvar) { return x; }