そろそろクラスに分けたくなってきたので、1ファイルにC言語的に関数の集合で書くのは終わりにしよう。
そこで、これまでに書いたコードを下記においておこうと思う。取っ掛かりには良いと思う。
【要素】
・マウス処理
・線や球の描画
・ウィンドウのサイズ変更
・透視投影 など
#include <gl/glut.h>
#include <stdio.h>
#include <string.h>
int mouseX=0;
int mouseY=0;
void drawString(char* str, int x, int y){
glRasterPos2d(x,y);
void *font = GLUT_BITMAP_TIMES_ROMAN_24;
for(unsigned int i=0; i<strlen(str); i++){
glutBitmapCharacter(font, str[i]);
}
}
void idle(void){
glutPostRedisplay();
}
void drawAxis(void){
glBegin(GL_LINES);
glColor3d(1,0,0);
glVertex3d(0,0,0);
glVertex3d(100,0,0);
glColor3d(0,1,0);
glVertex3d(0,0,0);
glVertex3d(0,100,0);
glColor3d(0,0,1);
glVertex3d(0,0,0);
glVertex3d(0,0,100);
glEnd();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
char str[] = "helloOpenGL";
drawString(str,mouseX,mouseY);
glLoadIdentity();
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
static float r = 0.0f;
glRotated((double)r, 0.0, 1.0, 0.0);
r += 1.00;
if(r >= 360){r=0;}
glColor3d(1,1,1);
glBegin(GL_LINE_LOOP);
glVertex2d(-1.0,-1.0);
glVertex2d(+1.0,-1.0);
glVertex2d(+1.0,+1.0);
glVertex2d(-1.0,+1.0);
glEnd();
drawAxis();
glutWireSphere(1, 8, 8);
glutSwapBuffers();
}
void init(void)
{
glClearColor(0.7, 0.7, 0.7, 1.0);
glEnable(GL_DEPTH_TEST);
}
void resize(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
}
void mouse(int button, int state, int x, int y)
{
mouseX=x;
mouseY=y;
switch(button){
case GLUT_LEFT_BUTTON:
printf("left");
break;
case GLUT_MIDDLE_BUTTON:
printf("middle");
break;
case GLUT_RIGHT_BUTTON:
printf("right");
break;
default:
break;
}
printf(" button is ");
switch(state){
case GLUT_UP:
printf("up");
break;
case GLUT_DOWN:
printf("down");
glutIdleFunc(idle);
break;
default:
break;
}
}
int main(int argc, char* argv[])
{
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("Display Size Trainer");
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutMouseFunc(mouse);
init();
glutMainLoop();
return 0;
}