r3015 - in trunk/data/qcsrc/menu-div0test: . nexuiz

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Dec 10 05:46:15 EST 2007


Author: div0
Date: 2007-12-10 05:46:15 -0500 (Mon, 10 Dec 2007)
New Revision: 3015

Added:
   trunk/data/qcsrc/menu-div0test/nexuiz/playermodel.c
Modified:
   trunk/data/qcsrc/menu-div0test/classes.c
   trunk/data/qcsrc/menu-div0test/draw.qc
   trunk/data/qcsrc/menu-div0test/draw.qh
   trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c
Log:
add player model selector; add function draw_CenterText


Modified: trunk/data/qcsrc/menu-div0test/classes.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/classes.c	2007-12-09 23:48:41 UTC (rev 3014)
+++ trunk/data/qcsrc/menu-div0test/classes.c	2007-12-10 10:46:15 UTC (rev 3015)
@@ -50,3 +50,4 @@
 #include "nexuiz/maplist.c"
 #include "nexuiz/image.c"
 #include "nexuiz/crosshairbutton.c"
+#include "nexuiz/playermodel.c"

Modified: trunk/data/qcsrc/menu-div0test/draw.qc
===================================================================
--- trunk/data/qcsrc/menu-div0test/draw.qc	2007-12-09 23:48:41 UTC (rev 3014)
+++ trunk/data/qcsrc/menu-div0test/draw.qc	2007-12-10 10:46:15 UTC (rev 3015)
@@ -227,6 +227,10 @@
 	else
 		drawstring(boxToGlobal(theOrigin, draw_shift, draw_scale), theText, boxToGlobalSize(theSize, draw_scale), theColor, theAlpha * draw_alpha, 0);
 }
