summaryrefslogtreecommitdiffstats
path: root/menu_demo/button.c
diff options
context:
space:
mode:
Diffstat (limited to 'menu_demo/button.c')
-rw-r--r--menu_demo/button.c104
1 files changed, 55 insertions, 49 deletions
diff --git a/menu_demo/button.c b/menu_demo/button.c
index cd5a561..e63143a 100644
--- a/menu_demo/button.c
+++ b/menu_demo/button.c
@@ -6,20 +6,22 @@
#include <GL/gl.h>
#include <string.h>
#include <stdio.h>
+#include <math.h>
#include "button.h"
-struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, 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)
{
struct ButtonStruct l_sButton;
// copy parameters
- l_sButton.m_dXPos = f_dXPos;
- l_sButton.m_dYPos = f_dYPos;
- l_sButton.m_iType = f_iType;
- l_sButton.m_dHeight = f_dHeight;
+ l_sButton.m_dXPos = f_dXPos;
+ l_sButton.m_dYPos = f_dYPos;
+ l_sButton.m_iType = f_iType;
+ l_sButton.m_dHeight = f_dHeight;
+ l_sButton.m_dWidth = f_dWidth;
// copy title
memcpy(l_sButton.m_pcTitle, f_pcTitle, sizeof(f_pcTitle));
@@ -27,8 +29,6 @@ struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, i
switch (f_iType)
{
case BUTTON_CLICK:
- l_sButton.m_dCenterWidth = f_dCenterWidth;
-
l_sButton.m_piImgNormal[0] = BitmapLoad("img/button_click_left.bmp");
l_sButton.m_piImgNormal[1] = BitmapLoad("img/button_click_center.bmp");
l_sButton.m_piImgNormal[2] = BitmapLoad("img/button_click_right.bmp");
@@ -37,8 +37,17 @@ struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, i
l_sButton.m_piImgHover[1] = BitmapLoad("img/button_click_center_hover.bmp");
l_sButton.m_piImgHover[2] = BitmapLoad("img/button_click_right_hover.bmp");
- // calculate width of center image
- l_sButton.m_dWidth = f_dCenterWidth + l_sButton.m_piImgNormal[0].m_iWidth + l_sButton.m_piImgNormal[2].m_iWidth;
+ BitmapConvertWidth(&l_sButton.m_piImgNormal[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_piImgNormal[1], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_piImgNormal[2], f_dHeight);
+
+ BitmapConvertWidth(&l_sButton.m_piImgHover[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_piImgHover[1], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_piImgHover[2], f_dHeight);
+
+ // calculate (center)width of image
+ l_sButton.m_dCenterWidth = max(f_dWidth - l_sButton.m_piImgNormal[0].m_iWidth - l_sButton.m_piImgNormal[2].m_iWidth, 0);
+ l_sButton.m_dWidth = l_sButton.m_dCenterWidth + l_sButton.m_piImgNormal[0].m_iWidth + l_sButton.m_piImgNormal[2].m_iWidth;
break;
case BUTTON_RADIO:
@@ -46,9 +55,13 @@ struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, i
l_sButton.m_piImgHover[0] = BitmapLoad("img/button_radio_hover.bmp");
l_sButton.m_piImgPressed[0] = BitmapLoad("img/button_radio_pressed.bmp");
+ BitmapConvertWidth(&l_sButton.m_piImgNormal[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_piImgHover[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_piImgPressed[0], f_dHeight);
+
l_sButton.m_dCenterWidth = 0;
- l_sButton.m_dWidth = l_sButton.m_piImgNormal[0].m_iWidth;
- l_sButton.m_dHeight = l_sButton.m_piImgNormal[0].m_iHeight;
+ l_sButton.m_dHeight = f_dHeight;
+ l_sButton.m_dWidth = f_dWidth;
break;
case BUTTON_LABEL:
@@ -76,7 +89,7 @@ int ButtonGetType(struct ButtonStruct *f_sButton)
void ButtonClickRender(struct ButtonStruct *f_sButton)
{
char l_pcTitle[BUTTON_MAX_TITLE];
- struct ImageStruct *l_sImgButton;
+ struct BitmapStruct *l_sImgButton;
int l_iImgWidth, l_iImageIdLeft, l_iImageIdCenter, l_iImageIdRight;
double l_dXOffset, l_dYOffset;
@@ -89,24 +102,20 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
double l_dXPos = f_sButton->m_dXPos;
double l_dYPos = f_sButton->m_dYPos;
- if (f_sButton->m_bPressed)
- {
+ if (f_sButton->m_bPressed) {
//l_dYCoordBot += l_dYCoordTop;
//l_dYCoordTop -= l_dYCoordTop;
glColor3d(0.8, 0.9, 1);
}
- else
- {
+ else {
glColor3d(1, 1, 1);
}
// get the right image struct
- if (f_sButton->m_bHover)
- {
+ if (f_sButton->m_bHover) {
l_sImgButton = f_sButton->m_piImgHover;
}
- else
- {
+ else {
l_sImgButton = f_sButton->m_piImgNormal;
}
@@ -126,44 +135,42 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
l_dXOffset = l_dXPos;
l_dYOffset = l_dYPos;
- glBegin(GL_QUADS);
- glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset, l_dYOffset, 0);
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset + 1, l_dYOffset, 0);
glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
+ glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset + 1, l_dYOffset + l_dHeight, 0);
glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
- glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset, l_dYOffset + l_dHeight, 0);
glEnd();
- l_dXOffset += l_iImgWidth;
+ l_dXOffset = l_dXPos + l_iImgWidth + l_dCnWdt;
+
+ // render right side of button
+ glBindTexture(GL_TEXTURE_2D, l_iImageIdRight);
+
+ l_iImgWidth = l_sImgButton[2].m_iWidth;
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset - 1, l_dYOffset, 0);
+ glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
+ glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset - 1, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
+ glEnd();
+
+ l_dXOffset = l_dXOffset - l_dCnWdt;
// render center of button
if (l_dCnWdt > 0)
{
glBindTexture(GL_TEXTURE_2D, l_iImageIdCenter);
- l_iImgWidth = l_sImgButton[2].m_iWidth;
-
- glBegin(GL_QUADS);
- glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset, l_dYOffset, 0);
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset - 1, l_dYOffset, 0);
glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset, 0);
+ glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset - 1, l_dYOffset + l_dHeight, 0);
glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset + l_dHeight, 0);
- glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset, l_dYOffset + l_dHeight, 0);
glEnd();
}
- l_dXOffset += l_dCnWdt;
-
- // render right side of button
- glBindTexture(GL_TEXTURE_2D, l_iImageIdRight);
-
- l_iImgWidth = l_sImgButton[2].m_iWidth;
-
- glBegin(GL_QUADS);
- glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset, l_dYOffset, 0);
- glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
- glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
- glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset, l_dYOffset + l_dHeight, 0);
- glEnd();
-
if (f_sButton->m_bPressed)
{
glColor3d(1, 1, 1);
@@ -175,7 +182,7 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
void ButtonRadioRender(struct ButtonStruct *f_sButton)
{
- struct ImageStruct *l_sImgButton;
+ struct BitmapStruct *l_sImgButton;
int l_iImageId;
// copy button attributes
@@ -200,11 +207,11 @@ void ButtonRadioRender(struct ButtonStruct *f_sButton)
// render left side of button
glBindTexture(GL_TEXTURE_2D, l_iImageId);
- glBegin(GL_QUADS);
+ glBegin(GL_TRIANGLE_STRIP);
glTexCoord2d(0, 1); glVertex3d(l_dXPos, l_dYPos, 0);
glTexCoord2d(1, 1); glVertex3d(l_dXPos + l_dWidth, l_dYPos, 0);
- glTexCoord2d(1, 0); glVertex3d(l_dXPos + l_dWidth, l_dYPos + l_dHeight, 0);
glTexCoord2d(0, 0); glVertex3d(l_dXPos, l_dYPos + l_dHeight, 0);
+ glTexCoord2d(1, 0); glVertex3d(l_dXPos + l_dWidth, l_dYPos + l_dHeight, 0);
glEnd();
if (f_sButton->m_bPressed)
@@ -212,11 +219,11 @@ void ButtonRadioRender(struct ButtonStruct *f_sButton)
l_iImageId = f_sButton->m_piImgPressed[0].m_iImageId;
glBindTexture(GL_TEXTURE_2D, l_iImageId);
- glBegin(GL_QUADS);
+ glBegin(GL_TRIANGLE_STRIP);
glTexCoord2d(0, 1); glVertex3d(l_dXPos, l_dYPos, 0);
glTexCoord2d(1, 1); glVertex3d(l_dXPos + l_dWidth, l_dYPos, 0);
- glTexCoord2d(1, 0); glVertex3d(l_dXPos + l_dWidth, l_dYPos + l_dHeight, 0);
glTexCoord2d(0, 0); glVertex3d(l_dXPos, l_dYPos + l_dHeight, 0);
+ glTexCoord2d(1, 0); glVertex3d(l_dXPos + l_dWidth, l_dYPos + l_dHeight, 0);
glEnd();
}
@@ -266,7 +273,6 @@ void ButtonExit(struct ButtonStruct *f_sButton)
void ButtonPress(struct ButtonStruct *f_sButton)
{
-// f_sButton->m_bPressed = TRUE;
f_sButton->m_bPressed = !f_sButton->m_bPressed;
} // ButtonPress