#ifdef G_OS_WIN32 #define WIN32_LEAN_AND_MEAN 1 #include #endif #include #include #include #include #include "button.h" 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_dWidth = f_dWidth; // copy title memcpy(l_sButton.m_pcTitle, f_pcTitle, sizeof(f_pcTitle)); switch (f_iType) { case BUTTON_CLICK: 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"); l_sButton.m_piImgHover[0] = BitmapLoad("img/button_click_left_hover.bmp"); l_sButton.m_piImgHover[1] = BitmapLoad("img/button_click_center_hover.bmp"); l_sButton.m_piImgHover[2] = BitmapLoad("img/button_click_right_hover.bmp"); 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: l_sButton.m_piImgNormal[0] = BitmapLoad("img/button_radio.bmp"); 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_dHeight = f_dHeight; l_sButton.m_dWidth = f_dWidth; break; case BUTTON_LABEL: default: break; } l_sButton.m_bPressed = FALSE; l_sButton.m_bHover = FALSE; return l_sButton; } // ButtonCreate int ButtonGetType(struct ButtonStruct *f_sButton) { return f_sButton->m_iType; } // ButtonGetType void ButtonClickRender(struct ButtonStruct *f_sButton) { char l_pcTitle[BUTTON_MAX_TITLE]; struct BitmapStruct *l_sImgButton; int l_iImgWidth, l_iImageIdLeft, l_iImageIdCenter, l_iImageIdRight; double l_dXOffset, l_dYOffset; double l_dYCoordTop = 1; double l_dYCoordBot = 0; // copy button attributes double l_dCnWdt = f_sButton->m_dCenterWidth; double l_dHeight = f_sButton->m_dHeight; double l_dXPos = f_sButton->m_dXPos; double l_dYPos = f_sButton->m_dYPos; if (f_sButton->m_bPressed) { //l_dYCoordBot += l_dYCoordTop; //l_dYCoordTop -= l_dYCoordTop; glColor3d(0.8, 0.9, 1); } else { glColor3d(1, 1, 1); } // get the right image struct if (f_sButton->m_bHover) { l_sImgButton = f_sButton->m_piImgHover; } else { l_sImgButton = f_sButton->m_piImgNormal; } // copy buttom images l_iImageIdLeft = l_sImgButton[0].m_iImageId; l_iImageIdCenter = l_sImgButton[1].m_iImageId; l_iImageIdRight = l_sImgButton[2].m_iImageId; // copy button title memset(&l_pcTitle, 0, sizeof(l_pcTitle)); memcpy(&l_pcTitle, f_sButton->m_pcTitle, sizeof(f_sButton->m_pcTitle)); // render left side of button glBindTexture(GL_TEXTURE_2D, l_iImageIdLeft); l_iImgWidth = l_sImgButton[0].m_iWidth; l_dXOffset = l_dXPos; l_dYOffset = l_dYPos; 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_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); 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); glEnd(); } if (f_sButton->m_bPressed) { glColor3d(1, 1, 1); } } // ButtonClickRender void ButtonRadioRender(struct ButtonStruct *f_sButton) { struct BitmapStruct *l_sImgButton; int 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; // get the right image struct if (f_sButton->m_bHover) { l_sImgButton = f_sButton->m_piImgHover; } else { l_sImgButton = f_sButton->m_piImgNormal; } // copy buttom images l_iImageId = l_sImgButton[0].m_iImageId; // render left side of button glBindTexture(GL_TEXTURE_2D, l_iImageId); 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(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) { l_iImageId = f_sButton->m_piImgPressed[0].m_iImageId; glBindTexture(GL_TEXTURE_2D, l_iImageId); 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(0, 0); glVertex3d(l_dXPos, l_dYPos + l_dHeight, 0); glTexCoord2d(1, 0); glVertex3d(l_dXPos + l_dWidth, l_dYPos + l_dHeight, 0); glEnd(); } } // ButtonRadioRender void ButtonRender(struct ButtonStruct *f_sButton) { int l_iType = f_sButton->m_iType; switch (l_iType) { case BUTTON_CLICK: ButtonClickRender(f_sButton); break; case BUTTON_RADIO: ButtonRadioRender(f_sButton); break; case BUTTON_LABEL: default: break; } } // ButtonRender void ButtonEnter(struct ButtonStruct *f_sButton) { f_sButton->m_bHover = TRUE; } // ButtonHover void ButtonExit(struct ButtonStruct *f_sButton) { f_sButton->m_bHover = FALSE; } // ButtonHover void ButtonPress(struct ButtonStruct *f_sButton) { f_sButton->m_bPressed = !f_sButton->m_bPressed; } // ButtonPress void ButtonRelease(struct ButtonStruct *f_sButton) { f_sButton->m_bPressed = FALSE; } // ButtonPress