#include <gl/glut.h>
#include <cstdio>
GLfloat locationX = 0.0f, locationY = 0.0f;
const GLfloat step = 0.02f;
const GLfloat size = 0.2f;
int winId;
void Menu(int value);
void Keyboard(unsigned char key, int x, int y);
void Special(int key, int x, int y);
void Mouse(int button, int state, int x, int y);
void Display();
int main(int argc, char** argv)
{
glutInit(&argc, argv);
winId = glutCreateWindow("OpenGL");
glutKeyboardFunc(Keyboard);
glutSpecialFunc(Special);
glutMouseFunc(Mouse);
// Sub menu
GLint SubMenu = glutCreateMenu(Menu);
glutAddMenuEntry("Red", 4);
glutAddMenuEntry("Green", 5);
glutAddMenuEntry("Blue", 6);
// Menu
glutCreateMenu(Menu);
glutAddMenuEntry("White", 1);
glutAddMenuEntry("Black", 2);
glutAddMenuEntry("Gray", 3);
// Add sub menu
glutAddSubMenu("Triangle Color", SubMenu);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(Display);
glutMainLoop();
return 0;
}
void Menu(int value)
{
switch (value) {
case 1:
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 배경 흰색
break;
case 2:
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 배경 검정색
break;
case 3:
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); // 배경 회색
break;
case 4:
glColor3f(1.0f, 0.0f, 0.0f); // 삼감형 빨간색
break;
case 5:
glColor3f(0.0f, 1.0f, 0.0f); // 삼감형 녹색
break;
case 6:
glColor3f(0.0f, 0.0f, 1.0f); // 삼감형 파란색
break;
default:
break;
}
glutPostRedisplay();
}
void Keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'r':
case 'R':
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // 배경 빨간색
break;
case 'g':
case 'G':
glClearColor(0.0f, 1.0f, 0.0f, 1.0f); // 배경 녹색
break;
case 'b':
case 'B':
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // 배경 파란색
break;
case 27:
glutDestroyWindow(winId); // ESC키 프로그램 종료
exit(0);
break;
default:
break;
}
glutPostRedisplay();
}
void Special(int key, int x, int y)
{
switch (key) {
case GLUT_KEY_LEFT: // step 만큼 x감소
locationX -= step;
break;
case GLUT_KEY_RIGHT: // step 만큼 x증가
locationX += step;
break;
case GLUT_KEY_UP: // step 만큼 y증가
locationY += step;
break;
case GLUT_KEY_DOWN: // step 만큼 y감소
locationY -= step;
break;
}
char title[128] = {0,};
sprintf(title, "Triangle location (%.2f, y=%.2f)", locationX, locationY);
glutSetWindowTitle(title); // 제목표시줄에 삼각형 좌표 표시
glutPostRedisplay();
}
void Mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
glColor3f(0.0f, 1.0f, 1.0f); // 삼각형 하늘색
char title[128] = { 0, };
sprintf(title, "Click (x: %d, y: %d)", x, y);
glutSetWindowTitle(title); // 제목표시줄에 클릭 좌표 표시
glutPostRedisplay();
}
else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP){
glColor3f(1.0f, 1.0f, 0.0f); // 삼각형 노란색
glutPostRedisplay();
}
}
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2f(locationX, locationY + size);
glVertex2f(locationX - size, locationY - size);
glVertex2f(locationX + size, locationY - size);
glEnd();
glFinish();
}