06 Apr 2010

This commit is contained in:
g-cont 2010-04-06 00:00:00 +04:00 committed by Alibek Omarov
parent 432fa48d5d
commit a2af66a059
16 changed files with 460 additions and 600 deletions

View File

@ -190,7 +190,6 @@ int HUD_Redraw( float flTime, int state )
void HUD_UpdateEntityVars( edict_t *ent, const entity_state_t *state, const entity_state_t *prev )
{
int i;
float m_fLerp;
if( state->ed_type == ED_CLIENT && state->ed_flags & ESF_NO_PREDICTION )
@ -247,6 +246,8 @@ void HUD_UpdateEntityVars( edict_t *ent, const entity_state_t *state, const enti
// monster's steps will be interpolated on render-side
ent->v.origin = state->origin;
ent->v.angles = state->angles;
ent->v.oldorigin = prev->origin; // used for lerp 'monster view'
ent->v.oldangles = prev->angles; // used for lerp 'monster view'
break;
default:
ent->v.angles = LerpAngle( prev->angles, state->angles, m_fLerp );
@ -260,32 +261,26 @@ void HUD_UpdateEntityVars( edict_t *ent, const entity_state_t *state, const enti
ent->v.rendercolor = LerpPoint( prev->rendercolor, state->rendercolor, m_fLerp );
ent->v.renderamt = LerpPoint( prev->renderamt, state->renderamt, m_fLerp );
// auto-animation uses v.frame for hold ending frame
if(!( ent->v.effects & EF_ANIMATE ))
if( ent->v.animtime )
{
if( ent->v.animtime )
{
// use normal studio lerping
ent->v.frame = state->frame;
}
else
{
// sprite frames will be interpolated in other place
ent->v.frame = Q_rint( state->frame );
}
// use normal studio lerping
ent->v.frame = state->frame;
}
else
{
// round sprite and brushmodel frames
ent->v.frame = Q_rint( state->frame );
}
switch( state->ed_type )
{
case ED_CLIENT:
for( i = 0; i < 3; i++ )
{
ent->v.punchangle[i] = LerpAngle( prev->punch_angles[i], state->punch_angles[i], m_fLerp);
ent->v.viewangles[i] = LerpAngle( prev->viewangles[i], state->viewangles[i], m_fLerp);
ent->v.view_ofs[i] = LerpAngle( prev->viewoffset[i], state->viewoffset[i], m_fLerp);
}
ent->v.punchangle = LerpAngle( prev->punch_angles, state->punch_angles, m_fLerp );
ent->v.viewangles = LerpAngle( prev->viewangles, state->viewangles, m_fLerp );
ent->v.view_ofs = LerpPoint( prev->viewoffset, state->viewoffset, m_fLerp );
if( prev->fov < 90 && state->fov == 90 ) ent->v.fov = state->fov; // fov is reset, so don't lerping
if( prev->fov != 90.0f && state->fov == 90.0f )
ent->v.fov = state->fov; // fov is reset, so don't lerping
else ent->v.fov = LerpPoint( prev->fov, state->fov, m_fLerp );
ent->v.maxspeed = state->maxspeed;
@ -334,17 +329,15 @@ void HUD_UpdateEntityVars( edict_t *ent, const entity_state_t *state, const enti
break;
}
for( i = 0; i < MAXSTUDIOBLENDS; i++ )
{
ent->v.blending[i] = LerpByte( prev->blending[i], state->blending[i], m_fLerp );
}
int i;
// copy blendings
for( i = 0; i < MAXSTUDIOBLENDS; i++ )
ent->v.blending[i] = state->blending[i];
// copy controllers
for( i = 0; i < MAXSTUDIOCONTROLLERS; i++ )
{
if( abs( prev->controller[i] - state->controller[i] ) > 128 )
ent->v.controller[i] = state->controller[i];
else ent->v.controller[i] = LerpByte( prev->controller[i], state->controller[i], m_fLerp );
}
ent->v.controller[i] = state->controller[i];
// g-cont. moved here because we may needs apply null scale to skyportal
if( ent->v.scale == 0.0f ) ent->v.scale = 1.0f;

View File

@ -595,14 +595,19 @@ void V_CalcCameraRefdef( ref_params_t *pparams )
if( viewentity )
{
dstudiohdr_t *viewmonster = (dstudiohdr_t *)GetModelPtr( viewentity );
float m_fLerp = GetLerpFrac();
v_origin = viewentity->v.origin;
if( viewentity->v.movetype == MOVETYPE_STEP )
v_origin = LerpPoint( viewentity->v.oldorigin, viewentity->v.origin, m_fLerp );
else v_origin = viewentity->v.origin; // already interpolated
// calc monster view if supposed
if( gHUD.viewFlags & MONSTER_VIEW && viewmonster )
v_origin += viewmonster->eyeposition;
v_angles = viewentity->v.angles;
if( viewentity->v.movetype == MOVETYPE_STEP )
v_angles = LerpAngle( viewentity->v.oldangles, viewentity->v.angles, m_fLerp );
else v_angles = viewentity->v.angles; // already interpolated
if( gHUD.viewFlags & INVERSE_X ) // inverse X coordinate
v_angles[0] = -v_angles[0];
@ -615,19 +620,24 @@ void V_CalcCameraRefdef( ref_params_t *pparams )
}
else if( GetEntityByIndex( pparams->viewentity ) != GetLocalPlayer( ))
{
// this is a viewentity sets with SET_VIEW builtin
// this is a viewentity which sets by SET_VIEW builtin
edict_t *viewentity = GetEntityByIndex( pparams->viewentity );
if( viewentity )
{
dstudiohdr_t *viewmonster = (dstudiohdr_t *)GetModelPtr( viewentity );
float m_fLerp = GetLerpFrac();
v_origin = viewentity->v.origin;
if( viewentity->v.movetype == MOVETYPE_STEP )
v_origin = LerpPoint( viewentity->v.oldorigin, viewentity->v.origin, m_fLerp );
else v_origin = viewentity->v.origin; // already interpolated
// calc monster view if supposed
if( viewentity->v.flags & FL_MONSTER && viewmonster )
v_origin += viewmonster->eyeposition;
v_angles = viewentity->v.angles;
if( viewentity->v.movetype == MOVETYPE_STEP )
v_angles = LerpAngle( viewentity->v.oldangles, viewentity->v.angles, m_fLerp );
else v_angles = viewentity->v.angles; // already interpolated
if( viewentity->v.flags & FL_PROJECTILE ) // inverse X coordinate
v_angles[0] = -v_angles[0];

View File

@ -158,13 +158,13 @@
#define EF_ROTATE (1<<8) // rotate bonus item
#define EF_MINLIGHT (1<<9) // allways have some light (viewmodel)
#define EF_FULLBRIGHT (1<<10) // completely ignore light values
#define EF_ANIMATE (1<<11) // do client animate (ignore v.frame)
#define EF_STUDIOLAMBERT (1<<11) // use alternative studiomodels lighting
#define EF_NOSHADOW (1<<12) // ignore shadow for this entity
#define EF_PLANARSHADOW (1<<13) // use fast planarshadow method instead of shadow casters
#define EF_OCCLUSIONTEST (1<<14) // use occlusion test for this entity (e.g. glares)
#define EF_LASERSPOT (1<<15) // tempentity laserspot at attachment #1 from player or npc
#define EF_NOMIRRORS (1<<16) // entity won't reflecting in mirrors
#define EF_ONLYMIRRORS (1<<17) // entity will be drawing only in mirrors
#define EF_NOREFLECT (1<<16) // entity won't reflecting in mirrors
#define EF_REFLECTONLY (1<<17) // entity will be drawing only in mirrors
// The explosion effect has some flags to control performance/aesthetic features:
#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion

View File

@ -29,6 +29,7 @@ typedef struct entvars_s
vec3_t movedir;
vec3_t angles; // ENG [all], NET [all]
vec3_t oldangles; // ENG [all], NET [all]
vec3_t avelocity; // angular velocity (degrees per second)
vec3_t punchangle; // NET [player], auto-decaying view angle adjustment
vec3_t viewangles; // NET [player], viewing angle (old name was v_angle)

View File

@ -42,7 +42,7 @@ struct tempent_s
{
int flags;
float die;
float m_flFrameMax;
float m_flFrameMax; // this is also animtime for studiomodels
float x, y;
vec3_t m_vecVelocity; // tent velocity
vec3_t m_vecAvelocity; // tent avelocity

View File

@ -1836,12 +1836,12 @@ static void pfnWeaponAnim( int iAnim, int body, float framerate )
{
edict_t *viewmodel = &clgame.viewent;
viewmodel->v.sequence = iAnim;
viewmodel->v.body = body;
viewmodel->v.animtime = clgame.globals->time; // start immediately
viewmodel->v.framerate = framerate;
viewmodel->v.effects |= EF_ANIMATE;
viewmodel->v.frame = -1; // force to start new sequence
viewmodel->v.sequence = iAnim;
viewmodel->v.frame = 0.0f;
viewmodel->v.scale = 1.0f;
viewmodel->v.body = body;
}
/*

View File

@ -747,8 +747,6 @@ void Host_InitCommon( const int argc, const char **argv )
Host_InitEvents();
sys_sharedstrings = Cvar_Get( "sys_sharedstrings", "0", CVAR_SYSTEMINFO, "hl1 strings or stringtable" );
FS_LoadGameInfo( NULL );
Image_Init( GI->texmode, -1 );
@ -855,6 +853,7 @@ void Host_Init( const int argc, const char **argv )
Cmd_AddCommand ( "net_error", Net_Error_f, "send network bad message from random place");
}
sys_sharedstrings = Cvar_Get( "sys_sharedstrings", "0", CVAR_INIT|CVAR_ARCHIVE, "hl1 compatible strings" );
host_cheats = Cvar_Get( "sv_cheats", "1", CVAR_SYSTEMINFO, "allow cheat variables to enable" );
host_minfps = Cvar_Get( "host_minfps", "10", CVAR_ARCHIVE, "host fps lower limit" );
host_maxfps = Cvar_Get( "host_maxfps", "100", CVAR_ARCHIVE, "host fps upper limit" );
@ -863,7 +862,7 @@ void Host_Init( const int argc, const char **argv )
host_registered = Cvar_Get( "registered", "1", CVAR_SYSTEMINFO, "indicate shareware version of game" );
timescale = Cvar_Get( "timescale", "1.0", 0, "slow-mo timescale" );
s = va("^1Xash %g ^3%s", GI->version, buildstring );
s = va( "^1Xash %g ^3%s", GI->version, buildstring );
Cvar_Get( "version", s, CVAR_INIT, "engine current version" );
NET_Init();

View File

@ -238,7 +238,7 @@ UI_PlayerSetup_Ownerdraw
static void UI_PlayerSetup_Ownerdraw( void *self )
{
menuCommon_s *item = (menuCommon_s *)self;
float realtime = uiStatic.realTime * 0.001f;
float realtime = uiStatic.realTime * 0.001f;
// draw the background
UI_FillRect( item->x, item->y, item->width, item->height, uiPromptBgColor );
@ -249,7 +249,6 @@ static void UI_PlayerSetup_Ownerdraw( void *self )
V_ClearScene();
// update renderer timings
uiPlayerSetup.ent.v.animtime = realtime;
uiPlayerSetup.refdef.time = realtime;
uiPlayerSetup.refdef.frametime = cls.frametime;
@ -395,12 +394,13 @@ static void UI_PlayerSetup_Init( void )
uiPlayerSetup.refdef.flags = RDF_NOWORLDMODEL;
uiPlayerSetup.ent.serialnumber = MAX_EDICTS - 1;
uiPlayerSetup.ent.v.animtime = uiStatic.realTime * 0.001f; // start animation
uiPlayerSetup.ent.v.sequence = 1;
uiPlayerSetup.ent.v.scale = 1.0f;
uiPlayerSetup.ent.v.frame = -1.0f;
uiPlayerSetup.ent.v.frame = 0.0f;
uiPlayerSetup.ent.v.framerate = 1.0f;
uiPlayerSetup.ent.v.modelindex = MAX_MODELS - 1;
uiPlayerSetup.ent.v.effects |= (EF_ANIMATE|EF_FULLBRIGHT);
uiPlayerSetup.ent.v.effects |= EF_FULLBRIGHT;
uiPlayerSetup.ent.v.controller[0] = 127;
uiPlayerSetup.ent.v.controller[1] = 127;
uiPlayerSetup.ent.v.controller[2] = 127;

View File

@ -25,7 +25,7 @@
*/
#define Matrix3x3_LoadIdentity( mat ) Matrix3x3_Copy( mat, matrix3x3_identity )
static const matrix3x3 matrix3x3_identity =
static matrix3x3 matrix3x3_identity =
{
{ 1, 0, 0 }, // PITCH [forward]
{ 0, 1, 0 }, // YAW [right]
@ -282,7 +282,7 @@ _inline void Matrix3x3_ConcatRotate( matrix3x3 out, float angle, float x, float
#define Matrix4x4_LoadIdentity( mat ) Matrix4x4_Copy( mat, matrix4x4_identity )
#define Matrix4x4_Copy( out, in ) Mem_Copy( out, in, sizeof( matrix4x4 ))
static const matrix4x4 matrix4x4_identity =
static matrix4x4 matrix4x4_identity =
{
{ 1, 0, 0, 0 }, // PITCH
{ 0, 1, 0, 0 }, // YAW

View File

@ -95,12 +95,10 @@ typedef struct
float gaitframe; // client->frame + yaw
float gaityaw; // local value
// EF_ANIMATE stuff
int m_fSequenceLoops; // sequence is looped
int m_fSequenceFinished;// sequence is finished
float m_flFrameRate; // looped sequence framerate
float m_flGroundSpeed; // looped sequence ground speed (movement)
float m_flLastEventCheck; // last time when event is checked
// EVENT SPECIFIC
float m_flPrevEventFrame; // previous event frame
int m_iEventSequence; // current event sequence
} lerpframe_t;
typedef struct

View File

@ -30,6 +30,7 @@ TYPEDESCRIPTION gEntvarsDescription[] =
DEFINE_ENTITY_FIELD( movedir, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( angles, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( oldangles, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( avelocity, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( punchangle, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( viewangles, FIELD_VECTOR ),

View File

@ -458,6 +458,7 @@ TYPEDESCRIPTION gEntvarsDescription[] =
DEFINE_ENTITY_FIELD( movedir, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( angles, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( oldangles, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( avelocity, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( punchangle, FIELD_VECTOR ),
DEFINE_ENTITY_FIELD( viewangles, FIELD_VECTOR ),

View File

@ -30,4 +30,5 @@ Xash 0.71 Beta 05.05.10
6. fix save\restore global state OK
7. rewrite WalkMove OK
8. tune UPDATE_BACKUP value for singleplayer OK
9. fix monsters interpolation
9. fix monsters interpolation OK
10.

View File

@ -753,8 +753,6 @@ bool R_CullSpriteModel( ref_entity_t *e );
void R_AddStudioModelToList( ref_entity_t *e );
void R_DrawStudioModel( const meshbuffer_t *mb );
void R_StudioResetSequenceInfo( ref_entity_t *ent );
float R_StudioFrameAdvance( ref_entity_t *ent, float flInterval );
void R_StudioModelBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs );
bool R_CullStudioModel( ref_entity_t *e );
void R_StudioRunEvents( ref_entity_t *e );

View File

@ -2330,25 +2330,8 @@ bool R_AddGenericEntity( edict_t *pRefEntity, ref_entity_t *refent )
// check model
if( !refent->model ) return false;
switch( refent->model->type )
{
case mod_world:
case mod_brush:
if( !refent->model->extradata )
return false;
refent->scale = 1.0f; // ignore scale for brush models
refent->frame = pRefEntity->v.frame; // brush properly animating
break;
case mod_studio:
case mod_sprite:
if( !refent->model->extradata )
return false;
break;
case mod_bad: // let the render drawing null model
break;
}
refent->lerp = ri.GetLerpFrame( refent->index ); // get pointer to lerping frame data
// get pointer to lerping frame data
refent->lerp = ri.GetLerpFrame( refent->index );
if( refent->lerp == NULL )
{
@ -2362,31 +2345,24 @@ bool R_AddGenericEntity( edict_t *pRefEntity, ref_entity_t *refent )
VectorCopy( pRefEntity->v.origin, refent->lightingOrigin );
refent->lightingOrigin[2] += 1;
// do animate
if( refent->flags & EF_ANIMATE )
switch( refent->model->type )
{
switch( refent->model->type )
{
case mod_sprite:
if(((msprite_t *)refent->model->extradata)->numframes > 1 )
{
float numframes = ((msprite_t *)refent->model->extradata)->numframes;
refent->lerp->curstate.frame += (pRefEntity->v.framerate * RI.refdef.frametime);
if( refent->lerp->curstate.frame > numframes && numframes > 0 )
refent->lerp->curstate.frame = fmod( refent->lerp->curstate.frame, numframes );
}
break;
case mod_studio:
case mod_brush:
case mod_world:
break;
}
}
else
{
refent->lerp->latched.frame = refent->lerp->curstate.frame; // save oldframe
case mod_world:
case mod_brush:
if( !refent->model->extradata )
return false;
refent->scale = 1.0f; // ignore scale for brush models
refent->frame = pRefEntity->v.frame; // brush properly animating
break;
case mod_studio:
case mod_sprite:
if( !refent->model->extradata )
return false;
refent->frame = 0.0f; // keep clear to prevent randomly change skins :-)
refent->lerp->curstate.frame = pRefEntity->v.frame;
break;
case mod_bad: // let the render drawing null model
break;
}
// calculate angles
@ -2679,8 +2655,6 @@ bool R_AddTeEntToScene( TEMPENTITY *pTempEntity, int ed_type, shader_t customSha
else refent->customShader = NULL;
refent->rtype = RT_MODEL;
refent->lerp->latched.frame = refent->lerp->curstate.frame; // save oldframe
refent->lerp->curstate.frame = pTempEntity->m_flFrame;
// setup light origin

File diff suppressed because it is too large Load Diff