summaryrefslogtreecommitdiffstats
path: root/menu_demo/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'menu_demo/menu.c')
-rw-r--r--menu_demo/menu.c136
1 files changed, 86 insertions, 50 deletions
diff --git a/menu_demo/menu.c b/menu_demo/menu.c
index a36a916..9276850 100644
--- a/menu_demo/menu.c
+++ b/menu_demo/menu.c
@@ -6,7 +6,7 @@
#define TRUE !FALSE
#endif
-#include <stdlib.h>
+#include <string.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <string.h>
@@ -18,6 +18,7 @@
#define MENU_MAX_BUTTONS 16
enum MenuState {
+ MENU_OFF,
MENU_MAIN,
MENU_START,
MENU_OPTIONS
@@ -29,14 +30,20 @@ struct MenuStruct {
struct ButtonStruct m_sButtons[MENU_MAX_BUTTONS];
};
+struct MenuStruct g_sMenuOff; // definition of the menu when it's disabled (empty menu)
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
+struct BitmapStruct g_sCursorImage; // bitmap struct of the cursor
+
int g_iWinWidth;
int g_iWinHeight;
+int g_iXPos; // last cursor pos
+int g_iYPos;
+
void MenuEnableGroup(int f_iGroup)
{
@@ -65,7 +72,9 @@ void MenuEnableGroup(int f_iGroup)
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 = g_pCurMenu->m_iButtonCount;;
+ int i = g_pCurMenu->m_iButtonCount;
+
+ if (i > MENU_MAX_BUTTONS - 1) return;
// 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);
@@ -74,7 +83,6 @@ void MenuAddButton(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *
} // MenuAddButton
-
void MenuClear(void)
{
g_pCurMenu->m_iButtonCount = 0;
@@ -83,7 +91,6 @@ void MenuClear(void)
} // MenuClear
-
void MenuBuild (void)
{
int l_iMenuId = g_pCurMenu->m_iMenuId;
@@ -91,7 +98,15 @@ void MenuBuild (void)
switch (l_iMenuId)
{
default:
+ case MENU_OFF:
+ // no buttons
+ break;
+
case MENU_MAIN:
+ MenuAddButton(200, 150, 256, 128, "START", BUTTON_CLICK, BUTTON_NO_GROUP);
+ break;
+
+ case MENU_START:
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);
@@ -105,44 +120,34 @@ void MenuBuild (void)
MenuEnableGroup(BUTTON_GROUP2);
break;
- case MENU_START:
+ case MENU_OPTIONS:
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();
+ l_iMenuId = (l_iMenuId + 1) % 4;
-} // MenuNext
+ switch (l_iMenuId)
+ {
+ default:
+ case MENU_OFF: g_pCurMenu = &g_sMenuOff; break;
+ case MENU_MAIN: g_pCurMenu = &g_sMenuMain; break;
+ case MENU_START: g_pCurMenu = &g_sMenuStart; break;
+ case MENU_OPTIONS: g_pCurMenu = &g_sMenuOptions; break;
+ }
+} // MenuNext
void MenuInit(int f_iWinWidth, int f_iWinHeight)
@@ -150,27 +155,38 @@ void MenuInit(int f_iWinWidth, int f_iWinHeight)
// init menu props
g_iWinWidth = f_iWinWidth;
g_iWinHeight = f_iWinHeight;
+ g_iXPos = -100;
+ g_iYPos = -100;
- // set pointer to the current menu
- g_pCurMenu = &g_sMenuStart;
+ // init main off
+ g_sMenuOff.m_iMenuId = MENU_OFF;
+ g_pCurMenu = &g_sMenuOff;
+ MenuBuild();
// init main menu
g_sMenuMain.m_iMenuId = MENU_MAIN;
+ g_pCurMenu = &g_sMenuMain;
+ MenuBuild();
// init start menu
g_sMenuStart.m_iMenuId = MENU_START;
+ g_pCurMenu = &g_sMenuStart;
+ MenuBuild();
// init options menu
g_sMenuOptions.m_iMenuId = MENU_OPTIONS;
+ g_pCurMenu = &g_sMenuOptions;
+ MenuBuild();
// init font
FontInit(f_iWinWidth, f_iWinHeight);
- // build the current menu (main)
- MenuBuild();
+ g_pCurMenu = &g_sMenuOff;
-} // MenuInit
+ // load cursor image
+ g_sCursorImage = BitmapLoad("img/cursor.bmp");
+} // MenuInit
void MenuRender(void)
@@ -182,8 +198,6 @@ void MenuRender(void)
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
- glColor4d(1, 1, 1, 1);
-
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@@ -192,14 +206,37 @@ void MenuRender(void)
glMatrixMode(GL_MODELVIEW);
glEnable(GL_BLEND);
+
+ if (g_pCurMenu->m_iMenuId != MENU_OFF)
+ {
+ glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR);
+
+ glColor3d(0.6, 0.6, 0.7);
+ 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
for (i; i < g_pCurMenu->m_iButtonCount; i++)
{
+ glColor4d(1, 1, 1, 1);
ButtonRender(&g_pCurMenu->m_sButtons[i]);
}
+ // render cursor
+ glColor3d(1, 1, 1);
+ BitmapRender(g_iXPos,
+ g_iYPos,
+ 64, //g_sCursorImage.m_iWidth,
+ 64, //g_sCursorImage.m_iHeight,
+ g_sCursorImage.m_iImageId);
+
glDisable(GL_BLEND);
//restore the previous projection matrix
@@ -210,31 +247,28 @@ void MenuRender(void)
} // MenuRender
-
int MenuCollision(struct ButtonStruct *f_sButton, int f_iXPos, int f_iYPos)
{
- int l_iCollision;
+ int l_bCollision;
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;
-
- 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;
+ l_iButtonX = f_sButton->m_iXPos;
+ l_iButtonY = f_sButton->m_iYPos;
+ l_iButtonWidth = f_sButton->m_iWidth;
+ l_iButtonHeight = f_sButton->m_iHeight;
+ l_bCollision = f_iXPos >= l_iButtonX;
+ l_bCollision &= f_iYPos >= l_iButtonY;
+ l_bCollision &= f_iXPos <= l_iButtonX + l_iButtonWidth;
+ l_bCollision &= f_iYPos <= l_iButtonY + l_iButtonHeight;
- if (l_iCollision) return TRUE;
+ if (l_bCollision) return TRUE;
return FALSE;
} // MenuCollision
-
void MenuMouseClick(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYPos)
{
int i = 0;
@@ -259,10 +293,10 @@ void MenuMouseClick(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYPo
for (i; i >= 0; i--)
{
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_iXPos = l_sButton.m_iXPos;
+ l_iYPos = l_sButton.m_iYPos;
+ l_iWidth = l_sButton.m_iWidth;
+ l_iHeight = l_sButton.m_iHeight;
l_iType = l_sButton.m_iType;
l_iId = l_sButton.m_iId;
l_iGroup = l_sButton.m_iGroup;
@@ -303,6 +337,9 @@ void MenuMouseMove(int f_iXPos, int f_iYPos)
int i = 0;
struct ButtonStruct l_sButton;
+ g_iXPos = f_iXPos;
+ g_iYPos = f_iYPos;
+
// check if any button needs attention from the mouse
for (i; i < g_pCurMenu->m_iButtonCount; i++)
{
@@ -320,4 +357,3 @@ void MenuMouseMove(int f_iXPos, int f_iYPos)
} // MenuMouseMove
-