r4623 - in trunk/data: . qcsrc/client
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sat Oct 4 14:08:22 EDT 2008
Author: div0
Date: 2008-10-04 14:08:22 -0400 (Sat, 04 Oct 2008)
New Revision: 4623
Modified:
trunk/data/defaultNexuiz.cfg
trunk/data/qcsrc/client/teamradar.qc
Log:
more teamradar features (zoom mode)
Modified: trunk/data/defaultNexuiz.cfg
===================================================================
--- trunk/data/defaultNexuiz.cfg 2008-10-04 14:32:14 UTC (rev 4622)
+++ trunk/data/defaultNexuiz.cfg 2008-10-04 18:08:22 UTC (rev 4623)
@@ -1148,4 +1148,5 @@
seta cl_teamradar_scale 4096
seta cl_teamradar_rotation 0 // rotation mode: you set what points up. 0 = player, 1 = west, 2 = south, 3 = east, 4 = north
seta cl_teamradar_size 128
+seta cl_teamradar_zoommode 0 // zoom mode: 0 = zoomed by default, 1 = zoomed when +zoom, 2 = always zoomed, 3 = always zoomed out
alias cl_teamradar_rotate "toggle cl_teamradar_rotation 0 1 2 3 4"
Modified: trunk/data/qcsrc/client/teamradar.qc
===================================================================
--- trunk/data/qcsrc/client/teamradar.qc 2008-10-04 14:32:14 UTC (rev 4622)
+++ trunk/data/qcsrc/client/teamradar.qc 2008-10-04 18:08:22 UTC (rev 4623)
@@ -3,13 +3,18 @@
vector teamradar_origin2d; // 2D origin
vector teamradar_size2d; // 2D size
float teamradar_size; // 2D scale factor
-float teamradar_scale; // window size = ...qu
+float cl_teamradar_scale; // window size = ...qu
-float vlen_maxnorm(vector v)
+float vlen_maxnorm2d(vector v)
{
- return max6(v_x, v_y, v_z, -v_x, -v_y, -v_z);
+ return max4(v_x, v_y, -v_x, -v_y);
}
+float vlen_minnorm2d(vector v)
+{
+ return min(max(v_x, -v_x), max(v_y, -v_y));
+}
+
vector teamradar_3dcoord_to_texcoord(vector in)
{
vector out;
@@ -108,55 +113,96 @@
}
}
+float cl_teamradar_scale;
+float cl_teamradar_background_alpha;
+float cl_teamradar_rotation;
+float cl_teamradar_size;
+float cl_teamradar_zoommode;
+
+void teamradar_loadcvars()
+{
+ cl_teamradar_scale = cvar("cl_teamradar_scale");
+ cl_teamradar_background_alpha = cvar("cl_teamradar_background_alpha");
+ cl_teamradar_rotation = cvar("cl_teamradar_rotation");
+ cl_teamradar_size = cvar("cl_teamradar_size");
+ cl_teamradar_zoommode = cvar("cl_teamradar_zoommode");
+
+ if(!cl_teamradar_scale) cl_teamradar_scale = 4096;
+ if(!cl_teamradar_background_alpha) cl_teamradar_background_alpha = 0.75;
+ if(!cl_teamradar_rotation) cl_teamradar_rotation = 0;
+ if(!cl_teamradar_size) cl_teamradar_size = 128;
+ if(!cl_teamradar_zoommode) cl_teamradar_zoommode = 0;
+}
+
void() teamradar_view =
{
local float color;
local vector rgb;
local entity tm;
float scale2d, normalsize, bigsize;
- float a, f, sz;
+ float f;
- color = GetPlayerColor(player_localentnum-1);
- rgb = GetTeamRGB(color);
+ teamradar_loadcvars();
- scale2d = max(
- mi_picmax_x - mi_picmin_x,
- mi_picmax_y - mi_picmin_y
- );
+ switch(cl_teamradar_zoommode)
+ {
+ default:
+ case 0:
+ f = current_zoomfraction;
+ break;
+ case 1:
+ f = 1 - current_zoomfraction;
+ break;
+ case 2:
+ f = 0;
+ break;
+ case 3:
+ f = 1;
+ break;
+ }
- f = current_zoomfraction;
- teamradar_scale = cvar("cl_teamradar_scale");
- a = cvar("cl_teamradar_background_alpha");
- teamradar_angle = cvar("cl_teamradar_rotation") * 90;
- sz = cvar("cl_teamradar_size");
+ switch(cl_teamradar_rotation)
+ {
+ case 0:
+ teamradar_angle = input_angles_y - 90;
+ break;
+ default:
+ teamradar_angle = 90 * cl_teamradar_rotation;
+ break;
+ }
- // fix undefined cvars first
- if(!teamradar_scale)
- teamradar_scale = 4096;
- if(!a)
- a = 0.75;
- if(!sz)
- sz = 128;
+ scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin);
+ teamradar_size2d = '1 1 0' * cl_teamradar_size;
+ teamradar_origin2d = 0.5 * teamradar_size2d;
- if(teamradar_scale < 0)
+ // pixels per world qu to match the teamradar_size2d_x range in the longest dimension
+ if(cl_teamradar_rotation == 0)
{
- f = 1 - f;
- teamradar_scale = -teamradar_scale;
+ // max-min distance must fit the radar in any rotation
+ bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen(mi_max - mi_min));
}
+ else
+ {
+ vector c0, c1, c2, c3, span;
+ c0 = rotate(mi_min, teamradar_angle * DEG2RAD);
+ c1 = rotate(mi_max, teamradar_angle * DEG2RAD);
+ c2 = rotate('1 0 0' * mi_min_x + '0 1 0' * mi_max_y, teamradar_angle * DEG2RAD);
+ c3 = rotate('1 0 0' * mi_max_x + '0 1 0' * mi_min_y, teamradar_angle * DEG2RAD);
+ span = '0 0 0';
+ span_x = max4(c0_x, c1_x, c2_x, c3_x) - min4(c0_x, c1_x, c2_x, c3_x);
+ span_y = max4(c0_y, c1_y, c2_y, c3_y) - min4(c0_y, c1_y, c2_y, c3_y);
- if(!teamradar_angle)
- teamradar_angle = input_angles_y - 90;
- teamradar_size2d = '1 1 0' * sz;
- teamradar_origin2d = 0.5 * teamradar_size2d;
+ // max-min distance must fit the radar in x=x, y=y
+ bigsize = min(
+ teamradar_size2d_x * scale2d / (1.05 * span_x),
+ teamradar_size2d_y * scale2d / (1.05 * span_y)
+ );
+ }
- normalsize = teamradar_size2d_x * scale2d / teamradar_scale;
-
- if(cvar("cl_teamradar_rotation"))
- bigsize = teamradar_size2d_x * scale2d / (1.05 * vlen_maxnorm(mi_min - mi_max));
- else
- bigsize = teamradar_size2d_x * scale2d / (1.05 * vlen(mi_min - mi_max));
+ normalsize = vlen_maxnorm2d(teamradar_size2d) * scale2d / cl_teamradar_scale;
if(bigsize > normalsize)
normalsize = bigsize;
+
teamradar_size =
f * bigsize
+ (1 - f) * normalsize;
@@ -164,6 +210,9 @@
f * (mi_min + mi_max) * 0.5
+ (1 - f) * pmove_org);
+ color = GetPlayerColor(player_localentnum-1);
+ rgb = GetTeamRGB(color);
+
drawsetcliparea(
teamradar_origin2d_x - teamradar_size2d_x * 0.5,
teamradar_origin2d_y - teamradar_size2d_y * 0.5,
@@ -171,7 +220,7 @@
teamradar_size2d_y
);
- draw_teamradar_background(a);
+ draw_teamradar_background(cl_teamradar_background_alpha);
for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); )
draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm.teamradar_time, tm.teamradar_color, tm.alpha);
for(tm = gps_start; tm != world; tm = tm.chain)
More information about the nexuiz-commits
mailing list