diff --git a/engine/client/cl_frame.c b/engine/client/cl_frame.c index a9f5698f..382a2b79 100644 --- a/engine/client/cl_frame.c +++ b/engine/client/cl_frame.c @@ -428,7 +428,9 @@ int CL_InterpolateModel( cl_entity_t *e ) if( cl.local.moving && cl.local.onground == e->index ) return 1; - t = cl.time - cl_interp->value; + if( cl.maxclients <= 1 && FBitSet( host.features, ENGINE_FIXED_FRAMERATE )) + t = cl.time - cl_serverframetime(); + else t = cl.time - cl_interp->value; CL_FindInterpolationUpdates( e, t, &ph0, &ph1 ); @@ -441,7 +443,7 @@ int CL_InterpolateModel( cl_entity_t *e ) if( t - t1 < 0.0f ) return 0; - if( t1 == 0.0f || ( VectorIsNull( ph1->origin ) && !VectorIsNull( ph0->origin ))) + if( t1 == 0.0f ) { VectorCopy( ph0->origin, e->origin ); VectorCopy( ph0->angles, e->angles ); diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 217b38d0..da478dc2 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -396,9 +396,76 @@ void CL_UpdateFrameLerp( void ) return; // compute last interpolation amount - cl.commands[(cls.netchan.outgoing_sequence - 1) & CL_UPDATE_MASK].frame_lerp = CL_LerpPoint(); + cl.lerpFrac = CL_LerpPoint(); + + cl.commands[(cls.netchan.outgoing_sequence - 1) & CL_UPDATE_MASK].frame_lerp = cl.lerpFrac; } +void CL_FindInterpolatedAddAngle( float t, float *frac, pred_viewangle_t **prev, pred_viewangle_t **next ) +{ + int i, i0, i1, imod; + float at; + + imod = cl.angle_position - 1; + i0 = (imod + 1) & ANGLE_MASK; + i1 = (imod + 0) & ANGLE_MASK; + + if( cl.predicted_angle[i0].starttime >= t ) + { + for( i = 0; i < ANGLE_BACKUP - 2; i++ ) + { + at = cl.predicted_angle[imod & ANGLE_MASK].starttime; + if( at == 0.0f ) break; + + if( at < t ) + { + i0 = (imod + 1) & ANGLE_MASK; + i1 = (imod + 0) & ANGLE_MASK; + break; + } + imod--; + } + } + + *next = &cl.predicted_angle[i0]; + *prev = &cl.predicted_angle[i1]; + + // avoid division by zero (probably this should never happens) + if((*prev)->starttime == (*next)->starttime ) + { + *prev = *next; + *frac = 0.0f; + return; + } + + // time spans the two entries + *frac = ( t - (*prev)->starttime ) / ((*next)->starttime - (*prev)->starttime ); + *frac = bound( 0.0f, *frac, 1.0f ); +} + +void CL_ApplyAddAngle( void ) +{ + float curtime = cl.time - cl_serverframetime(); + pred_viewangle_t *prev = NULL, *next = NULL; + float addangletotal = 0.0f; + float amove, frac = 0.0f; + + CL_FindInterpolatedAddAngle( curtime, &frac, &prev, &next ); + + if( prev && next ) + addangletotal = prev->total + frac * ( next->total - prev->total ); + else addangletotal = cl.prevaddangletotal; + + amove = addangletotal - cl.prevaddangletotal; + + // update input angles + cl.viewangles[YAW] += amove; + + // remember last total + cl.prevaddangletotal = addangletotal; +} + + /* ======================================================================= @@ -555,6 +622,7 @@ void CL_CreateCmd( void ) pcmd->processedfuncs = false; pcmd->heldback = false; pcmd->sendsize = 0; + CL_ApplyAddAngle(); } active = ( cls.state == ca_active && !cl.paused && !cls.demoplayback ); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 974fc341..010b47bb 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -1037,10 +1037,27 @@ add the view angle yaw */ void CL_ParseAddAngle( sizebuf_t *msg ) { - float add_angle; + pred_viewangle_t *a; + float delta_yaw; - add_angle = MSG_ReadBitAngle( msg, 16 ); - cl.viewangles[YAW] += add_angle; + delta_yaw = MSG_ReadBitAngle( msg, 16 ); + + if( cl.maxclients <= 1 && !FBitSet( host.features, ENGINE_FIXED_FRAMERATE )) + { + cl.viewangles[YAW] += delta_yaw; + return; + } + + // update running counter + cl.addangletotal += delta_yaw; + + // select entry into circular buffer + cl.angle_position = (cl.angle_position + 1) & ANGLE_MASK; + a = &cl.predicted_angle[cl.angle_position]; + + // record update + a->starttime = cl.mtime[0]; + a->total = cl.addangletotal; } /* diff --git a/engine/client/cl_pmove.c b/engine/client/cl_pmove.c index bd901ac1..dcc15d5e 100644 --- a/engine/client/cl_pmove.c +++ b/engine/client/cl_pmove.c @@ -248,7 +248,7 @@ void CL_CheckPredictionError( void ) // save for error interpolation VectorCopy( delta, cl.local.prediction_error ); - if(( dist > MIN_CORRECTION_DISTANCE ) && ( cl.maxclients > 1 )) + if(( dist > MIN_CORRECTION_DISTANCE ) && (( cl.maxclients > 1 ) || FBitSet( host.features, ENGINE_FIXED_FRAMERATE ))) cls.correction_time = cl_smoothtime->value; } } @@ -1329,7 +1329,7 @@ void CL_PredictMovement( qboolean repredicting ) VectorCopy( to->client.velocity, cl.simvel ); VectorCopy( to->playerstate.origin, cl.simorg ); VectorCopy( to->client.punchangle, cl.punchangle ); - VectorCopy( to->client.view_ofs, cl.viewheight) ; + VectorCopy( to->client.view_ofs, cl.viewheight ); } else { diff --git a/engine/client/client.h b/engine/client/client.h index cae40f52..54ca6a61 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -99,6 +99,13 @@ typedef struct runcmd_s int sendsize; } runcmd_t; +// add angles +typedef struct +{ + float starttime; + float total; +} pred_viewangle_t; + #define ANGLE_BACKUP 16 #define ANGLE_MASK (ANGLE_BACKUP - 1) @@ -176,6 +183,7 @@ typedef struct int delta_sequence; // acknowledged sequence number double mtime[2]; // the timestamp of the last two messages + float lerpFrac; int last_command_ack; int last_incoming_sequence; @@ -216,6 +224,11 @@ typedef struct int intermission; // don't change view angle, full screen, et vec3_t crosshairangle; + pred_viewangle_t predicted_angle[ANGLE_BACKUP];// accumulate angles from server + int angle_position; + float addangletotal; + float prevaddangletotal; + // predicted origin and velocity vec3_t simorg; vec3_t simvel; diff --git a/engine/client/gl_image.c b/engine/client/gl_image.c index f6708376..b0b1b69b 100644 --- a/engine/client/gl_image.c +++ b/engine/client/gl_image.c @@ -1178,7 +1178,7 @@ static qboolean GL_UploadTexture( gltexture_t *tex, rgbdata_t *pic ) if( !ImageDXT( pic->type ) && !FBitSet( tex->flags, TF_NOMIPMAP|TF_SKYSIDE )) data = GL_ApplyGamma( data, tex->width * tex->height * tex->depth, FBitSet( tex->flags, TF_NORMALMAP )); - if( !ImageDXT( pic->type ) && FBitSet( tex->flags, TF_HAS_ALPHA )) + if( !ImageDXT( pic->type ) && FBitSet( pic->flags, IMAGE_ONEBIT_ALPHA )) data = GL_ApplyFilter( data, tex->width, tex->height ); // mips will be auto-generated if desired diff --git a/engine/client/gl_rpart.c b/engine/client/gl_rpart.c index 83372530..090e53ad 100644 --- a/engine/client/gl_rpart.c +++ b/engine/client/gl_rpart.c @@ -1247,7 +1247,7 @@ void R_RocketTrail( vec3_t start, vec3_t end, int type ) VectorMAMAM( 1.0f, start, s, right, c, up, p->org ); VectorSubtract( start, p->org, p->vel ); VectorScale( p->vel, 2.0f, p->vel ); - VectorMA( p->vel, COM_RandomFloat( 96, 111 ), vec, p->vel ); + VectorMA( p->vel, COM_RandomFloat( 96.0f, 111.0f ), vec, p->vel ); p->ramp = COM_RandomLong( 0, 3 ); p->color = ramp3[(int)p->ramp]; p->type = pt_explode2; @@ -1474,6 +1474,7 @@ void R_TracerEffect( const vec3_t start, const vec3_t end ) { vec3_t pos, vel, dir; float len, speed; + float offset; speed = Q_max( tracerspeed->value, 3.0f ); @@ -1482,7 +1483,8 @@ void R_TracerEffect( const vec3_t start, const vec3_t end ) if( len == 0.0f ) return; VectorScale( dir, 1.0f / len, dir ); // normalize - VectorScale( dir, COM_RandomFloat( -10.0f, 9.0f ) + traceroffset->value, vel ); + offset = COM_RandomFloat( -10.0f, 9.0f ) + traceroffset->value; + VectorScale( dir, offset, vel ); VectorAdd( start, vel, pos ); VectorScale( dir, speed, vel ); diff --git a/engine/common/common.h b/engine/common/common.h index 694f2742..0dac9ffd 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -485,6 +485,7 @@ typedef enum IMAGE_QUAKESKY = BIT(6), // it's a quake sky double layered clouds (so keep it as 8 bit) IMAGE_DDS_FORMAT = BIT(7), // a hint for GL loader IMAGE_MULTILAYER = BIT(8), // to differentiate from 3D texture + IMAGE_ONEBIT_ALPHA = BIT(9), // binary alpha // Image_Process manipulation flags IMAGE_FLIP_X = BIT(16), // flip the image by width diff --git a/engine/common/imagelib/img_wad.c b/engine/common/imagelib/img_wad.c index 97ee9df7..b4ef98b3 100644 --- a/engine/common/imagelib/img_wad.c +++ b/engine/common/imagelib/img_wad.c @@ -163,7 +163,7 @@ qboolean Image_LoadMDL( const char *name, const byte *buffer, size_t filesize ) byte *pal = fin + pixels; Image_GetPaletteLMP( pal, LUMP_MASKED ); - image.flags |= IMAGE_HAS_ALPHA; + image.flags |= IMAGE_HAS_ALPHA|IMAGE_ONEBIT_ALPHA; } else Image_GetPaletteLMP( fin + pixels, LUMP_NORMAL ); } @@ -229,8 +229,9 @@ qboolean Image_LoadSPR( const char *name, const byte *buffer, size_t filesize ) // detect alpha-channel by palette type switch( image.d_rendermode ) { - case LUMP_GRADIENT: case LUMP_MASKED: + SetBits( image.flags, IMAGE_ONEBIT_ALPHA ); + case LUMP_GRADIENT: case LUMP_QUAKE1: SetBits( image.flags, IMAGE_HAS_ALPHA ); break; @@ -384,6 +385,7 @@ qboolean Image_LoadMIP( const char *name, const byte *buffer, size_t filesize ) if(( !host.decal_loading ) || ( pal[765] == 0 && pal[766] == 0 && pal[767] == 255 )) { rendermode = LUMP_MASKED; + image.flags |= IMAGE_ONEBIT_ALPHA; } else { @@ -454,6 +456,7 @@ qboolean Image_LoadMIP( const char *name, const byte *buffer, size_t filesize ) { if( fin[i] == 255 ) { + // don't set ONEBIT_ALPHA flag for some reasons image.flags |= IMAGE_HAS_ALPHA; break; } diff --git a/engine/engine.plg b/engine/engine.plg index deab5592..dbc611bd 100644 --- a/engine/engine.plg +++ b/engine/engine.plg @@ -6,7 +6,7 @@ --------------------Configuration: engine - Win32 Release--------------------

Command Lines

-Creating temporary file "C:\WINDOWS\TEMP\RSP6975.bat" with contents +Creating temporary file "C:\WINDOWS\TEMP\RSP75B3.bat" with contents [ @echo off copy \Xash3D\src_main\temp\engine\!release\xash.dll "D:\Xash3D\xash.dll" @@ -14,7 +14,7 @@ copy \Xash3D\src_main\temp\engine\!release\xash.dll "D:\Paranoia2\xash.dll" copy \Xash3D\src_main\temp\engine\!release\xash.dll "D:\Area51\xash.dll" copy \Xash3D\src_main\temp\engine\!release\xash.dll "D:\Quake\xash.dll" ] -Creating command line "C:\WINDOWS\TEMP\RSP6975.bat" +Creating command line "C:\WINDOWS\TEMP\RSP75B3.bat"

Output Window

Performing Custom Build Step on \Xash3D\src_main\temp\engine\!release\xash.dll Скопировано файлов: 1.