X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud%2Fpanel%2Fphysics.qc;h=400249eb5473b8fc67403d04ae74ca62abdb6340;hb=cf41044c9d897080866da6e0ca39d807e094e23e;hp=5fc8c1ca9018cba6b656bf6628d4c59a9edd59bc;hpb=0ff1afbe6825c541b231fb4c4cfcbf60cbb5ecd7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud/panel/physics.qc b/qcsrc/client/hud/panel/physics.qc index 5fc8c1ca9..400249eb5 100644 --- a/qcsrc/client/hud/panel/physics.qc +++ b/qcsrc/client/hud/panel/physics.qc @@ -1,159 +1,164 @@ #include "physics.qh" +#include +#include +#include #include #include #include -// Physics panel (#15) +// Physics (#15) vector acc_prevspeed; float acc_prevtime, acc_avg, top_speed, top_speed_time; float physics_update_time, discrete_speed, discrete_acceleration; void HUD_Physics() { - if(!autocvar__hud_configure) - { - if(!autocvar_hud_panel_physics) return; - if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return; - if(autocvar_hud_panel_physics == 3 && !(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return; + if (!autocvar__hud_configure) { + if (!autocvar_hud_panel_physics) { return; } + if (spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) { return; } + if (autocvar_hud_panel_physics == 3 && !(gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) { return; } } - HUD_Panel_UpdateCvars(); + HUD_Panel_LoadCvars(); draw_beginBoldFont(); - if (autocvar_hud_panel_physics_dynamichud) + if (autocvar_hud_panel_physics_dynamichud) { HUD_Scale_Enable(); - else + } else { HUD_Scale_Disable(); - HUD_Panel_DrawBg(1); - if(panel_bg_padding) - { + } + HUD_Panel_DrawBg(); + if (panel_bg_padding) { panel_pos += '1 1 0' * panel_bg_padding; panel_size -= '2 2 0' * panel_bg_padding; } float acceleration_progressbar_scale = 0; - if(autocvar_hud_panel_physics_progressbar && autocvar_hud_panel_physics_acceleration_progressbar_scale > 1) + if (autocvar_hud_panel_physics_progressbar && autocvar_hud_panel_physics_acceleration_progressbar_scale > 1) { acceleration_progressbar_scale = autocvar_hud_panel_physics_acceleration_progressbar_scale; + } float text_scale; - if (autocvar_hud_panel_physics_text_scale <= 0) + if (autocvar_hud_panel_physics_text_scale <= 0) { text_scale = 1; - else + } else { text_scale = min(autocvar_hud_panel_physics_text_scale, 1); + } - //compute speed + // compute speed float speed, conversion_factor = GetSpeedUnitFactor(autocvar_hud_panel_physics_speed_unit); string unit = GetSpeedUnit(autocvar_hud_panel_physics_speed_unit); vector vel = (csqcplayer ? csqcplayer.velocity : pmove_vel); - float max_speed = floor( autocvar_hud_panel_physics_speed_max * conversion_factor + 0.5 ); - if (autocvar__hud_configure) - speed = floor( max_speed * 0.65 + 0.5 ); - else if(autocvar_hud_panel_physics_speed_vertical) - speed = floor( vlen(vel) * conversion_factor + 0.5 ); - else - speed = floor( vlen(vel - vel.z * '0 0 1') * conversion_factor + 0.5 ); + float max_speed = floor(autocvar_hud_panel_physics_speed_max * conversion_factor + 0.5); + if (autocvar__hud_configure) { + speed = floor(max_speed * 0.65 + 0.5); + } else if (autocvar_hud_panel_physics_speed_vertical) { + speed = floor(vlen(vel) * conversion_factor + 0.5); + } else { + speed = floor(vlen(vel - vel.z * '0 0 1') * conversion_factor + 0.5); + } - //compute acceleration + // compute acceleration float acceleration, f; - if (autocvar__hud_configure) + if (autocvar__hud_configure) { acceleration = autocvar_hud_panel_physics_acceleration_max * 0.3; - else - { + } else { // 1 m/s = 0.0254 qu/s; 1 g = 9.80665 m/s^2 f = time - acc_prevtime; - if(autocvar_hud_panel_physics_acceleration_vertical) + if (autocvar_hud_panel_physics_acceleration_vertical) { acceleration = (vlen(vel) - vlen(acc_prevspeed)); - else + } else { acceleration = (vlen(vel - '0 0 1' * vel.z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed.z)); + } acceleration = acceleration * (1 / max(0.0001, f)) * (0.0254 / 9.80665); acc_prevspeed = vel; acc_prevtime = time; - if(autocvar_hud_panel_physics_acceleration_movingaverage) - { + if (autocvar_hud_panel_physics_acceleration_movingaverage) { f = bound(0, f * 10, 1); acc_avg = acc_avg * (1 - f) + acceleration * f; acceleration = acc_avg; } } - int acc_decimals = 2; - if(time > physics_update_time) - { + const int acc_decimals = 2; + if (time > physics_update_time) { // workaround for ftos_decimals returning a negative 0 - if(discrete_acceleration > -1 / pow(10, acc_decimals) && discrete_acceleration < 0) + if (discrete_acceleration > -1 / POW(10, acc_decimals) && discrete_acceleration < 0) { discrete_acceleration = 0; + } discrete_acceleration = acceleration; discrete_speed = speed; physics_update_time += autocvar_hud_panel_physics_update_interval; + if (physics_update_time < time) { + physics_update_time = time + autocvar_hud_panel_physics_update_interval; + } } - //compute layout - float panel_ar = panel_size.x/panel_size.y; + // compute layout + float panel_ar = panel_size.x / panel_size.y; vector speed_offset = '0 0 0', acceleration_offset = '0 0 0'; - if (panel_ar >= 5 && !acceleration_progressbar_scale) - { + if (panel_ar >= 5 && !acceleration_progressbar_scale) { panel_size.x *= 0.5; - if (autocvar_hud_panel_physics_flip) + if (autocvar_hud_panel_physics_flip) { speed_offset.x = panel_size.x; - else + } else { acceleration_offset.x = panel_size.x; - } - else - { + } + } else { panel_size.y *= 0.5; - if (autocvar_hud_panel_physics_flip) + if (autocvar_hud_panel_physics_flip) { speed_offset.y = panel_size.y; - else + } else { acceleration_offset.y = panel_size.y; + } } int speed_baralign, acceleration_baralign; - if (autocvar_hud_panel_physics_baralign == 1) + if (autocvar_hud_panel_physics_baralign == 1) { acceleration_baralign = speed_baralign = 1; - else if(autocvar_hud_panel_physics_baralign == 4) + } else if (autocvar_hud_panel_physics_baralign == 4) { acceleration_baralign = speed_baralign = 2; - else if (autocvar_hud_panel_physics_flip) - { + } else if (autocvar_hud_panel_physics_flip) { acceleration_baralign = (autocvar_hud_panel_physics_baralign == 2); speed_baralign = (autocvar_hud_panel_physics_baralign == 3); - } - else - { + } else { speed_baralign = (autocvar_hud_panel_physics_baralign == 2); acceleration_baralign = (autocvar_hud_panel_physics_baralign == 3); } - if (autocvar_hud_panel_physics_acceleration_progressbar_mode == 0) - acceleration_baralign = 3; //override hud_panel_physics_baralign value for acceleration - - //draw speed - if(speed) - if(autocvar_hud_panel_physics_progressbar == 1 || autocvar_hud_panel_physics_progressbar == 2) - HUD_Panel_DrawProgressBar(panel_pos + speed_offset, panel_size, "progressbar", speed/max_speed, 0, speed_baralign, autocvar_hud_progressbar_speed_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + if (autocvar_hud_panel_physics_acceleration_progressbar_mode == 0) { + acceleration_baralign = 3; // override hud_panel_physics_baralign value for acceleration + } + // draw speed + if (speed) { + if (autocvar_hud_panel_physics_progressbar == 1 || autocvar_hud_panel_physics_progressbar == 2) { + HUD_Panel_DrawProgressBar(panel_pos + speed_offset, panel_size, "progressbar", speed / max_speed, 0, speed_baralign, autocvar_hud_progressbar_speed_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } + } vector tmp_offset = '0 0 0', tmp_size = '0 0 0'; - if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 2) - { + if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 2) { tmp_size.x = panel_size.x * 0.75; tmp_size.y = panel_size.y * text_scale; - if (speed_baralign) + if (speed_baralign) { tmp_offset.x = panel_size.x - tmp_size.x; - //else - //tmp_offset_x = 0; + } + // else + // tmp_offset_x = 0; tmp_offset.y = (panel_size.y - tmp_size.y) / 2; drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(discrete_speed), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); - //draw speed unit - if (speed_baralign) + // draw speed unit + if (speed_baralign) { tmp_offset.x = 0; - else + } else { tmp_offset.x = tmp_size.x; - if (autocvar_hud_panel_physics_speed_unit_show) - { - //tmp_offset_y = 0; + } + if (autocvar_hud_panel_physics_speed_unit_show) { + // tmp_offset_y = 0; tmp_size.x = panel_size.x * (1 - 0.75); tmp_size.y = panel_size.y * 0.4 * text_scale; tmp_offset.y = (panel_size.y * 0.4 - tmp_size.y) / 2; @@ -161,104 +166,97 @@ void HUD_Physics() } } - //compute and draw top speed - if (autocvar_hud_panel_physics_topspeed) - if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 2) - { - if (autocvar__hud_configure) - { - top_speed = floor( max_speed * 0.75 + 0.5 ); - f = 1; - } - else - { - if (speed >= top_speed) - { - top_speed = speed; - top_speed_time = time; - } - if (top_speed != 0) - { - f = max(1, autocvar_hud_panel_physics_topspeed_time); - // divide by f to make it start from 1 - f = cos( ((time - top_speed_time) / f) * PI/2 ); - } - else //hide top speed 0, it would be stupid - f = 0; - } - if (f > 0) - { - //top speed progressbar peak - if(speed < top_speed) - if(autocvar_hud_panel_physics_progressbar == 1 || autocvar_hud_panel_physics_progressbar == 2) - { - float peak_offsetX; - vector peak_size = '0 0 0'; - if (speed_baralign == 0) - peak_offsetX = min(top_speed, max_speed)/max_speed * panel_size.x; - else if (speed_baralign == 1) - peak_offsetX = (1 - min(top_speed, max_speed)/max_speed) * panel_size.x; - else // if (speed_baralign == 2) - peak_offsetX = min(top_speed, max_speed)/max_speed * panel_size.x * 0.5; - peak_size.x = floor(panel_size.x * 0.01 + 1.5); - peak_size.y = panel_size.y; - if (speed_baralign == 2) // draw two peaks, on both sides - { - drawfill(panel_pos + speed_offset + eX * (0.5 * panel_size.x + peak_offsetX - peak_size.x), peak_size, autocvar_hud_progressbar_speed_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - drawfill(panel_pos + speed_offset + eX * (0.5 * panel_size.x - peak_offsetX + peak_size.x), peak_size, autocvar_hud_progressbar_speed_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); - } - else - drawfill(panel_pos + speed_offset + eX * (peak_offsetX - peak_size.x), peak_size, autocvar_hud_progressbar_speed_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + // compute and draw top speed + if (autocvar_hud_panel_physics_topspeed) { + if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 2) { + if (autocvar__hud_configure) { + top_speed = floor(max_speed * 0.75 + 0.5); + f = 1; + } else { + if (speed >= top_speed) { + top_speed = speed; + top_speed_time = time; + } + if (top_speed != 0) { + f = max(1, autocvar_hud_panel_physics_topspeed_time); + // divide by f to make it start from 1 + f = cos(((time - top_speed_time) / f) * PI / 2); + } else { // hide top speed 0, it would be stupid + f = 0; + } } + if (f > 0) { + // top speed progressbar peak + if (speed < top_speed) { + if (autocvar_hud_panel_physics_progressbar == 1 || autocvar_hud_panel_physics_progressbar == 2) { + float peak_offsetX; + vector peak_size = '0 0 0'; + if (speed_baralign == 0) { + peak_offsetX = min(top_speed, max_speed) / max_speed * panel_size.x; + } else if (speed_baralign == 1) { + peak_offsetX = (1 - min(top_speed, max_speed) / max_speed) * panel_size.x; + } else { // if (speed_baralign == 2) + peak_offsetX = min(top_speed, max_speed) / max_speed * panel_size.x * 0.5; + } + peak_size.x = floor(panel_size.x * 0.01 + 1.5); + peak_size.y = panel_size.y; + if (speed_baralign == 2) { // draw two peaks, on both sides + drawfill(panel_pos + speed_offset + eX * (0.5 * panel_size.x + peak_offsetX - peak_size.x), peak_size, autocvar_hud_progressbar_speed_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + drawfill(panel_pos + speed_offset + eX * (0.5 * panel_size.x - peak_offsetX + peak_size.x), peak_size, autocvar_hud_progressbar_speed_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } else { + drawfill(panel_pos + speed_offset + eX * (peak_offsetX - peak_size.x), peak_size, autocvar_hud_progressbar_speed_color, f * autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } + } + } - //top speed - tmp_offset.y = panel_size.y * 0.4; - tmp_size.x = panel_size.x * (1 - 0.75); - tmp_size.y = (panel_size.y - tmp_offset.y) * text_scale; - tmp_offset.y += (panel_size.y - tmp_offset.y - tmp_size.y) / 2; - drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(top_speed), tmp_size, '1 0 0', f * panel_fg_alpha, DRAWFLAG_NORMAL); + // top speed + tmp_offset.y = panel_size.y * 0.4; + tmp_size.x = panel_size.x * (1 - 0.75); + tmp_size.y = (panel_size.y - tmp_offset.y) * text_scale; + tmp_offset.y += (panel_size.y - tmp_offset.y - tmp_size.y) / 2; + drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(top_speed), tmp_size, '1 0 0', f * panel_fg_alpha, DRAWFLAG_NORMAL); + } else { + top_speed = 0; + } } - else - top_speed = 0; } - //draw acceleration - if(acceleration) - if(autocvar_hud_panel_physics_progressbar == 1 || autocvar_hud_panel_physics_progressbar == 3) - { - vector progressbar_color; - if(acceleration < 0) - progressbar_color = autocvar_hud_progressbar_acceleration_neg_color; - else - progressbar_color = autocvar_hud_progressbar_acceleration_color; + // draw acceleration + if (acceleration) { + if (autocvar_hud_panel_physics_progressbar == 1 || autocvar_hud_panel_physics_progressbar == 3) { + vector progressbar_color; + if (acceleration < 0) { + progressbar_color = autocvar_hud_progressbar_acceleration_neg_color; + } else { + progressbar_color = autocvar_hud_progressbar_acceleration_color; + } - f = acceleration/autocvar_hud_panel_physics_acceleration_max; - if (autocvar_hud_panel_physics_acceleration_progressbar_nonlinear) - f = (f >= 0 ? sqrt(f) : -sqrt(-f)); + f = acceleration / autocvar_hud_panel_physics_acceleration_max; + if (autocvar_hud_panel_physics_acceleration_progressbar_nonlinear) { + f = (f >= 0 ? sqrt(f) : -sqrt(-f)); + } - if (acceleration_progressbar_scale) // allow progressbar to go out of panel bounds - { - tmp_size = acceleration_progressbar_scale * panel_size.x * eX + panel_size.y * eY; + if (acceleration_progressbar_scale) { // allow progressbar to go out of panel bounds + tmp_size = acceleration_progressbar_scale * panel_size.x * eX + panel_size.y * eY; - if (acceleration_baralign == 1) - tmp_offset.x = panel_size.x - tmp_size.x; - else if (acceleration_baralign == 2 || acceleration_baralign == 3) - tmp_offset.x = (panel_size.x - tmp_size.x) / 2; - else - tmp_offset.x = 0; - tmp_offset.y = 0; - } - else - { - tmp_size = panel_size; - tmp_offset = '0 0 0'; - } + if (acceleration_baralign == 1) { + tmp_offset.x = panel_size.x - tmp_size.x; + } else if (acceleration_baralign == 2 || acceleration_baralign == 3) { + tmp_offset.x = (panel_size.x - tmp_size.x) / 2; + } else { + tmp_offset.x = 0; + } + tmp_offset.y = 0; + } else { + tmp_size = panel_size; + tmp_offset = '0 0 0'; + } - HUD_Panel_DrawProgressBar(panel_pos + acceleration_offset + tmp_offset, tmp_size, "accelbar", f, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + HUD_Panel_DrawProgressBar(panel_pos + acceleration_offset + tmp_offset, tmp_size, "accelbar", f, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); + } } - if(autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 3) - { + if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 3) { tmp_size.x = panel_size.x; tmp_size.y = panel_size.y * text_scale; tmp_offset.x = 0;