summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilrik de Loose <wilrik@wilrik.nl>2008-04-25 23:46:06 (GMT)
committerWilrik de Loose <wilrik@wilrik.nl>2008-04-25 23:46:06 (GMT)
commit0a92d39e9e8774d96a6277f51890ee6eb345b40b (patch)
treeb97e65f2e2ccc19cc7a42e1a0f7a939a81fc9e2a
parent3f0c80bb6069ac6ac6b66704f5035bcc7e979dd5 (diff)
download2iv55-0a92d39e9e8774d96a6277f51890ee6eb345b40b.zip
2iv55-0a92d39e9e8774d96a6277f51890ee6eb345b40b.tar.gz
2iv55-0a92d39e9e8774d96a6277f51890ee6eb345b40b.tar.bz2
Fokking vette menu shizzle. Druk op spatie om naar andere menu's te schakelen. Wordt later toegevoegd als event aan een button.
-rw-r--r--menu_demo/Debug/BuildLog.htmbin7160 -> 7160 bytes
-rw-r--r--menu_demo/Debug/main.objbin13498 -> 13483 bytes
-rw-r--r--menu_demo/Debug/menu.objbin13958 -> 23964 bytes
-rw-r--r--menu_demo/Debug/menu_demo.exebin524288 -> 528384 bytes
-rw-r--r--menu_demo/Debug/menu_demo.ilkbin1489244 -> 1293400 bytes
-rw-r--r--menu_demo/Debug/menu_demo.pdbbin2108416 -> 2108416 bytes
-rw-r--r--menu_demo/Debug/mt.dep2
-rw-r--r--menu_demo/Debug/vc80.idbbin125952 -> 125952 bytes
-rw-r--r--menu_demo/Debug/vc80.pdbbin61440 -> 61440 bytes
-rw-r--r--menu_demo/button.c106
-rw-r--r--menu_demo/button.h19
-rw-r--r--menu_demo/font.c6
-rw-r--r--menu_demo/font.h8
-rw-r--r--menu_demo/img/button_click_center.bmpbin4152 -> 4152 bytes
-rw-r--r--menu_demo/img/button_click_center_hover.bmpbin4152 -> 4152 bytes
-rw-r--r--menu_demo/img/button_click_left.bmpbin32824 -> 32824 bytes
-rw-r--r--menu_demo/img/button_click_left_hover.bmpbin32824 -> 32824 bytes
-rw-r--r--menu_demo/img/button_click_right.bmpbin32824 -> 32824 bytes
-rw-r--r--menu_demo/img/button_click_right_hover.bmpbin32824 -> 32824 bytes
-rw-r--r--menu_demo/img/button_radio.bmpbin65592 -> 65592 bytes
-rw-r--r--menu_demo/img/button_radio_hover.bmpbin65592 -> 65592 bytes
-rw-r--r--menu_demo/img/button_radio_pressed.bmpbin65592 -> 65592 bytes
-rw-r--r--menu_demo/img/images/photoshop/Wii_Button.psdbin335386 -> 62634 bytes
-rw-r--r--menu_demo/img/images/photoshop/Wii_Radio.psdbin75465 -> 35611 bytes
-rw-r--r--menu_demo/img/images/photoshop/button01.psdbin189311 -> 0 bytes
-rw-r--r--menu_demo/main.c6
-rw-r--r--menu_demo/menu.c260
-rw-r--r--menu_demo/menu.h4
-rw-r--r--menu_demo/menu_demo.ncbbin7891968 -> 7891968 bytes
-rw-r--r--menu_demo/menu_demo.suobin28672 -> 29184 bytes
30 files changed, 314 insertions, 97 deletions
diff --git a/menu_demo/Debug/BuildLog.htm b/menu_demo/Debug/BuildLog.htm
index 7ca8acc..9eeca4e 100644
--- a/menu_demo/Debug/BuildLog.htm
+++ b/menu_demo/Debug/BuildLog.htm
Binary files differ
diff --git a/menu_demo/Debug/main.obj b/menu_demo/Debug/main.obj
index 4047adf..0cb41a3 100644
--- a/menu_demo/Debug/main.obj
+++ b/menu_demo/Debug/main.obj
Binary files differ
diff --git a/menu_demo/Debug/menu.obj b/menu_demo/Debug/menu.obj
index 59df73e..1c1b550 100644
--- a/menu_demo/Debug/menu.obj
+++ b/menu_demo/Debug/menu.obj
Binary files differ
diff --git a/menu_demo/Debug/menu_demo.exe b/menu_demo/Debug/menu_demo.exe
index 848976c..1a48381 100644
--- a/menu_demo/Debug/menu_demo.exe
+++ b/menu_demo/Debug/menu_demo.exe
Binary files differ
diff --git a/menu_demo/Debug/menu_demo.ilk b/menu_demo/Debug/menu_demo.ilk
index 34a0c2b..2aec88d 100644
--- a/menu_demo/Debug/menu_demo.ilk
+++ b/menu_demo/Debug/menu_demo.ilk
Binary files differ
diff --git a/menu_demo/Debug/menu_demo.pdb b/menu_demo/Debug/menu_demo.pdb
index 2014d73..da823dc 100644
--- a/menu_demo/Debug/menu_demo.pdb
+++ b/menu_demo/Debug/menu_demo.pdb
Binary files differ
diff --git a/menu_demo/Debug/mt.dep b/menu_demo/Debug/mt.dep
index bfc4a5e..9304fd2 100644
--- a/menu_demo/Debug/mt.dep
+++ b/menu_demo/Debug/mt.dep
@@ -1 +1 @@
-Manifest resource last updated at 18:26:10,99 on 25-04-2008
+Manifest resource last updated at 1:37:15,66 on 26-04-2008
diff --git a/menu_demo/Debug/vc80.idb b/menu_demo/Debug/vc80.idb
index e7b81c6..43601f7 100644
--- a/menu_demo/Debug/vc80.idb
+++ b/menu_demo/Debug/vc80.idb
Binary files differ
diff --git a/menu_demo/Debug/vc80.pdb b/menu_demo/Debug/vc80.pdb
index dc44629..857ffa5 100644
--- a/menu_demo/Debug/vc80.pdb
+++ b/menu_demo/Debug/vc80.pdb
Binary files differ
diff --git a/menu_demo/button.c b/menu_demo/button.c
index 588e0e1..f9d5ac0 100644
--- a/menu_demo/button.c
+++ b/menu_demo/button.c
@@ -13,7 +13,7 @@
-struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *f_pcTitle, int f_iType)
+struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *f_pcTitle, int f_iType, int f_iGroup, int f_iId)
{
struct ButtonStruct l_sButton;
@@ -23,6 +23,8 @@ struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dWidth, int f_d
l_sButton.m_iType = f_iType;
l_sButton.m_dHeight = f_dHeight;
l_sButton.m_dWidth = f_dWidth;
+ l_sButton.m_iGroup = f_iGroup;
+ l_sButton.m_iId = f_iId;
// copy title
memset(&l_sButton.m_pcTitle, 0, sizeof(l_sButton.m_pcTitle));
@@ -66,7 +68,6 @@ struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dWidth, int f_d
l_sButton.m_dWidth = f_dWidth;
break;
- case BUTTON_LABEL:
default:
break;
}
@@ -80,14 +81,6 @@ struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dWidth, int f_d
-int ButtonGetType(struct ButtonStruct *f_sButton)
-{
- return f_sButton->m_iType;
-
-} // ButtonGetType
-
-
-
void ButtonClickRender(struct ButtonStruct *f_sButton)
{
char l_pcTitle[BUTTON_MAX_TITLE];
@@ -95,6 +88,7 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
int l_iImgWidth, l_iImageIdLeft, l_iImageIdCenter, l_iImageIdRight;
int l_iLen, l_iXOffset, l_iYOffset;
double l_dXOffset, l_dYOffset;
+ struct ColorStruct l_sColor = {0, 0, 0};
// copy button attributes
double l_dCnWdt = f_sButton->m_dCenterWidth;
@@ -179,7 +173,8 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
glPrint(f_sButton->m_dXPos + l_iXOffset,
f_sButton->m_dYPos + l_iYOffset,
- f_sButton->m_pcTitle);
+ f_sButton->m_pcTitle,
+ l_sColor);
} // ButtonClickRender
@@ -188,17 +183,14 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
void ButtonRadioRender(struct ButtonStruct *f_sButton)
{
struct BitmapStruct *l_sImgButton;
- int l_iLen, l_iXOffset, l_iYOffset, l_iImageId;
+ int l_iXOffset, l_iYOffset, l_iImageId;
// copy button attributes
double l_dWidth = f_sButton->m_dWidth;
double l_dHeight = f_sButton->m_dHeight;
double l_dXPos = f_sButton->m_dXPos;
double l_dYPos = f_sButton->m_dYPos;
-
- l_iLen = (int)strlen(f_sButton->m_pcTitle);
- l_iXOffset = (int)(f_sButton->m_dWidth + FONT_SPACING);
- l_iYOffset = (int)(0.5 * f_sButton->m_dHeight - 0.5 * FONT_HEIGHT);
+ struct ColorStruct l_sColor = {0.2, 0.4, 0.8};
glColor3d(1, 1, 1);
@@ -238,9 +230,13 @@ void ButtonRadioRender(struct ButtonStruct *f_sButton)
glEnd();
}
+ l_iXOffset = (int)f_sButton->m_dWidth;
+ l_iYOffset = (int)(0.5 * f_sButton->m_dHeight - 0.5 * FONT_HEIGHT);
+
glPrint(f_sButton->m_dXPos + l_iXOffset,
f_sButton->m_dYPos + l_iYOffset,
- f_sButton->m_pcTitle);
+ f_sButton->m_pcTitle,
+ l_sColor);
} // ButtonRadioRender
@@ -261,7 +257,6 @@ void ButtonRender(struct ButtonStruct *f_sButton)
ButtonRadioRender(f_sButton);
break;
- case BUTTON_LABEL:
default:
break;
}
@@ -286,16 +281,87 @@ void ButtonExit(struct ButtonStruct *f_sButton)
+void ButtonClickPress(struct ButtonStruct *f_sButton)
+{
+ if (!f_sButton->m_bPressed) {
+ ButtonEnable(f_sButton);
+ }
+
+} // ButtonClickPress
+
+
+
+void ButtonRadioPress(struct ButtonStruct *f_sButton)
+{
+ int i = 0;
+
+ if (!f_sButton->m_bPressed)
+ {
+ ButtonEnable(f_sButton);
+ }
+
+} // ButtonClickPress
+
+
+
void ButtonPress(struct ButtonStruct *f_sButton)
{
- f_sButton->m_bPressed = !f_sButton->m_bPressed;
+ int l_iType = f_sButton->m_iType;
+
+ switch (l_iType)
+ {
+ case BUTTON_CLICK:
+ ButtonClickPress(f_sButton);
+ break;
+
+ case BUTTON_RADIO:
+ ButtonRadioPress(f_sButton);
+ break;
+
+ default:
+ break;
+ }
} // ButtonPress
+void ButtonClickRelease(struct ButtonStruct *f_sButton)
+{
+ ButtonDisable(f_sButton);
+
+} // ButtonClickRelease
+
+
+
void ButtonRelease(struct ButtonStruct *f_sButton)
{
+ int l_iType = f_sButton->m_iType;
+
+ switch (l_iType)
+ {
+ case BUTTON_CLICK:
+ ButtonClickRelease(f_sButton);
+ break;
+
+ case BUTTON_RADIO:
+ default:
+ break;
+ }
+
+} // ButtonRelease
+
+
+
+void ButtonEnable(struct ButtonStruct *f_sButton)
+{
+ f_sButton->m_bPressed = TRUE;
+
+} // ButtonEnable
+
+
+void ButtonDisable(struct ButtonStruct *f_sButton)
+{
f_sButton->m_bPressed = FALSE;
-} // ButtonPress
+} // ButtonDisable \ No newline at end of file
diff --git a/menu_demo/button.h b/menu_demo/button.h
index 0708c1f..c3521bb 100644
--- a/menu_demo/button.h
+++ b/menu_demo/button.h
@@ -16,6 +16,8 @@ struct ButtonStruct {
int m_bPressed; // pressed or not
int m_bHover; // mouse hovering or not
int m_iType; // button type
+ int m_iGroup; // group id for radio buttons
+ int m_iId; // button identifier
// button caption/title
char m_pcTitle[BUTTON_MAX_TITLE];
@@ -28,16 +30,25 @@ struct ButtonStruct {
enum ButtonType {
BUTTON_CLICK,
- BUTTON_RADIO,
- BUTTON_LABEL
+ BUTTON_RADIO
};
-struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, int f_dHeight, char *f_pcTitle, int f_iType);
-int ButtonGetType(struct ButtonStruct *f_sButton);
+enum ButtonGroup {
+ BUTTON_NO_GROUP,
+ BUTTON_GROUP1,
+ BUTTON_GROUP2,
+ BUTTON_GROUP3,
+ BUTTON_GROUP4
+};
+
+struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, int f_dHeight, char *f_pcTitle, int f_iType, int f_iGroup, int f_iId);
+
void ButtonRender(struct ButtonStruct *f_sButton);
void ButtonEnter(struct ButtonStruct *f_sButton);
void ButtonExit(struct ButtonStruct *f_sButton);
void ButtonPress(struct ButtonStruct *f_sButton);
void ButtonRelease(struct ButtonStruct *f_sButton);
+void ButtonEnable(struct ButtonStruct *f_sButton);
+void ButtonDisable(struct ButtonStruct *f_sButton);
#endif
diff --git a/menu_demo/font.c b/menu_demo/font.c
index 620ec19..9d52ada 100644
--- a/menu_demo/font.c
+++ b/menu_demo/font.c
@@ -53,15 +53,15 @@ void FontInit(int f_iWinWidth, int f_iWinHeight)
} // BuildFont
-void FontDelete(GLvoid)
+void FontDelete(void)
{
glDeleteLists(base, 256);
} // FontDelete
-void glPrint(GLint x, GLint y, char *string)
+void glPrint(GLint x, GLint y, char *string, struct ColorStruct f_sColor)
{
- glColor3d(0, 0, 0);
+ glColor3d(f_sColor.m_dRed, f_sColor.m_dGreen, f_sColor.m_dBlue);
glBindTexture(GL_TEXTURE_2D, g_sFont.m_iImageId);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
diff --git a/menu_demo/font.h b/menu_demo/font.h
index 817c8a4..26c51dc 100644
--- a/menu_demo/font.h
+++ b/menu_demo/font.h
@@ -5,8 +5,14 @@
#define FONT_HEIGHT 32
#define FONT_SPACING 20
+struct ColorStruct {
+ double m_dRed;
+ double m_dGreen;
+ double m_dBlue;
+};
+
void FontInit(int f_iWinWidth, int f_iWinHeight);
void FontDelete(GLvoid);
-void glPrint(GLint x, GLint y, char *string);
+void glPrint(GLint x, GLint y, char *string, struct ColorStruct f_sColor);
#endif \ No newline at end of file
diff --git a/menu_demo/img/button_click_center.bmp b/menu_demo/img/button_click_center.bmp
index ea9a8ec..de71c22 100644
--- a/menu_demo/img/button_click_center.bmp
+++ b/menu_demo/img/button_click_center.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_center_hover.bmp b/menu_demo/img/button_click_center_hover.bmp
index b974b30..1f59dbb 100644
--- a/menu_demo/img/button_click_center_hover.bmp
+++ b/menu_demo/img/button_click_center_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_left.bmp b/menu_demo/img/button_click_left.bmp
index f5f69aa..c876bfd 100644
--- a/menu_demo/img/button_click_left.bmp
+++ b/menu_demo/img/button_click_left.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_left_hover.bmp b/menu_demo/img/button_click_left_hover.bmp
index 8695e9e..80e73f8 100644
--- a/menu_demo/img/button_click_left_hover.bmp
+++ b/menu_demo/img/button_click_left_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_right.bmp b/menu_demo/img/button_click_right.bmp
index 78a76c8..f402f10 100644
--- a/menu_demo/img/button_click_right.bmp
+++ b/menu_demo/img/button_click_right.bmp
Binary files differ
diff --git a/menu_demo/img/button_click_right_hover.bmp b/menu_demo/img/button_click_right_hover.bmp
index 9ee8a2a..c70dbd5 100644
--- a/menu_demo/img/button_click_right_hover.bmp
+++ b/menu_demo/img/button_click_right_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_radio.bmp b/menu_demo/img/button_radio.bmp
index 0f6ae9b..7269ef6 100644
--- a/menu_demo/img/button_radio.bmp
+++ b/menu_demo/img/button_radio.bmp
Binary files differ
diff --git a/menu_demo/img/button_radio_hover.bmp b/menu_demo/img/button_radio_hover.bmp
index 2d2b594..ac92e77 100644
--- a/menu_demo/img/button_radio_hover.bmp
+++ b/menu_demo/img/button_radio_hover.bmp
Binary files differ
diff --git a/menu_demo/img/button_radio_pressed.bmp b/menu_demo/img/button_radio_pressed.bmp
index 1589733..920d2b2 100644
--- a/menu_demo/img/button_radio_pressed.bmp
+++ b/menu_demo/img/button_radio_pressed.bmp
Binary files differ
diff --git a/menu_demo/img/images/photoshop/Wii_Button.psd b/menu_demo/img/images/photoshop/Wii_Button.psd
index b45dce0..9b6c3f4 100644
--- a/menu_demo/img/images/photoshop/Wii_Button.psd
+++ b/menu_demo/img/images/photoshop/Wii_Button.psd
Binary files differ
diff --git a/menu_demo/img/images/photoshop/Wii_Radio.psd b/menu_demo/img/images/photoshop/Wii_Radio.psd
index 91a327d..9264217 100644
--- a/menu_demo/img/images/photoshop/Wii_Radio.psd
+++ b/menu_demo/img/images/photoshop/Wii_Radio.psd
Binary files differ
diff --git a/menu_demo/img/images/photoshop/button01.psd b/menu_demo/img/images/photoshop/button01.psd
deleted file mode 100644
index 3f25140..0000000
--- a/menu_demo/img/images/photoshop/button01.psd
+++ /dev/null
Binary files differ
diff --git a/menu_demo/main.c b/menu_demo/main.c
index 31fdf2c..d802e4c 100644
--- a/menu_demo/main.c
+++ b/menu_demo/main.c
@@ -39,7 +39,6 @@ void render_scene(void)
// glMatrixMode(GL_PROJECTION);
//glPopMatrix();
- glClearColor(1, 1, 1, 1);
MenuRender();
glutSwapBuffers();
@@ -52,6 +51,7 @@ void process_normal_keys(unsigned char key, int x, int y)
{
// escape
if (key == 27) exit(0);
+ if (key == ' ') MenuNext();
} // process_normal_keys
@@ -70,7 +70,7 @@ void process_special_keys(int key, int x, int y)
void process_mouse(int button, int state, int x, int y)
{
- MenuMouseHandle(button, state, x, y);
+ MenuMouseClick(button, state, x, y);
} // process_mouse
@@ -78,7 +78,7 @@ void process_mouse(int button, int state, int x, int y)
void process_passive_mouse(int x, int y)
{
- process_mouse(-1, -1, x, y);
+ MenuMouseMove(x, y);
} // process_passive_mouse
diff --git a/menu_demo/menu.c b/menu_demo/menu.c
index e6a15ee..b4d98cf 100644
--- a/menu_demo/menu.c
+++ b/menu_demo/menu.c
@@ -20,7 +20,7 @@ enum MenuState {
};
struct MenuStruct {
- enum MenuState m_eMenuId;
+ enum MenuState m_iMenuId;
int m_iButtonCount;
struct ButtonStruct m_sButtons[MENU_MAX_BUTTONS];
};
@@ -34,54 +34,146 @@ int g_iWinWidth;
int g_iWinHeight;
+void MenuEnableGroup(int f_iGroup)
+{
+ struct ButtonStruct l_sButton;
+ int l_iType, l_iGroup;
+ int i = 0;
+
+ // enable first radio button in this group
+ while (i < g_pCurMenu->m_iButtonCount)
+ {
+ l_sButton = g_pCurMenu->m_sButtons[i];
+ l_iType = l_sButton.m_iType;
+ l_iGroup = l_sButton.m_iGroup;
+
+ if (l_iType == BUTTON_RADIO && l_iGroup == f_iGroup)
+ {
+ ButtonEnable(&g_pCurMenu->m_sButtons[i]);
+ return;
+ }
+
+ i++;
+ }
+
+} // MenuEnableGroup
+
-void MenuAddButton(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *f_pcTitle, int f_iType)
+void MenuAddButton(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *f_pcTitle, int f_iType, int f_iGroup)
{
- int i;
+ int i = g_pCurMenu->m_iButtonCount;;
- i = g_sMenuMain.m_iButtonCount;
- g_sMenuMain.m_sButtons[i] = ButtonCreate(f_dXPos, f_dYPos, f_dWidth, f_dHeight, f_pcTitle, f_iType);
-
- i++;
- g_sMenuMain.m_iButtonCount = i;
+ // create the button with the right parameters
+ g_pCurMenu->m_sButtons[i] = ButtonCreate(f_dXPos, f_dYPos, f_dWidth, f_dHeight, f_pcTitle, f_iType, f_iGroup, i);
+ g_pCurMenu->m_iButtonCount = i + 1;
} // MenuAddButton
+void MenuClear(void)
+{
+ g_pCurMenu->m_iButtonCount = 0;
+ memset(&g_pCurMenu->m_sButtons, 0, sizeof(g_pCurMenu->m_sButtons));
+
+} // MenuClear
+
+
+
+void MenuBuild (void)
+{
+ int l_iMenuId = g_pCurMenu->m_iMenuId;
+
+ switch (l_iMenuId)
+ {
+ default:
+ case MENU_MAIN:
+ MenuAddButton(50, 50, 250, 64, "Button 1", BUTTON_CLICK, BUTTON_NO_GROUP);
+ MenuAddButton(50, 150, 250, 64, "Button 2", BUTTON_CLICK, BUTTON_NO_GROUP);
+ MenuAddButton(350, 50, 64, 64, "Radio 1", BUTTON_RADIO, BUTTON_GROUP1);
+ MenuAddButton(350, 150, 64, 64, "Radio 2", BUTTON_RADIO, BUTTON_GROUP1);
+ MenuEnableGroup(BUTTON_GROUP1);
+
+ MenuAddButton(50, 250, 256, 64, "Button 3", BUTTON_CLICK, BUTTON_NO_GROUP);
+ MenuAddButton(50, 350, 256, 64, "Button 4", BUTTON_CLICK, BUTTON_NO_GROUP);
+ MenuAddButton(350, 250, 64, 64, "Radio A", BUTTON_RADIO, BUTTON_GROUP2);
+ MenuAddButton(350, 350, 64, 64, "Radio B", BUTTON_RADIO, BUTTON_GROUP2);
+ MenuEnableGroup(BUTTON_GROUP2);
+ break;
+
+ case MENU_START:
+ MenuAddButton(50, 150, 250, 64, "Start", BUTTON_CLICK, BUTTON_NO_GROUP);
+ MenuAddButton(50, 250, 250, 64, "Back", BUTTON_CLICK, BUTTON_NO_GROUP);
+ MenuAddButton(350, 150, 64, 64, "Try first!", BUTTON_RADIO, BUTTON_GROUP1);
+ MenuAddButton(350, 250, 64, 64, "10 games", BUTTON_RADIO, BUTTON_GROUP1);
+ MenuEnableGroup(BUTTON_GROUP1);
+ break;
+
+ case MENU_OPTIONS:
+ MenuAddButton(50, 50, 64, 64, "Headtracking", BUTTON_RADIO, BUTTON_GROUP1);
+ MenuAddButton(50, 150, 64, 64, "Stereo vision", BUTTON_RADIO, BUTTON_GROUP1);
+ MenuEnableGroup(BUTTON_GROUP1);
+ break;
+ }
+
+} // MenuBuild
+
+
+
+void MenuRebuild(void)
+{
+ MenuClear();
+ MenuBuild();
+
+} // MenuRebuild
+
+
+
+void MenuNext(void)
+{
+ int l_iMenuId = g_pCurMenu->m_iMenuId;
+
+ l_iMenuId = (l_iMenuId + 1) % 3;
+ g_pCurMenu->m_iMenuId = l_iMenuId;
+ MenuRebuild();
+
+} // MenuNext
+
+
+
void MenuInit(int f_iWinWidth, int f_iWinHeight)
{
// init menu props
g_iWinWidth = f_iWinWidth;
g_iWinHeight = f_iWinHeight;
+ // set pointer to the current menu
+ g_pCurMenu = &g_sMenuStart;
+
// init main menu
- g_sMenuMain.m_eMenuId = MENU_MAIN;
- MenuAddButton(32, 16, 256, 128, "Button 1", BUTTON_CLICK);
- MenuAddButton(32, 128, 256, 128, "Button 2", BUTTON_CLICK);
- MenuAddButton(312, 16, 110, 110, "Radio 1", BUTTON_RADIO);
+ g_sMenuMain.m_iMenuId = MENU_MAIN;
// init start menu
- g_sMenuStart.m_eMenuId = MENU_START;
- g_sMenuStart.m_iButtonCount = 0;
+ g_sMenuStart.m_iMenuId = MENU_START;
// init options menu
- g_sMenuOptions.m_eMenuId = MENU_OPTIONS;
- g_sMenuOptions.m_iButtonCount = 0;
-
- // set pointer to the current menu
- g_pCurMenu = &g_sMenuMain;
+ g_sMenuOptions.m_iMenuId = MENU_OPTIONS;
// init font
FontInit(f_iWinWidth, f_iWinHeight);
+ // build the current menu (main)
+ MenuBuild();
+
} // MenuInit
void MenuRender(void)
{
- int i;
+ int i = 0;
+
+ glClearColor(0.9, 0.9, 0.9, 1);
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
@@ -96,24 +188,12 @@ void MenuRender(void)
glMatrixMode(GL_MODELVIEW);
glEnable(GL_BLEND);
- //glBlendFunc(GL_ONE, GL_ZERO);
-
- //glColor4d(0.25, 0.5, 1, 0.1);
- //glBegin(GL_TRIANGLE_STRIP);
- // glVertex2i(0, 0);
- // glVertex2i(g_iWinWidth, 0);
- // glVertex2i(0, g_iWinHeight);
- // glVertex2i(g_iWinWidth, g_iWinHeight);
- //glEnd();
-
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// render the buttons of the current menu
- i = 0;
- while (i < g_pCurMenu->m_iButtonCount)
+ for (i; i < g_pCurMenu->m_iButtonCount; i++)
{
ButtonRender(&g_pCurMenu->m_sButtons[i]);
- i++;
}
glDisable(GL_BLEND);
@@ -127,61 +207,113 @@ void MenuRender(void)
-void MenuMouseHandle(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYPos)
+int MenuCollision(struct ButtonStruct *f_sButton, int f_iXPos, int f_iYPos)
{
- int i = 0;
- double l_dXPos, l_dYPos;
- double l_iWidth, l_iHeight;
+ int l_iCollision;
+ int l_iButtonX, l_iButtonY;
+ int l_iButtonWidth, l_iButtonHeight;
+
+ l_iButtonX = f_sButton->m_dXPos;
+ l_iButtonY = f_sButton->m_dYPos;
+ l_iButtonWidth = f_sButton->m_dWidth;
+ l_iButtonHeight = f_sButton->m_dHeight;
- // f_iGlutButton:
- // # GLUT_LEFT_BUTTON
- // # GLUT_MIDDLE_BUTTON
- // # GLUT_RIGHT_BUTTON
+ l_iCollision = f_iXPos >= l_iButtonX;
+ l_iCollision &= f_iYPos >= l_iButtonY;
+ l_iCollision &= f_iXPos <= l_iButtonX + l_iButtonWidth;
+ l_iCollision &= f_iYPos <= l_iButtonY + l_iButtonHeight;
- // f_iGlutState
- // # GLUT_DOWN
- // # GLUT_UP
+
+ if (l_iCollision) return TRUE;
+ return FALSE;
+
+} // MenuCollision
+
+
+
+void MenuMouseClick(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYPos)
+{
+ int i = 0;
+ int l_iXPos, l_iYPos;
+ int l_iWidth, l_iHeight;
+ int l_iType, l_iId, l_iGroup;
+ struct ButtonStruct l_sButton;
// button released
if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_UP)
{
- i = 0;
- while (i < g_pCurMenu->m_iButtonCount)
+ // post a button released event to all buttons
+ for (i; i < g_pCurMenu->m_iButtonCount; i++)
{
- if (ButtonGetType(&g_pCurMenu->m_sButtons[i]) == BUTTON_CLICK)
- {
- ButtonRelease(&g_pCurMenu->m_sButtons[i]);
- }
- i++;
+ l_iType = g_pCurMenu->m_sButtons[i].m_iType;
+ ButtonRelease(&g_pCurMenu->m_sButtons[i]);
}
}
// check if any button needs attention from the mouse
- i = 0;
- while (i < g_pCurMenu->m_iButtonCount)
+ i = g_pCurMenu->m_iButtonCount;
+ for (i; i >= 0; i--)
{
- l_dXPos = g_pCurMenu->m_sButtons[i].m_dXPos;
- l_dYPos = g_pCurMenu->m_sButtons[i].m_dYPos;
- l_iWidth = g_pCurMenu->m_sButtons[i].m_dWidth;
- l_iHeight = g_pCurMenu->m_sButtons[i].m_dHeight;
-
- if (l_dXPos <= f_iXPos && l_dXPos + l_iWidth >= f_iXPos &&l_dYPos <= f_iYPos && l_dYPos + l_iHeight >= f_iYPos)
+ l_sButton = g_pCurMenu->m_sButtons[i];
+ l_iXPos = l_sButton.m_dXPos;
+ l_iYPos = l_sButton.m_dYPos;
+ l_iWidth = l_sButton.m_dWidth;
+ l_iHeight = l_sButton.m_dHeight;
+ l_iType = l_sButton.m_iType;
+ l_iId = l_sButton.m_iId;
+ l_iGroup = l_sButton.m_iGroup;
+
+ if (MenuCollision(&l_sButton, f_iXPos, f_iYPos))
{
- ButtonEnter(&g_pCurMenu->m_sButtons[i]);
-
// button pressed?
- if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_DOWN)
+ if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_DOWN)
{
ButtonPress(&g_pCurMenu->m_sButtons[i]);
+
+ if (l_iType == BUTTON_RADIO)
+ {
+ i = 0;
+ while (i < g_pCurMenu->m_iButtonCount)
+ {
+
+ if (l_iId != g_pCurMenu->m_sButtons[i].m_iId &&
+ l_iType == g_pCurMenu->m_sButtons[i].m_iType &&
+ l_iGroup == g_pCurMenu->m_sButtons[i].m_iGroup)
+ {
+ ButtonDisable(&g_pCurMenu->m_sButtons[i]);
+ }
+ i++;
+ }
+ }
+
+ return;
}
}
+ }
+
+} // MenuMouseClick
+
+
+void MenuMouseMove(int f_iXPos, int f_iYPos)
+{
+ int i = 0;
+ struct ButtonStruct l_sButton;
+
+ // check if any button needs attention from the mouse
+ for (i; i < g_pCurMenu->m_iButtonCount; i++)
+ {
+ l_sButton = g_pCurMenu->m_sButtons[i];
+
+ if (MenuCollision(&l_sButton, f_iXPos, f_iYPos))
+ {
+ ButtonEnter(&g_pCurMenu->m_sButtons[i]);
+ }
else // mouse leaves button
{
ButtonExit(&g_pCurMenu->m_sButtons[i]);
}
- i++;
}
-} // MenuMouseHandle
+} // MenuMouseMove
diff --git a/menu_demo/menu.h b/menu_demo/menu.h
index b89c1aa..0b4e95f 100644
--- a/menu_demo/menu.h
+++ b/menu_demo/menu.h
@@ -1,8 +1,10 @@
#ifndef _CMENU_H
#define _CMENU_H
+void MenuNext(void);
void MenuInit(int f_iWinWidth, int f_iWinHeight);
void MenuRender(void);
-void MenuMouseHandle(int button, int state, int x, int y);
+void MenuMouseClick(int button, int state, int x, int y);
+void MenuMouseMove(int x, int y);
#endif
diff --git a/menu_demo/menu_demo.ncb b/menu_demo/menu_demo.ncb
index 7c51dfb..b7b2f16 100644
--- a/menu_demo/menu_demo.ncb
+++ b/menu_demo/menu_demo.ncb
Binary files differ
diff --git a/menu_demo/menu_demo.suo b/menu_demo/menu_demo.suo
index 9880990..e420b9e 100644
--- a/menu_demo/menu_demo.suo
+++ b/menu_demo/menu_demo.suo
Binary files differ