X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fview.qc;h=70a4f2eeb1d579a0f894998cb4b999a902c5b5e2;hb=e0e847a336cdb7ab1fcb93d3cf3e1402b761a726;hp=debe7a5c1864bc312920bb8b2d8fb7619e955939;hpb=83b19b6695a6c24a24881d72a986bb3bc2abb757;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index debe7a5c1..70a4f2eeb 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -40,14 +40,15 @@ float autocvar_cl_bobmodel_up; float autocvar_cl_followmodel; float autocvar_cl_followmodel_speed = 0.3; -float autocvar_cl_followmodel_limit = 1000; +float autocvar_cl_followmodel_limit = 135; float autocvar_cl_followmodel_velocity_lowpass = 0.05; float autocvar_cl_followmodel_highpass = 0.05; float autocvar_cl_followmodel_lowpass = 0.03; +bool autocvar_cl_followmodel_velocity_absolute; float autocvar_cl_leanmodel; float autocvar_cl_leanmodel_speed = 0.3; -float autocvar_cl_leanmodel_limit = 1000; +float autocvar_cl_leanmodel_limit = 30; float autocvar_cl_leanmodel_highpass1 = 0.2; float autocvar_cl_leanmodel_highpass = 0.2; float autocvar_cl_leanmodel_lowpass = 0.05; @@ -82,12 +83,6 @@ float autocvar_cl_leanmodel_lowpass = 0.05; lowpass(value.y, frac, ref_store.y, ref_out.y); \ } MACRO_END -#define lowpass2_limited(value, frac, limit, ref_store, ref_out) MACRO_BEGIN \ -{ \ - lowpass_limited(value.x, frac, limit, ref_store.x, ref_out.x); \ - lowpass_limited(value.y, frac, limit, ref_store.y, ref_out.y); \ -} MACRO_END - #define highpass2(value, frac, ref_store, ref_out) MACRO_BEGIN \ { \ highpass(value.x, frac, ref_store.x, ref_out.x); \ @@ -114,21 +109,6 @@ float autocvar_cl_leanmodel_lowpass = 0.05; highpass(value.z, frac, ref_store.z, ref_out.z); \ } MACRO_END -#define highpass3_limited(value, frac, limit, ref_store, ref_out) MACRO_BEGIN \ -{ \ - highpass_limited(value.x, frac, limit, ref_store.x, ref_out.x); \ - highpass_limited(value.y, frac, limit, ref_store.y, ref_out.y); \ - highpass_limited(value.z, frac, limit, ref_store.z, ref_out.z); \ -} MACRO_END - -#define lowpass3_limited(value, frac, limit, ref_store, ref_out) MACRO_BEGIN \ -{ \ - lowpass_limited(value.x, frac, limit, ref_store.x, ref_out.x); \ - lowpass_limited(value.y, frac, limit, ref_store.y, ref_out.y); \ - 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; @@ -143,13 +123,11 @@ void viewmodel_animate(entity this) bool clonground = !(view.anim_implicit_state & ANIMIMPLICITSTATE_INAIR); static bool oldonground; static float hitgroundtime; - static float lastongroundtime; if (clonground) { float f = time; // cl.movecmd[0].time if (!oldonground) hitgroundtime = f; - lastongroundtime = f; } oldonground = clonground; @@ -177,8 +155,12 @@ void viewmodel_animate(entity this) vel.z = view.velocity * up; } + 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_limited(vel, frac, autocvar_cl_followmodel_limit, vel_average, gunorg); + lowpass3(vel, frac, vel_average, gunorg); gunorg *= -autocvar_cl_followmodel_speed * 0.042; @@ -254,35 +236,27 @@ void viewmodel_animate(entity this) { // calculate for swinging gun model // the gun bobs when running on the ground, but doesn't bob when you're in the air. - // Sajt: I tried to smooth out the transitions between bob and no bob, which works - // for the most part, but for some reason when you go through a message trigger or - // pick up an item or anything like that it will momentarily jolt the gun. - float bspeed; - float t = 1; - float s = time * autocvar_cl_bobmodel_speed; + static float bobmodel_scale = 0; + static float time_ofs = 0; // makes the effect always restart in the same way if (clonground) { - if (time - hitgroundtime < 0.2) - { - // just hit the ground, speed the bob back up over the next 0.2 seconds - t = time - hitgroundtime; - t = bound(0, t, 0.2); - t *= 5; - } + if (time - hitgroundtime > 0.05) + bobmodel_scale = min(1, bobmodel_scale + frametime * 5); } else + bobmodel_scale = max(0, bobmodel_scale - frametime * 5); + if(bobmodel_scale && xyspeed) { - // recently left the ground, slow the bob down over the next 0.2 seconds - t = time - lastongroundtime; - t = 0.2 - bound(0, t, 0.2); - t *= 5; - } - bspeed = xyspeed * 0.01; - vector gunorg = '0 0 0'; - gunorg.y += bspeed * autocvar_cl_bobmodel_side * autocvar_cl_viewmodel_scale * sin(s) * t; - gunorg.z += bspeed * autocvar_cl_bobmodel_up * autocvar_cl_viewmodel_scale * cos(s * 2) * t; + float bspeed = xyspeed * 0.01 * autocvar_cl_viewmodel_scale * bobmodel_scale; + float s = (time - time_ofs) * autocvar_cl_bobmodel_speed; + vector gunorg = '0 0 0'; + gunorg.y = bspeed * autocvar_cl_bobmodel_side * sin(s); + gunorg.z = bspeed * autocvar_cl_bobmodel_up * cos(s * 2); - this.origin += gunorg; + this.origin += gunorg; + } + else + time_ofs = time; } } @@ -364,94 +338,77 @@ void viewmodel_draw(entity this) entity viewmodel; STATIC_INIT(viewmodel) { viewmodel = new(viewmodel); - make_pure(viewmodel); } -entity porto; -vector polyline[16]; -void Porto_Draw(entity this) +void Porto_Draw(entity this); +STATIC_INIT(Porto) { - vector p, dir, ang, q, nextdir; - float portal_number, portal1_idx; - - if(activeweapon != WEP_PORTO || spectatee_status || gametype == MAPINFO_TYPE_NEXBALL) - return; - if(WEP_CVAR(porto, secondary)) - return; - if(intermission == 1) - return; - if(intermission == 2) - return; - if (STAT(HEALTH) <= 0) - return; + entity e = new_pure(porto); + e.draw = Porto_Draw; + e.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP; +} - dir = view_forward; +const int polyline_length = 16; +vector polyline[polyline_length]; +void Porto_Draw(entity this) +{ + if (activeweapon != WEP_PORTO) return; + if (spectatee_status) return; + if (WEP_CVAR(porto, secondary)) return; + if (intermission == 1) return; + if (intermission == 2) return; + if (STAT(HEALTH) <= 0) return; - if(angles_held_status) + vector pos = view_origin; + vector dir = view_forward; + if (angles_held_status) { makevectors(angles_held); dir = v_forward; } - p = view_origin; - - polyline[0] = p; - int idx = 1; - portal_number = 0; - nextdir = dir; + polyline[0] = pos; - for (;;) + int portal_number = 0, portal1_idx = 1, portal_max = 2; + int n = 1 + 2; // 2 lines == 3 points + for (int idx = 0; idx < n && idx < polyline_length - 1; ) { - dir = nextdir; - traceline(p, p + 65536 * dir, true, porto); - if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) - return; - nextdir = dir - 2 * (dir * trace_plane_normal) * trace_plane_normal; // mirror dir at trace_plane_normal - p = trace_endpos; - polyline[idx] = p; - ++idx; - if(idx >= 16) - return; - if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP) - continue; - ++portal_number; - ang = vectoangles2(trace_plane_normal, dir); - ang.x = -ang.x; - makevectors(ang); - if(!CheckWireframeBox(porto, p - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward)) - return; - if(portal_number == 1) + traceline(pos, pos + 65536 * dir, true, this); + dir = reflect(dir, trace_plane_normal); + pos = trace_endpos; + polyline[++idx] = pos; + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP) { - portal1_idx = idx; - if(portal_number >= 2) - break; + n += 1; + continue; } - } - - while(idx >= 2) - { - p = polyline[idx-2]; - q = polyline[idx-1]; - if(idx == 2) - p = p - view_up * 16; - if(idx-1 >= portal1_idx) + if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) { - Draw_CylindricLine(p, q, 4, "", 1, 0, '0 0 1', 0.5, DRAWFLAG_NORMAL, view_origin); + n = max(2, idx); + break; } - else + // check size { - Draw_CylindricLine(p, q, 4, "", 1, 0, '1 0 0', 0.5, DRAWFLAG_NORMAL, view_origin); + vector ang = vectoangles2(trace_plane_normal, dir); + ang.x = -ang.x; + makevectors(ang); + if (!CheckWireframeBox(this, pos - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward)) + { + n = max(2, idx); + break; + } } - --idx; + portal_number += 1; + if (portal_number >= portal_max) break; + if (portal_number == 1) portal1_idx = idx; + } + for (int idx = 0; idx < n - 1; ++idx) + { + vector p = polyline[idx], q = polyline[idx + 1]; + if (idx == 0) p -= view_up * 16; // line from player + vector rgb = (idx < portal1_idx) ? '1 0 0' : '0 0 1'; + Draw_CylindricLine(p, q, 4, "", 1, 0, rgb, 0.5, DRAWFLAG_NORMAL, view_origin); } -} - -void Porto_Init() -{ - porto = new(porto); - make_pure(porto); - porto.draw = Porto_Draw; - porto.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP; } float drawtime; @@ -616,12 +573,8 @@ const float SHOTTYPE_HITENEMY = 4; void TrueAim_Init() { - trueaim = new(trueaim); - make_pure(trueaim); - trueaim.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE; - trueaim_rifle = new(trueaim_rifle); - make_pure(trueaim_rifle); - trueaim_rifle.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE; + (trueaim = new_pure(trueaim)).dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE; + (trueaim_rifle = new_pure(trueaim_rifle)).dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE; } float EnemyHitCheck() @@ -1341,18 +1294,14 @@ void HUD_Crosshair() void HUD_Draw() { - vector rgb = '0 0 0'; - float a = 1; if (MUTATOR_CALLHOOK(HUD_Draw_overlay)) { - rgb = MUTATOR_ARGV(0, vector); - a = MUTATOR_ARGV(0, float); + drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, MUTATOR_ARGV(0, vector), autocvar_hud_colorflash_alpha * MUTATOR_ARGV(0, float), DRAWFLAG_ADDITIVE); } else if(STAT(FROZEN)) { - rgb = ((STAT(REVIVE_PROGRESS)) ? ('0.25 0.90 1' + ('1 0 0' * STAT(REVIVE_PROGRESS)) + ('0 1 1' * STAT(REVIVE_PROGRESS) * -1)) : '0.25 0.90 1'); + drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, ((STAT(REVIVE_PROGRESS)) ? ('0.25 0.90 1' + ('1 0 0' * STAT(REVIVE_PROGRESS)) + ('0 1 1' * STAT(REVIVE_PROGRESS) * -1)) : '0.25 0.90 1'), autocvar_hud_colorflash_alpha, DRAWFLAG_ADDITIVE); } - drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, rgb, autocvar_hud_colorflash_alpha * a, DRAWFLAG_ADDITIVE); if(!intermission) if(STAT(NADE_TIMER) && autocvar_cl_nade_timer) // give nade top priority, as it's a matter of life and death { @@ -1450,7 +1399,7 @@ void CSQC_UpdateView(float w, float h) if(myteam != prev_myteam) { myteamcolors = colormapPaletteColor(myteam, 1); - FOREACH(hud_panels, true, LAMBDA(it.update_time = time)); + FOREACH(hud_panels, true, it.update_time = time); prev_myteam = myteam; } @@ -1496,10 +1445,10 @@ void CSQC_UpdateView(float w, float h) if(ons_roundlost) { - FOREACH_ENTITY_CLASS("onslaught_generator", it.health <= 0, LAMBDA( + FOREACH_ENTITY_CLASS("onslaught_generator", it.health <= 0, { gen = it; break; - )); + }); if(!gen) ons_roundlost = false; // don't enforce the 3rd person camera if there is no dead generator to show } @@ -1865,7 +1814,7 @@ void CSQC_UpdateView(float w, float h) mousepos = mousepos*0.5 + getmousepos(); */ - FOREACH_ENTITY(it.draw, LAMBDA(it.draw(it))); + FOREACH_ENTITY(it.draw, it.draw(it)); addentities(MASK_NORMAL | MASK_ENGINE | MASK_ENGINEVIEWMODELS); renderscene(); @@ -2195,7 +2144,7 @@ void CSQC_UpdateView(float w, float h) } else */ // draw 2D entities - FOREACH_ENTITY(it.draw2d, LAMBDA(it.draw2d(it))); + FOREACH_ENTITY(it.draw2d, it.draw2d(it)); Draw_ShowNames_All(); Debug_Draw();