- vector gunorg = '0 0 0';
- static vector vel_average;
- static vector gunorg_prev = '0 0 0';
- static vector gunorg_adjustment_highpass;
- static vector gunorg_adjustment_lowpass;
-
- vector vel;
- 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);
-
- gunorg *= -autocvar_cl_followmodel_speed * 0.042;
-
- // perform highpass/lowpass on the adjustment vectors (turning velocity into acceleration!)
- // trick: we must do the lowpass LAST, so the lowpass vector IS the final vector!
- frac = avg_factor(autocvar_cl_followmodel_highpass);
- highpass3(gunorg, frac, gunorg_adjustment_highpass, 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;