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