From 0a92d39e9e8774d96a6277f51890ee6eb345b40b Mon Sep 17 00:00:00 2001 From: Wilrik de Loose Date: Fri, 25 Apr 2008 23:46:06 +0000 Subject: Fokking vette menu shizzle. Druk op spatie om naar andere menu's te schakelen. Wordt later toegevoegd als event aan een button. --- menu_demo/Debug/BuildLog.htm | Bin 7160 -> 7160 bytes menu_demo/Debug/main.obj | Bin 13498 -> 13483 bytes menu_demo/Debug/menu.obj | Bin 13958 -> 23964 bytes menu_demo/Debug/menu_demo.exe | Bin 524288 -> 528384 bytes menu_demo/Debug/menu_demo.ilk | Bin 1489244 -> 1293400 bytes menu_demo/Debug/menu_demo.pdb | Bin 2108416 -> 2108416 bytes menu_demo/Debug/mt.dep | 2 +- menu_demo/Debug/vc80.idb | Bin 125952 -> 125952 bytes menu_demo/Debug/vc80.pdb | Bin 61440 -> 61440 bytes menu_demo/button.c | 106 +++++++++-- menu_demo/button.h | 19 +- menu_demo/font.c | 6 +- menu_demo/font.h | 8 +- menu_demo/img/button_click_center.bmp | Bin 4152 -> 4152 bytes menu_demo/img/button_click_center_hover.bmp | Bin 4152 -> 4152 bytes menu_demo/img/button_click_left.bmp | Bin 32824 -> 32824 bytes menu_demo/img/button_click_left_hover.bmp | Bin 32824 -> 32824 bytes menu_demo/img/button_click_right.bmp | Bin 32824 -> 32824 bytes menu_demo/img/button_click_right_hover.bmp | Bin 32824 -> 32824 bytes menu_demo/img/button_radio.bmp | Bin 65592 -> 65592 bytes menu_demo/img/button_radio_hover.bmp | Bin 65592 -> 65592 bytes menu_demo/img/button_radio_pressed.bmp | Bin 65592 -> 65592 bytes menu_demo/img/images/photoshop/Wii_Button.psd | Bin 335386 -> 62634 bytes menu_demo/img/images/photoshop/Wii_Radio.psd | Bin 75465 -> 35611 bytes menu_demo/img/images/photoshop/button01.psd | Bin 189311 -> 0 bytes menu_demo/main.c | 6 +- menu_demo/menu.c | 260 +++++++++++++++++++------- menu_demo/menu.h | 4 +- menu_demo/menu_demo.ncb | Bin 7891968 -> 7891968 bytes menu_demo/menu_demo.suo | Bin 28672 -> 29184 bytes 30 files changed, 314 insertions(+), 97 deletions(-) delete mode 100644 menu_demo/img/images/photoshop/button01.psd diff --git a/menu_demo/Debug/BuildLog.htm b/menu_demo/Debug/BuildLog.htm index 7ca8acc..9eeca4e 100644 Binary files a/menu_demo/Debug/BuildLog.htm and b/menu_demo/Debug/BuildLog.htm differ diff --git a/menu_demo/Debug/main.obj b/menu_demo/Debug/main.obj index 4047adf..0cb41a3 100644 Binary files a/menu_demo/Debug/main.obj and b/menu_demo/Debug/main.obj differ diff --git a/menu_demo/Debug/menu.obj b/menu_demo/Debug/menu.obj index 59df73e..1c1b550 100644 Binary files a/menu_demo/Debug/menu.obj and b/menu_demo/Debug/menu.obj differ diff --git a/menu_demo/Debug/menu_demo.exe b/menu_demo/Debug/menu_demo.exe index 848976c..1a48381 100644 Binary files a/menu_demo/Debug/menu_demo.exe and b/menu_demo/Debug/menu_demo.exe differ diff --git a/menu_demo/Debug/menu_demo.ilk b/menu_demo/Debug/menu_demo.ilk index 34a0c2b..2aec88d 100644 Binary files a/menu_demo/Debug/menu_demo.ilk and b/menu_demo/Debug/menu_demo.ilk differ diff --git a/menu_demo/Debug/menu_demo.pdb b/menu_demo/Debug/menu_demo.pdb index 2014d73..da823dc 100644 Binary files a/menu_demo/Debug/menu_demo.pdb and b/menu_demo/Debug/menu_demo.pdb 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 Binary files a/menu_demo/Debug/vc80.idb and b/menu_demo/Debug/vc80.idb differ diff --git a/menu_demo/Debug/vc80.pdb b/menu_demo/Debug/vc80.pdb index dc44629..857ffa5 100644 Binary files a/menu_demo/Debug/vc80.pdb and b/menu_demo/Debug/vc80.pdb 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 Binary files a/menu_demo/img/button_click_center.bmp and b/menu_demo/img/button_click_center.bmp 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 Binary files a/menu_demo/img/button_click_center_hover.bmp and b/menu_demo/img/button_click_center_hover.bmp differ diff --git a/menu_demo/img/button_click_left.bmp b/menu_demo/img/button_click_left.bmp index f5f69aa..c876bfd 100644 Binary files a/menu_demo/img/button_click_left.bmp and b/menu_demo/img/button_click_left.bmp 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 Binary files a/menu_demo/img/button_click_left_hover.bmp and b/menu_demo/img/button_click_left_hover.bmp differ diff --git a/menu_demo/img/button_click_right.bmp b/menu_demo/img/button_click_right.bmp index 78a76c8..f402f10 100644 Binary files a/menu_demo/img/button_click_right.bmp and b/menu_demo/img/button_click_right.bmp 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 Binary files a/menu_demo/img/button_click_right_hover.bmp and b/menu_demo/img/button_click_right_hover.bmp differ diff --git a/menu_demo/img/button_radio.bmp b/menu_demo/img/button_radio.bmp index 0f6ae9b..7269ef6 100644 Binary files a/menu_demo/img/button_radio.bmp and b/menu_demo/img/button_radio.bmp differ diff --git a/menu_demo/img/button_radio_hover.bmp b/menu_demo/img/button_radio_hover.bmp index 2d2b594..ac92e77 100644 Binary files a/menu_demo/img/button_radio_hover.bmp and b/menu_demo/img/button_radio_hover.bmp differ diff --git a/menu_demo/img/button_radio_pressed.bmp b/menu_demo/img/button_radio_pressed.bmp index 1589733..920d2b2 100644 Binary files a/menu_demo/img/button_radio_pressed.bmp and b/menu_demo/img/button_radio_pressed.bmp 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 Binary files a/menu_demo/img/images/photoshop/Wii_Button.psd and b/menu_demo/img/images/photoshop/Wii_Button.psd 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 Binary files a/menu_demo/img/images/photoshop/Wii_Radio.psd and b/menu_demo/img/images/photoshop/Wii_Radio.psd 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 Binary files a/menu_demo/img/images/photoshop/button01.psd and /dev/null 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 Binary files a/menu_demo/menu_demo.ncb and b/menu_demo/menu_demo.ncb differ diff --git a/menu_demo/menu_demo.suo b/menu_demo/menu_demo.suo index 9880990..e420b9e 100644 Binary files a/menu_demo/menu_demo.suo and b/menu_demo/menu_demo.suo differ -- cgit v0.12