r676 - trunk/game

black at icculus.org black at icculus.org
Mon Mar 13 17:08:52 EST 2006


Author: black
Date: 2006-03-13 17:08:52 -0500 (Mon, 13 Mar 2006)
New Revision: 676

Modified:
   trunk/game/m_menucore.c
   trunk/game/m_menucore.h
Log:
Renamed addpos to origin.
Renamed DrawMenu to Draw.
Added a Frame callback to Menu_Item and added support for it to Menu_SubMenu.


Modified: trunk/game/m_menucore.c
===================================================================
--- trunk/game/m_menucore.c	2006-03-13 21:28:38 UTC (rev 675)
+++ trunk/game/m_menucore.c	2006-03-13 22:08:52 UTC (rev 676)
@@ -152,13 +152,17 @@
 
 
 //generic items
+void Menu_Generic_Frame(Menu_Item *item, Menu_Inheritance *inh, Ndouble elaspedtime)
+{
+}
+
 void Menu_Generic_MouseMoveSelectable(Menu_Item *item, Menu_Inheritance *inh)
 {
 	NUint j;
 
 	for (j = 0; j < 2; j++)
 	{
-		if (Input.mouse[j] < item->pos[j]+inh->addpos[j] || item->pos[j]+inh->addpos[j] + item->size[j] < Input.mouse[j] )
+		if (Input.mouse[j] < item->pos[j]+inh->origin[j] || item->pos[j]+inh->origin[j] + item->size[j] < Input.mouse[j] )
 			return;
 	}
 
@@ -192,6 +196,7 @@
 
 	item = Mem_Alloc(Menu.menu_zone, bytes);
 
+	item->Frame = Menu_Generic_Frame;
 	item->MouseMove = Menu_Generic_MouseMoveNonSelectable;
 	item->KeyEvent = Menu_Generic_KeyPressIgnore;
 	item->Destroy = Menu_Generic_Destroy;
@@ -218,7 +223,7 @@
 {
 	R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	R_SetTexture(R.resource_font);
-	R_DrawString(item->text, 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+	R_DrawString(item->text, 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
 }
 void Menu_Text_DefaultUse (struct Menu_TextItem *item, void *cookie)
 {
@@ -240,7 +245,7 @@
 	Menu_TextItem *it;
 	it = (Menu_TextItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_TextItem));
 
-	it->super.DrawMenu = Menu_Text_Draw;
+	it->super.Draw = Menu_Text_Draw;
 	if (command != NULL)
 	{
 		it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
@@ -269,9 +274,9 @@
 {
 	R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	R_SetTexture(R.resource_font);
-	R_DrawString(item->text, 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+	R_DrawString(item->text, 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
 	if (item->super.parent->selecteditem == &item->super)
-		R_DrawString("_", 0, item->super.pos[0] + inh->addpos[0] + item->cursorpos*8, item->super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, 0);
+		R_DrawString("_", 0, item->super.pos[0] + inh->origin[0] + item->cursorpos*8, item->super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, 0);
 }
 Nbool Menu_Edit_KeyPress (Menu_EditItem *item, UNUSED NUint mod, NUint sym, NUint character, Nbool downevent)
 {
@@ -349,7 +354,7 @@
 	Menu_EditItem *it;
 	it = (Menu_EditItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_EditItem));
 
-	it->super.DrawMenu = Menu_Edit_Draw;
+	it->super.Draw = Menu_Edit_Draw;
 	it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
 	it->super.KeyEvent = Menu_Edit_KeyPress;
 	it->super.size[0] = 8*strlen(text);
@@ -378,7 +383,7 @@
 {
 	item->super.super.size[0]-=8;
 	Menu_Edit_Draw(&item->super, inh);
-	R_DrawString("V", 0, item->super.super.pos[0] + item->super.super.size[0] + inh->addpos[0], item->super.super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.super.parent->selecteditem == &item->super.super);
+	R_DrawString("V", 0, item->super.super.pos[0] + item->super.super.size[0] + inh->origin[0], item->super.super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.super.parent->selecteditem == &item->super.super);
 	item->super.super.size[0]+=8;
 }
 
@@ -474,7 +479,7 @@
 	Menu_ComboItem *it;
 	it = (Menu_ComboItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_ComboItem));
 
-	it->super.super.DrawMenu = Menu_Combo_Draw;
+	it->super.super.Draw = Menu_Combo_Draw;
 	it->super.super.MouseMove = Menu_Generic_MouseMoveSelectable;
 	it->super.super.KeyEvent = Menu_Combo_KeyPress;
 	it->super.super.Destroy = Menu_Combo_Destroy;
@@ -527,7 +532,7 @@
 	R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	R_SetColor(1, 1, 1, 1);
 	R_SetTexture(Resource_IndexForName(item->imagename, RESOURCETYPE_TEXTURE, 0, 0));
-	R_DrawPic(item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->super.size[0], item->super.size[1]);
+	R_DrawPic(item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->super.size[0], item->super.size[1]);
 }
 void Menu_Picture_DefaultUse (struct Menu_PictureItem *item, void *cookie)
 {
@@ -551,7 +556,7 @@
 	Menu_PictureItem *it;
 	it = (Menu_PictureItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_PictureItem));
 
-	it->super.DrawMenu = Menu_Picture_Draw;
+	it->super.Draw = Menu_Picture_Draw;
 	if (command != NULL)
 	{
 		it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
@@ -586,12 +591,12 @@
 //	R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 //	R_SetColor(1, 1, 1, 1);
 //	R_SetTexture(Resource_IndexForName(item->imagename, RESOURCETYPE_TEXTURE, 0, 0));
-//	R_DrawPic(item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->super.size[0], item->super.size[1]);
+//	R_DrawPic(item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->super.size[0], item->super.size[1]);
 
 	if (Menu.grabs == &item->super)
 	{
 		{
-			item->value = Input.mouse[item->axis] - (item->super.pos[item->axis]+inh->addpos[item->axis] + item->scale*1.5);
+			item->value = Input.mouse[item->axis] - (item->super.pos[item->axis]+inh->origin[item->axis] + item->scale*1.5);
 			if (item->value < 0)
 				item->value = 0;
 			if (item->value > item->super.size[item->axis] - item->scale*3)
@@ -615,15 +620,15 @@
 
 	if (item->axis == 0)
 	{
-		R_DrawString("x", 0, item->super.pos[0] + inh->addpos[0] + item->scale + (item->super.size[0]-item->scale*3)*frac, item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
-		R_DrawString("<", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
-		R_DrawString(">", 0, item->super.pos[0] + inh->addpos[0] - item->scale + (item->super.size[0]), item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+		R_DrawString("x", 0, item->super.pos[0] + inh->origin[0] + item->scale + (item->super.size[0]-item->scale*3)*frac, item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+		R_DrawString("<", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+		R_DrawString(">", 0, item->super.pos[0] + inh->origin[0] - item->scale + (item->super.size[0]), item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
 	}
 	else
 	{
-		R_DrawString("x", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1] + item->scale + (item->super.size[1]-item->scale*3)*frac, item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
-		R_DrawString("A", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
-		R_DrawString("V", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1] - item->scale + (item->super.size[1]), item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+		R_DrawString("x", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1] + item->scale + (item->super.size[1]-item->scale*3)*frac, item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+		R_DrawString("A", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+		R_DrawString("V", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1] - item->scale + (item->super.size[1]), item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
 	}
 }
 Nbool Menu_Slider_KeyPress (Menu_SliderItem *item, UNUSED NUint mod, NUint sym, UNUSED NUint character, Nbool downevent)
@@ -661,7 +666,7 @@
 	Menu_SliderItem *it;
 	it = (Menu_SliderItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_SliderItem));
 
-	it->super.DrawMenu = Menu_Slider_Draw;
+	it->super.Draw = Menu_Slider_Draw;
 	it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
 	it->super.KeyEvent = Menu_Slider_KeyPress;
 
@@ -693,93 +698,95 @@
 
 
 
+//submenus
+void Menu_SubMenu_SetupInheritance(Menu_SubMenu *menu, Menu_Inheritance *base, Menu_Inheritance *local)
+{
+	NUint j;
+	for (j = 0; j < 2; j++)
+	{
+		NSint wmin, wmax;
 
+		wmin = base->origin[j] + menu->super.pos[j];
+		wmax = wmin + menu->super.size[j];
+		if (wmin < base->window.pos[j])
+			wmin = base->window.pos[j];
+		local->window.pos[j] = wmin;
+		if (wmax > base->window.pos[j] + base->window.size[j])
+			wmax = base->window.pos[j] + base->window.size[j];
+		local->window.size[j] = wmax-wmin;
 
+		local->origin[j] = menu->subwindow.pos[j] + wmin;
+	}
+}
 
-
-
-
-
-//submenus
-void Menu_SubMenu_MouseMove(Menu_SubMenu *item, Menu_Inheritance *inh)
+void Menu_SubMenu_MouseMove(Menu_SubMenu *menu, Menu_Inheritance *inh)
 {
 	Menu_Item *subitem;
 	Menu_Inheritance ninh;
 	NUint j;
 
-	if (Menu.grabs == &item->super && item->dragable)
+	if (Menu.grabs == &menu->super && menu->dragable)
 	{
-		item->super.pos[0] += Input.mouse[0] - item->dragmousepos[0];
-		item->super.pos[1] += Input.mouse[1] - item->dragmousepos[1];
-		item->dragmousepos[0] = Input.mouse[0];
-		item->dragmousepos[1] = Input.mouse[1];
+		menu->super.pos[0] += Input.mouse[0] - menu->dragmousepos[0];
+		menu->super.pos[1] += Input.mouse[1] - menu->dragmousepos[1];
+		menu->dragmousepos[0] = Input.mouse[0];
+		menu->dragmousepos[1] = Input.mouse[1];
 	}
 
-	for (j = 0; j < 2; j++)
+	Menu_SubMenu_SetupInheritance(menu, inh, &ninh);
+
+	// TODO: add a function pointinrect?
+	for( j = 0 ; j < 2 ; j++ ) 
 	{
-		NSint wmin, wmax;
-
-		wmin = inh->addpos[j] + item->super.pos[j];
-		wmax = wmin + item->super.size[j];
-		if (inh->window.pos[j] > wmin)
-			wmin = inh->window.pos[j];
-		if (inh->window.pos[j] + inh->window.size[j] < wmax)
-			wmax = inh->window.pos[j] + inh->window.size[j];
-
-		if (Input.mouse[j] < wmin || Input.mouse[j] > wmax)
+		if (Input.mouse[j] < ninh.window.pos[j] || ninh.origin[j] + ninh.window.size[j] < Input.mouse[j])
 		{
 			return;
 		}
-
-		ninh.window.pos[j] = wmin;
-		ninh.window.size[j] = wmax-wmin;
-
-		ninh.addpos[j] = inh->addpos[j] + item->subwindow.pos[j] + wmin;
 	}
 
+	if (menu->super.parent)
+		menu->super.parent->selecteditem = &menu->super;	//mouse is in us.
 
-	if (item->super.parent)
-		item->super.parent->selecteditem = &item->super;	//mouse is in us.
+	menu->selecteditem = NULL;
 
-	item->selecteditem = NULL;
-
-	for (subitem = item->subitems; subitem; subitem = subitem->next)
+	for (subitem = menu->subitems; subitem; subitem = subitem->next)
 		subitem->MouseMove(subitem, &ninh);
 }
-void Menu_SubMenu_Draw(Menu_SubMenu *item, Menu_Inheritance *inh)
+
+void Menu_SubMenu_Frame(Menu_SubMenu *menu, Menu_Inheritance *inh, Ndouble elapsedtime)
 {
 	Menu_Item *subitem, *next;
 	Menu_Inheritance ninh;
-	NUint j;
 
-	if (item->super.parent)
+	if (menu->super.parent)
 	{
-		if (item->super.parent->selecteditem != &item->super)
-			item->selecteditem = NULL;
+		if (menu->super.parent->selecteditem != &menu->super)
+			menu->selecteditem = NULL;
 	}
 
-	for (j = 0; j < 2; j++)
+	Menu_SubMenu_SetupInheritance(menu, inh, &ninh);
+
+	for (subitem = menu->subitems; subitem; subitem = next)
 	{
-		NSint wmin, wmax;
-		wmin = inh->addpos[j] + item->super.pos[j];
-		wmax = wmin + item->super.size[j];
-		if (wmin < inh->window.pos[j])
-			wmin = inh->window.pos[j];
-		ninh.window.pos[j] = wmin;
-		if (wmax > inh->window.pos[j] + inh->window.size[j])
-			wmax = inh->window.pos[j] + inh->window.size[j];
-		ninh.window.size[j] = wmax-wmin;
-
-		ninh.addpos[j] = item->subwindow.pos[j] + wmin;
+		next = subitem->next;//this funkyness is so that we can unlink and kill things in the draw function (if the need arises).
+		subitem->Frame(subitem, &ninh, elapsedtime);
 	}
+}
 
+void Menu_SubMenu_Draw(Menu_SubMenu *menu, Menu_Inheritance *inh)
+{
+	Menu_Item *subitem, *next;
+	Menu_Inheritance ninh;
 
+	Menu_SubMenu_SetupInheritance(menu, inh, &ninh);
+
 	R_SetScissor(ninh.window.pos[0], ninh.window.pos[1], ninh.window.size[0], ninh.window.size[1]);
 
-	for (subitem = item->subitems; subitem; subitem = next)
+	for (subitem = menu->subitems; subitem; subitem = next)
 	{
+		// TODO: remove this since we only accept Frame to delete items, Draw should just draw them and don't do any management work like deleting our beloved items
 		next = subitem->next;//this funkyness is so that we can unlink and kill things in the draw function (if the need arises).
-		subitem->DrawMenu(subitem, &ninh);
+		subitem->Draw(subitem, &ninh);
 	}
 
 	R_SetScissor(inh->window.pos[0], inh->window.pos[1], inh->window.size[0], inh->window.size[1]);
@@ -867,7 +874,8 @@
 	}
 
 	menu->super.MouseMove = Menu_SubMenu_MouseMove;
-	menu->super.DrawMenu = Menu_SubMenu_Draw;
+	menu->super.Frame = Menu_SubMenu_Frame;
+	menu->super.Draw = Menu_SubMenu_Draw;
 	menu->super.KeyEvent = Menu_SubMenu_KeyEvent;
 	menu->super.Destroy = Menu_SubMenu_Destroy;
 
@@ -995,7 +1003,9 @@
 
 	Menu.rootmenu.selecteditem = NULL;
 	Menu.rootmenu.super.MouseMove(&Menu.rootmenu, &inh);
-	Menu.rootmenu.super.DrawMenu(&Menu.rootmenu, &inh);
+	// FIXME: add real frametime support
+	Menu.rootmenu.super.Frame(&Menu.rootmenu, &inh, 0.0);
+	Menu.rootmenu.super.Draw(&Menu.rootmenu, &inh);
 }
 
 
@@ -1171,7 +1181,8 @@
 
 	// init the root menu
 	// FIXME: create the rootmenu using the normal submenu creation function instead?
+	Menu.rootmenu.super.Frame = Menu_SubMenu_Frame;
 	Menu.rootmenu.super.MouseMove = Menu_SubMenu_MouseMove;
-	Menu.rootmenu.super.DrawMenu = Menu_SubMenu_Draw;
+	Menu.rootmenu.super.Draw = Menu_SubMenu_Draw;
 	Menu.rootmenu.super.KeyEvent = Menu_SubMenu_KeyEvent;
 }

Modified: trunk/game/m_menucore.h
===================================================================
--- trunk/game/m_menucore.h	2006-03-13 21:28:38 UTC (rev 675)
+++ trunk/game/m_menucore.h	2006-03-13 22:08:52 UTC (rev 676)
@@ -11,7 +11,7 @@
 
 typedef struct Menu_Inheritance
 {
-	NSint addpos[2];
+	NSint origin[2];
 
 	Menu_Rect window;
 }
@@ -19,7 +19,9 @@
 
 typedef struct Menu_Item
 {
-	void (*DrawMenu) (void *item, Menu_Inheritance *inheritance);
+	// pass an elapsedtime parameter to make animation-speed changes, etc. possible
+	void (*Frame) (void *item, Menu_Inheritance *inheritance, Ndouble elapsedtime);
+	void (*Draw) (void *item, Menu_Inheritance *inheritance);
 	Nbool (*KeyEvent) (void *item, NUint mod, NUint sym, NUint character, Nbool downevent);
 	void (*MouseMove) (void *item, Menu_Inheritance *inheritance);
 	void (*Destroy) (void *item);




More information about the neither-commits mailing list