#ifdef G_OS_WIN32 #define WIN32_LEAN_AND_MEAN 1 #include #endif #include #include #include #include "menu.h" #include "button.h" #define MENU_MAX_BUTTONS 16 enum MenuState { MENU_MAIN, MENU_START, MENU_OPTIONS }; struct MenuStruct { enum MenuState m_eMenuId; int m_iButtonCount; struct ButtonStruct m_sButtons[MENU_MAX_BUTTONS]; }; struct MenuStruct g_sMenuMain; // definition of the main menu struct MenuStruct g_sMenuStart; // definition of the start menu struct MenuStruct g_sMenuOptions; // definition of the options menu struct MenuStruct *g_pCurMenu; // current menu int g_iWinWidth; int g_iWinHeight; void MenuAddButton(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *f_pcTitle, int f_iType) { int i; 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; } // MenuAddButton void MenuInit(int f_iWinWidth, int f_iWinHeight) { // init menu props g_iWinWidth = f_iWinWidth; g_iWinHeight = f_iWinHeight; // init main menu g_sMenuMain.m_eMenuId = MENU_MAIN; MenuAddButton(50, 50, 200, 100, "Start", BUTTON_CLICK); MenuAddButton(300, 50, 200, 200, "Start", BUTTON_RADIO); // init start menu g_sMenuStart.m_eMenuId = MENU_START; g_sMenuStart.m_iButtonCount = 0; // init options menu g_sMenuOptions.m_eMenuId = MENU_OPTIONS; g_sMenuOptions.m_iButtonCount = 0; // set pointer to the current menu g_pCurMenu = &g_sMenuMain; } // MenuInit void MenuRender(void) { int i; glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glColor4d(1, 1, 1, 1); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(1, (GLfloat)g_iWinWidth, (GLfloat)g_iWinHeight, 0, 0, 1); glMatrixMode(GL_MODELVIEW); glEnable(GL_BLEND); //glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // render the buttons (mask) on the current menu i = 0; while (i < g_pCurMenu->m_iButtonCount) { ButtonRender(&g_pCurMenu->m_sButtons[i]); i++; } glDisable(GL_BLEND); //restore the previous projection matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } // MenuRender void MenuMouseHandle(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYPos) { int i = 0; double l_dXPos, l_dYPos; double l_iWidth, l_iHeight; // f_iGlutButton: // # GLUT_LEFT_BUTTON // # GLUT_MIDDLE_BUTTON // # GLUT_RIGHT_BUTTON // f_iGlutState // # GLUT_DOWN // # GLUT_UP // button released if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_UP) { i = 0; while (i < g_pCurMenu->m_iButtonCount) { if (ButtonGetType(&g_pCurMenu->m_sButtons[i]) == BUTTON_CLICK) { ButtonRelease(&g_pCurMenu->m_sButtons[i]); } i++; } } // check if any button needs attention from the mouse i = 0; while (i < g_pCurMenu->m_iButtonCount) { 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) { ButtonEnter(&g_pCurMenu->m_sButtons[i]); // button pressed? if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_DOWN) { ButtonPress(&g_pCurMenu->m_sButtons[i]); } } else // mouse leaves button { ButtonExit(&g_pCurMenu->m_sButtons[i]); } i++; } } // MenuMouseHandle