+void draw_CenterText(vector theOrigin, string theText, vector theSize, vector theColor, float theAlpha, float ICanHasKallerz)
+{
+	draw_Text(theOrigin - eX * theSize_x * 0.5 * draw_TextWidth(theText, ICanHasKallerz), theText, theSize, theColor, theAlpha, ICanHasKallerz);
+}
 
 float draw_TextWidth(string theText, float ICanHasKallerz)
 {

Modified: trunk/data/qcsrc/menu-div0test/draw.qh
===================================================================
--- trunk/data/qcsrc/menu-div0test/draw.qh	2007-12-09 23:48:41 UTC (rev 3014)
+++ trunk/data/qcsrc/menu-div0test/draw.qh	2007-12-10 10:46:15 UTC (rev 3015)
@@ -13,6 +13,7 @@
 void draw_Picture(vector origin, string pic, vector size, vector color, float alpha);
 void draw_Fill(vector theOrigin, vector theSize, vector theColor, float theAlpha);
 void draw_Text(vector origin, string text, vector size, vector color, float alpha, float allowColorCodes);
+void draw_CenterText(vector origin, string text, vector size, vector color, float alpha, float allowColorCodes);
 float draw_TextWidth(string text, float allowColorCodes);
 string draw_TextShortenToWidth(string text, float maxWidth, float allowColorCodes);
 float draw_TextLengthUpToWidth(string text, float maxWidth, float allowColorCodes);

Modified: trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c	2007-12-09 23:48:41 UTC (rev 3014)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c	2007-12-10 10:46:15 UTC (rev 3015)
@@ -19,7 +19,7 @@
 }
 void fillNexuizPlayerSettingsTab(entity me)
 {
-	entity e;
+	entity e, pms;
 	float i, n;
 
 	me.TR(me);
@@ -34,6 +34,15 @@
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Pants Color:"));
 		for(i = 0; i < n; ++i)
 			me.TDNoMargin(me, 1, 2 / n, e = makeNexuizColorButton(2, 1, i), '1 0 0');
+	me.TR(me);
+		pms = makeNexuizPlayerModelSelector();
+		me.TD(me, 1, 0.5, e = makeNexuizButton("<<", '0 0 0'));
+			e.onClick = PlayerModelSelector_Prev_Click;
+			e.onClickEntity = pms;
+		me.TD(me, me.rows - me.currentRow - 1, 2.5, pms);
+		me.TD(me, 1, 0.5, e = makeNexuizButton(">>", '0 0 0'));
+			e.onClick = PlayerModelSelector_Next_Click;
+			e.onClickEntity = pms;
 
 	me.gotoXY(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Field of View:"));

Added: trunk/data/qcsrc/menu-div0test/nexuiz/playermodel.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/playermodel.c	                        (rev 0)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/playermodel.c	2007-12-10 10:46:15 UTC (rev 3015)
@@ -0,0 +1,201 @@
+#ifdef INTERFACE
+CLASS(NexuizPlayerModelSelector) EXTENDS(NexuizImage)
+	METHOD(NexuizPlayerModelSelector, configureNexuizPlayerModelSelector, void(entity))
+	METHOD(NexuizPlayerModelSelector, loadCvars, void(entity))
+	METHOD(NexuizPlayerModelSelector, saveCvars, void(entity))
+	METHOD(NexuizPlayerModelSelector, draw, void(entity))
+	METHOD(NexuizPlayerModelSelector, resizeNotify, void(entity, vector, vector, vector, vector))
+	ATTRIB(NexuizPlayerModelSelector, currentModel, string, string_null)
+	ATTRIB(NexuizPlayerModelSelector, currentSkin, float, 0)
+	ATTRIB(NexuizPlayerModelSelector, currentModelName, string, string_null)
+	ATTRIB(NexuizPlayerModelSelector, currentModelTitle, string, string_null)
+	ATTRIB(NexuizPlayerModelSelector, currentModelTxtName, string, string_null)
+	ATTRIB(NexuizPlayerModelSelector, currentModelDescription, string, string_null)
+	ATTRIB(NexuizPlayerModelSelector, cvarName, string, "_cl_playermodel")
+	METHOD(NexuizPlayerModelSelector, go, void(entity, float))
+	ATTRIB(NexuizPlayerModelSelector, origin, vector, '0 0 0')
+	ATTRIB(NexuizPlayerModelSelector, size, vector, '0 0 0')
+	ATTRIB(NexuizPlayerModelSelector, realFontSize, vector, '0 0 0')
+	ATTRIB(NexuizPlayerModelSelector, fontSize, float, SKINFONTSIZE_NORMAL)
+	ATTRIB(NexuizPlayerModelSelector, titleFontSize, float, SKINFONTSIZE_TITLE)
+ENDCLASS(NexuizPlayerModelSelector)
+entity makeNexuizPlayerModelSelector();
+void PlayerModelSelector_Next_Click(entity btn, entity me);
+void PlayerModelSelector_Prev_Click(entity btn, entity me);
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizPlayerModelSelector()
+{
+	entity me;
+	me = spawnNexuizPlayerModelSelector();
+	me.configureNexuizPlayerModelSelector(me);
+	return me;
+}
+
+void configureNexuizPlayerModelSelectorNexuizPlayerModelSelector(entity me)
+{
+	me.configureNexuizImage(me, string_null, 263.0/360.0);
+	me.loadCvars(me);
+}
+
+void loadCvarsNexuizPlayerModelSelector(entity me)
+{
+	float glob, i, fh;
+	string fn;
+	string nm, t, l;
+
+	if(me.currentModel)
+		strunzone(me.currentModel);
+	if(me.currentModelTitle)
+		strunzone(me.currentModelTitle);
+	if(me.currentModelName)
+		strunzone(me.currentModelName);
+	if(me.currentModelTxtName)
+		strunzone(me.currentModelTxtName);
+	if(me.currentModelDescription)
+		strunzone(me.currentModelDescription);
+	me.currentSkin = cvar("_cl_playerskin");
+	me.currentModel = strzone(cvar_string("_cl_playermodel"));
+	me.currentModelName = string_null;
+	me.currentModelDescription = string_null;
+	me.currentModelTitle = string_null;
+	me.currentModelTxtName = string_null;
+
+	// lookup model name
+	glob = search_begin("models/player/*.txt", TRUE, TRUE);
+	if(glob < 0)
+		return;
+	for(i = 0; i < search_getsize(glob); ++i)
+	{
+		fn = search_getfilename(glob, i);
+		fh = fopen(fn, FILE_READ);
+		if(fh < 0)
+			continue;
+		t = fgets(fh);
+		nm = fgets(fh);
+		if(stof(fgets(fh)) == me.currentSkin)
+		if(fgets(fh) == me.currentModel)
+		{
+			me.currentModelName = strzone(strcat("/", nm));
+			me.currentModelTxtName = strzone(fn);
+			me.currentModelTitle = strzone(t);
+			me.currentModelDescription = "";
+			while((l = fgets(fh)))
+			{
+				if(me.currentModelDescription != "")
+					me.currentModelDescription = strcat(me.currentModelDescription, "\n");
+				me.currentModelDescription = strcat(me.currentModelDescription, l);
+			}
+			me.currentModelDescription = strzone(me.currentModelDescription);
+			fclose(fh);
+			break;
+		}
+		fclose(fh);
+	}
+	search_end(glob);
+}
+
+void goNexuizPlayerModelSelector(entity me, float d)
+{
+	float glob, i, fh;
+	string l;
+
+	glob = search_begin("models/player/*.txt", TRUE, TRUE);
+	if(glob < 0)
+		return;
+	for(i = 0; i < search_getsize(glob); ++i)
+		if(search_getfilename(glob, i) == me.currentModelTxtName)
+			break;
+	// now i is search_getsize(glob) if not found, and the right index if found.
+	if(i == search_getsize(glob))
+	{
+		if(d < 0)
+			i = search_getsize(glob) - 1;
+		else
+			i = 0;
+	}
+	else
+	{
+		i = mod(i + d + search_getsize(glob), search_getsize(glob));
+	}
+
+	if(me.currentModel)
+		strunzone(me.currentModel);
+	if(me.currentModelTitle)
+		strunzone(me.currentModelTitle);
+	if(me.currentModelName)
+		strunzone(me.currentModelName);
+	if(me.currentModelTxtName)
+		strunzone(me.currentModelTxtName);
+	if(me.currentModelDescription)
+		strunzone(me.currentModelDescription);
+
+	// select model #i!
+	me.currentModelTxtName = strzone(search_getfilename(glob, i));
+	fh = fopen(me.currentModelTxtName, FILE_READ);
+	search_end(glob);
+	if(fh < 0)
+		return;
+	me.currentModelTitle = strzone(fgets(fh));
+	me.currentModelName = strzone(strcat("/", fgets(fh)));
+	me.currentSkin = stof(fgets(fh));
+	me.currentModel = strzone(fgets(fh));
+	me.currentModelDescription = "";
+	while((l = fgets(fh)))
+	{
+		if(me.currentModelDescription != "")
+			me.currentModelDescription = strcat(me.currentModelDescription, "\n");
+		me.currentModelDescription = strcat(me.currentModelDescription, l);
+	}
+	me.currentModelDescription = strzone(me.currentModelDescription);
+	fclose(fh);
+}
+
+void PlayerModelSelector_Next_Click(entity btn, entity me)
+{
+	me.go(me, +1);
+	me.saveCvars(me);
+}
+
+void PlayerModelSelector_Prev_Click(entity btn, entity me)
+{
+	me.go(me, -1);
+	me.saveCvars(me);
+}
+
+void saveCvarsNexuizPlayerModelSelector(entity me)
+{
+	// TODO rather set the _cl ones and apply later?
+	localcmd(strcat("playermodel ", me.currentModel, "\nplayerskin ", ftos(me.currentSkin), "\n"));
+}
+
+void drawNexuizPlayerModelSelector(entity me)
+{
+	float i, n;
+	vector o;
+
+	me.src = me.currentModelName;
+	drawImage(me);
+	me.src = string_null;
+
+	// draw text on the image, handle \n in the description
+	draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), '1 1 1', 1, FALSE);
+
+	o = '0.5 1 0' - eY * me.realFontSize_y * ((n = tokenizebyseparator(me.currentModelDescription, "\n")) + 0.5);
+	for(i = 0; i < n; ++i)
+	{
+		draw_CenterText(o, argv(i), me.realFontSize, '1 1 1', 1, FALSE);
+		o += eY * me.realFontSize_y;
+	}
+}
+
+void resizeNotifyNexuizPlayerModelSelector(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+	resizeNotifyImage(me, relOrigin, relSize, absOrigin, absSize);
+	me.origin = absOrigin;
+	me.size = absSize;
+	me.realFontSize_y = me.fontSize / absSize_y;
+	me.realFontSize_x = me.fontSize / absSize_x;
+}
+#endif




More information about the nexuiz-commits mailing list