lowpass_limited(value.z, frac, limit, ref_store.z, ref_out.z); \
} MACRO_END
+bool autocvar_cl_followmodel_velocity_absolute;
void viewmodel_animate(entity this)
{
static float prevtime;
static vector gunorg_adjustment_lowpass;
vector vel;
- vector forward, right = '0 0 0', up = '0 0 0';
- MAKEVECTORS(makevectors, view_angles, forward, right, up);
- vel.x = view.velocity * forward;
- vel.y = view.velocity * right * -1;
- vel.z = view.velocity * up;
+ if(autocvar_cl_followmodel_velocity_absolute)
+ vel = view.velocity;
+ else
+ {
+ vector forward, right = '0 0 0', up = '0 0 0';
+ MAKEVECTORS(makevectors, view_angles, forward, right, up);
+ vel.x = view.velocity * forward;
+ vel.y = view.velocity * right * -1;
+ vel.z = view.velocity * up;
+ }
+
frac = avg_factor(autocvar_cl_followmodel_velocity_lowpass);
lowpass3_limited(vel, frac, autocvar_cl_followmodel_limit, vel_average, gunorg);
frac = avg_factor(autocvar_cl_followmodel_lowpass);
lowpass3(gunorg, frac, gunorg_adjustment_lowpass, gunorg);
+ if(autocvar_cl_followmodel_velocity_absolute)
+ {
+ vector fixed_gunorg;
+ vector forward, right = '0 0 0', up = '0 0 0';
+ MAKEVECTORS(makevectors, view_angles, forward, right, up);
+ fixed_gunorg.x = gunorg * forward;
+ fixed_gunorg.y = gunorg * right * -1;
+ fixed_gunorg.z = gunorg * up;
+ gunorg = fixed_gunorg;
+ }
+
this.origin += gunorg;
}
this.viewmodel_angles = this.angles;
}
anim_update(this);
- if (!this.animstate_override)
+ if (!this.animstate_override && !this.animstate_looping)
anim_set(this, this.anim_idle, true, false, false);
}
float f = 0; // 0..1; 0: fully active