From 64d52e493bb17a06e3f7c17f1301b1b55fe3dfac Mon Sep 17 00:00:00 2001 From: g-cont Date: Fri, 21 Sep 2018 00:00:00 +0300 Subject: [PATCH] 21 Sep 2018 --- engine/client/cl_frame.c | 3 ++- engine/client/cl_parse.c | 2 +- engine/client/gl_refrag.c | 11 ++++++++--- engine/client/gl_rlight.c | 23 +++++++++++++++++++++- engine/client/s_dsp.c | 16 ++++++++------- engine/common/mathlib.c | 3 ++- engine/common/mathlib.h | 4 +++- engine/common/matrixlib.c | 41 +++++++++++++++++++++++++++++++++++++++ engine/server/sv_frame.c | 2 +- 9 files changed, 89 insertions(+), 16 deletions(-) diff --git a/engine/client/cl_frame.c b/engine/client/cl_frame.c index f11118c8..a9ce1193 100644 --- a/engine/client/cl_frame.c +++ b/engine/client/cl_frame.c @@ -1060,7 +1060,8 @@ void CL_LinkPacketEntities( frame_t *frame ) continue; } -// ent->curstate = *state; + // animtime must keep an actual + ent->curstate.animtime = state->animtime; interpolate = false; if( !ent->model ) continue; diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index e58b3604..4fad8a1e 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -160,7 +160,7 @@ void CL_ParseRestoreSoundPacket( sizebuf_t *msg ) char sentenceName[32]; if( flags & SND_SEQUENCE ) - Q_snprintf( sentenceName, sizeof( sentenceName ), "!#%i", sound + MAX_SOUNDS ); + Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound + MAX_SOUNDS ); else Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound ); handle = S_RegisterSound( sentenceName ); diff --git a/engine/client/gl_refrag.c b/engine/client/gl_refrag.c index a2420905..25fc3ba8 100644 --- a/engine/client/gl_refrag.c +++ b/engine/client/gl_refrag.c @@ -140,6 +140,8 @@ R_AddEfrags */ void R_AddEfrags( cl_entity_t *ent ) { + matrix3x4 transform; + vec3_t outmins, outmaxs; int i; if( !ent->model ) @@ -149,10 +151,14 @@ void R_AddEfrags( cl_entity_t *ent ) lastlink = &ent->efrag; r_pefragtopnode = NULL; + // handle entity rotation for right bbox expanding + Matrix3x4_CreateFromEntity( transform, ent->angles, vec3_origin, 1.0f ); + Matrix3x4_TransformAABB( transform, ent->model->mins, ent->model->maxs, outmins, outmaxs ); + for( i = 0; i < 3; i++ ) { - r_emins[i] = ent->origin[i] + ent->model->mins[i]; - r_emaxs[i] = ent->origin[i] + ent->model->maxs[i]; + r_emins[i] = ent->origin[i] + outmins[i]; + r_emaxs[i] = ent->origin[i] + outmaxs[i]; } R_SplitEntityOnNode( cl.worldmodel->nodes ); @@ -197,7 +203,6 @@ void R_StoreEfrags( efrag_t **ppefrag, int framecount ) ppefrag = &pefrag->leafnext; break; default: - Host_Error( "R_StoreEfrags: bad entity type %d\n", clmodel->type ); break; } } diff --git a/engine/client/gl_rlight.c b/engine/client/gl_rlight.c index 48039c6c..24cdf47b 100644 --- a/engine/client/gl_rlight.c +++ b/engine/client/gl_rlight.c @@ -379,7 +379,7 @@ R_LightVec check bspmodels to get light from ================= */ -colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lspot, vec3_t lvec ) +colorVec R_LightVecInternal( const vec3_t start, const vec3_t end, vec3_t lspot, vec3_t lvec ) { float last_fraction; int i, maxEnts = 1; @@ -452,6 +452,27 @@ colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lspot, vec3_t return light; } +/* +================= +R_LightVec + +check bspmodels to get light from +================= +*/ +colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lspot, vec3_t lvec ) +{ + colorVec light = R_LightVecInternal( start, end, lspot, lvec ); + + if( CVAR_TO_BOOL( r_lighting_extended ) && lspot != NULL && lvec != NULL ) + { + // trying to get light from ceiling (but ignore gradient analyze) + if(( light.r + light.g + light.b ) == 0 ) + return R_LightVecInternal( end, start, lspot, lvec ); + } + + return light; +} + /* ================= R_LightPoint diff --git a/engine/client/s_dsp.c b/engine/client/s_dsp.c index 63e55579..6882df8f 100644 --- a/engine/client/s_dsp.c +++ b/engine/client/s_dsp.c @@ -33,7 +33,7 @@ GNU General Public License for more details. #define MAXDLY (STEREODLY + 1) #define MAXLP 10 -#define MAXPRESETS ARRAYSIZE( rgsxpre ) +#define MAXPRESETS 29 typedef struct sx_preset_s { @@ -79,7 +79,7 @@ typedef struct dly_s int *lpdelayline; } dly_t; -const sx_preset_t rgsxpre[] = +const sx_preset_t rgsxpre[MAXPRESETS] = { // -------reverb-------- -------delay-------- // lp mod size refl rvblp delay feedback dlylp left @@ -609,16 +609,15 @@ int RVB_DoReverbForOneDly( dly_t *dly, const int vlr, const portable_samplepair_ if( dly->xfade || delay || samplepair->left || samplepair->right ) { // modulate delay rate - if( !dly->mod ) + if( !dly->xfade && !dly->modcur && dly->mod ) { dly->idelayoutputxf = dly->idelayoutput + ((COM_RandomLong( 0, 255 ) * delay) >> 9 ); - if( dly->idelayoutputxf >= dly->cdelaysamplesmax ) - dly->idelayoutputxf -= dly->cdelaysamplesmax; - - dly->xfade = REVERB_XFADE; + //dly->xfade = 32; } + dly->idelayoutputxf %= dly->cdelaysamplesmax; + if( dly->xfade ) { samplexf = (dly->lpdelayline[dly->idelayoutputxf] * (REVERB_XFADE - dly->xfade)) / REVERB_XFADE; @@ -819,6 +818,9 @@ void CheckNewDspPresets( void ) idsp_room = roomwater_type->value; else idsp_room = room_type->value; + // don't pass invalid presets + idsp_room = bound( 0, idsp_room, MAXPRESETS - 1 ); + if( FBitSet( hisound->flags, FCVAR_CHANGED )) { sxhires = hisound->value; diff --git a/engine/common/mathlib.c b/engine/common/mathlib.c index 5aba8b80..ef4b1e58 100644 --- a/engine/common/mathlib.c +++ b/engine/common/mathlib.c @@ -132,9 +132,10 @@ void RoundUpHullSize( vec3_t size ) qboolean negative = false; float result, value; - value = result = size[i]; + value = size[i]; if( value < 0.0f ) negative = true; value = Q_ceil( fabs( value )); + result = Q_ceil( size[i] ); // lookup hull table to find nearest supposed value for( j = 0; j < NUM_HULL_ROUNDS; j++ ) diff --git a/engine/common/mathlib.h b/engine/common/mathlib.h index d40ba5c9..b837f561 100644 --- a/engine/common/mathlib.h +++ b/engine/common/mathlib.h @@ -69,7 +69,7 @@ GNU General Public License for more details. #define Q_recip( a ) ((float)(1.0f / (float)(a))) #define Q_floor( a ) ((float)(long)(a)) #define Q_ceil( a ) ((float)(long)((a) + 1)) - +#define Q_round( x, y ) (floor( x / y + 0.5 ) * y ) #define Q_rint(x) ((x) < 0 ? ((int)((x)-0.5f)) : ((int)((x)+0.5f))) #define IS_NAN(x) (((*(int *)&x) & (255<<23)) == (255<<23)) @@ -167,10 +167,12 @@ void Matrix3x4_ConcatTransforms( matrix3x4 out, const matrix3x4 in1, const matri void Matrix3x4_FromOriginQuat( matrix3x4 out, const vec4_t quaternion, const vec3_t origin ); void Matrix3x4_CreateFromEntity( matrix3x4 out, const vec3_t angles, const vec3_t origin, float scale ); void Matrix3x4_TransformPositivePlane( const matrix3x4 in, const vec3_t normal, float d, vec3_t out, float *dist ); +void Matrix3x4_TransformAABB( const matrix3x4 world, const vec3_t mins, const vec3_t maxs, vec3_t absmin, vec3_t absmax ); void Matrix3x4_SetOrigin( matrix3x4 out, float x, float y, float z ); void Matrix3x4_Invert_Simple( matrix3x4 out, const matrix3x4 in1 ); void Matrix3x4_OriginFromMatrix( const matrix3x4 in, float *out ); void Matrix3x4_AnglesFromMatrix( const matrix3x4 in, vec3_t out ); +void Matrix3x4_Transpose( matrix3x4 out, const matrix3x4 in1 ); #define Matrix4x4_LoadIdentity( mat ) Matrix4x4_Copy( mat, matrix4x4_identity ) #define Matrix4x4_Copy( out, in ) memcpy( out, in, sizeof( matrix4x4 )) diff --git a/engine/common/matrixlib.c b/engine/common/matrixlib.c index 0f74c699..7ff3d74a 100644 --- a/engine/common/matrixlib.c +++ b/engine/common/matrixlib.c @@ -251,6 +251,47 @@ void Matrix3x4_Invert_Simple( matrix3x4 out, const matrix3x4 in1 ) out[2][3] = -(in1[0][3] * out[2][0] + in1[1][3] * out[2][1] + in1[2][3] * out[2][2]); } +void Matrix3x4_Transpose( matrix3x4 out, const matrix3x4 in1 ) +{ + // transpose only rotational component + out[0][0] = in1[0][0]; + out[0][1] = in1[1][0]; + out[0][2] = in1[2][0]; + out[1][0] = in1[0][1]; + out[1][1] = in1[1][1]; + out[1][2] = in1[2][1]; + out[2][0] = in1[0][2]; + out[2][1] = in1[1][2]; + out[2][2] = in1[2][2]; + + // copy origin + out[0][3] = in1[0][3]; + out[1][3] = in1[1][3]; + out[2][3] = in1[2][3]; +} + +/* +================== +Matrix3x4_TransformAABB +================== +*/ +void Matrix3x4_TransformAABB( const matrix3x4 world, const vec3_t mins, const vec3_t maxs, vec3_t absmin, vec3_t absmax ) +{ + vec3_t localCenter, localExtents; + vec3_t worldCenter, worldExtents; + + VectorAverage( mins, maxs, localCenter ); + VectorSubtract( maxs, localCenter, localExtents ); + + Matrix3x4_VectorTransform( world, localCenter, worldCenter ); + worldExtents[0] = DotProductAbs( localExtents, world[0] ); // auto-transposed! + worldExtents[1] = DotProductAbs( localExtents, world[1] ); + worldExtents[2] = DotProductAbs( localExtents, world[2] ); + + VectorSubtract( worldCenter, worldExtents, absmin ); + VectorAdd( worldCenter, worldExtents, absmax ); +} + const matrix4x4 matrix4x4_identity = { { 1, 0, 0, 0 }, // PITCH diff --git a/engine/server/sv_frame.c b/engine/server/sv_frame.c index 15a54ae1..b5361b0e 100644 --- a/engine/server/sv_frame.c +++ b/engine/server/sv_frame.c @@ -138,7 +138,7 @@ static void SV_AddEntitiesToPacket( edict_t *pViewEnt, edict_t *pClient, client_ } // if we are full, silently discard entities - if( ents->num_entities < MAX_VISIBLE_PACKET ) + if( ents->num_entities < ( MAX_VISIBLE_PACKET - 1 )) { ents->num_entities++; // entity accepted c_fullsend++; // debug counter