From: terencehill Date: Wed, 23 Mar 2016 21:58:50 +0000 (+0100) Subject: Merge branch 'master' into terencehill/dynamic_hud X-Git-Tag: xonotic-v0.8.2~882^2~13 X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=f72821fdcebe3ca01181a99727a06198de65ea08 Merge branch 'master' into terencehill/dynamic_hud Conflicts: qcsrc/client/view.qc --- f72821fdcebe3ca01181a99727a06198de65ea08 diff --cc qcsrc/client/view.qc index f2c0204e5,8d001cb59..8aeac1926 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@@ -109,99 -114,17 +114,99 @@@ float autocvar_cl_leanmodel_lowpass = 0 highpass(value.z, frac, ref_store.z, ref_out.z); \ } MACRO_END -void viewmodel_animate(entity this) +void calc_followmodel_ofs(entity view) { - static float prevtime; - float frametime = (time - prevtime); - prevtime = time; + if(cl_followmodel_time == time) + return; // cl_followmodel_ofs already calculated for this frame - if (autocvar_chase_active) return; - if (STAT(HEALTH) <= 0) return; + float frac; + 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'; ++ vector forward = '0 0 0', 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; + } - entity view = CSQCModel_server2csqc(player_localentnum - 1); + vel.x = bound(vel_average.x - autocvar_cl_followmodel_limit, vel.x, vel_average.x + autocvar_cl_followmodel_limit); + vel.y = bound(vel_average.y - autocvar_cl_followmodel_limit, vel.y, vel_average.y + autocvar_cl_followmodel_limit); + vel.z = bound(vel_average.z - autocvar_cl_followmodel_limit, vel.z, vel_average.z + autocvar_cl_followmodel_limit); + + frac = avg_factor(autocvar_cl_followmodel_velocity_lowpass); + lowpass3(vel, frac, 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'; ++ vector forward = '0 0 0', 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; + } + + cl_followmodel_ofs = gunorg; + cl_followmodel_time = time; +} + +vector leanmodel_ofs(entity view) +{ + float frac; + vector gunangles = '0 0 0'; + static vector gunangles_prev = '0 0 0'; + static vector gunangles_highpass = '0 0 0'; + static vector gunangles_adjustment_highpass; + static vector gunangles_adjustment_lowpass; + + if (view.csqcmodel_teleported) + gunangles_prev = view_angles; + + // in the highpass, we _store_ the DIFFERENCE to the actual view angles... + gunangles_highpass += gunangles_prev; + PITCH(gunangles_highpass) += 360 * floor((PITCH(view_angles) - PITCH(gunangles_highpass)) / 360 + 0.5); + YAW(gunangles_highpass) += 360 * floor((YAW(view_angles) - YAW(gunangles_highpass)) / 360 + 0.5); + ROLL(gunangles_highpass) += 360 * floor((ROLL(view_angles) - ROLL(gunangles_highpass)) / 360 + 0.5); + frac = avg_factor(autocvar_cl_leanmodel_highpass1); + highpass2_limited(view_angles, frac, autocvar_cl_leanmodel_limit, gunangles_highpass, gunangles); + gunangles_prev = view_angles; + gunangles_highpass -= gunangles_prev; + + PITCH(gunangles) *= -autocvar_cl_leanmodel_speed; + YAW(gunangles) *= -autocvar_cl_leanmodel_speed; + + // we assume here: PITCH = 0, YAW = 1, ROLL = 2 + frac = avg_factor(autocvar_cl_leanmodel_highpass); + highpass2(gunangles, frac, gunangles_adjustment_highpass, gunangles); + frac = avg_factor(autocvar_cl_leanmodel_lowpass); + lowpass2(gunangles, frac, gunangles_adjustment_lowpass, gunangles); + gunangles.x = -gunangles.x; // pitch was inverted, now that actually matters + + return gunangles; +} + +vector bobmodel_ofs(entity view) +{ bool clonground = !(view.anim_implicit_state & ANIMIMPLICITSTATE_INAIR); static bool oldonground; static float hitgroundtime;