root/samples/hajimete/sample24.cpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. display
  2. reshape
  3. keyboard
  4. idle
  5. otherInit
  6. main

#include <stdlib.h>//glut.hより先にインクルードする

#include <gl/glut.h>

//外部変数(キューブ、トーラス、オクタ)

GLuint cubeId,torusId,octaId;
GLuint listId = 0;//制御用Id


//------- 各種コールバック-------//

void display(void)
{
        static int angle = 0;
        static GLfloat Light0Pos[]={1,1,1,0}; //光源の位置

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        gluLookAt(0.0, 2.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
        glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);//位置設定


        glColor3f(0.f, 1.f, 0.f);
        glPushMatrix();
        glRotatef(float(angle),0.f, 1.f, 0.f);
        glCallList(listId);//ディスプレイ・リストの呼び出し

        glPopMatrix();
        glColor3f(1.f, 1.f, 1.f);

        glutSwapBuffers();
        if(++angle >= 360) angle = 0;
}

void reshape(int w, int h)
{
        glViewport(0,0,w,h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(30.0, double(w)/h, 0.1, 200.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

void keyboard(unsigned char key, int w, int h)
{
        switch(key)
        {
        case '1':
                listId = cubeId;
                break;
        case '2':
                listId = torusId;
                break;
        case '3':
                listId = octaId;
                break;
        case 'q':
        case '\033':
                //不要になったら削除

                glDeleteLists(listId, 3); //先頭Idから3つ分

                exit(0);
                break;
        default:
                break;
        }
}

void idle(void)
{
        glutPostRedisplay();
}

//その他設定

void otherInit(void)
{
        glClearColor(1.f ,1.f, 1.f, 1.f);
        glEnable(GL_DEPTH_TEST);
        //カラーマテリアル

        glColorMaterial(GL_FRONT_AND_BACK,
                                        GL_AMBIENT_AND_DIFFUSE);
        glEnable(GL_COLOR_MATERIAL);
    //光源の設定   

        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);

        //ディスプレイリスト作成

        //Idを設定

        listId = glGenLists(3); //3つ作成(先頭番号が返る)

        cubeId = listId;
        torusId = listId + 1;
        octaId = listId + 2 ;
        //1つめ

        glNewList(cubeId,GL_COMPILE);
        glutSolidCube(1.0);
        glEndList();
        //2つめ

        glNewList(torusId,GL_COMPILE);
        glutSolidTorus(0.2,0.4,30,30);
        glEndList();
        //3つめ

        glNewList(octaId,GL_COMPILE);
        glutSolidOctahedron();
        glEndList();
}

//--------- メイン関数-----------//

int main(int argc, char *argv[])
{
        //glutの初期設定

        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
        glutInitWindowSize(640,480);
        glutCreateWindow("display list");

        //コールバック関数の登録

        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        glutKeyboardFunc(keyboard);
        glutIdleFunc(idle);
        otherInit();//その他初期設定


        glutMainLoop();

        return 0;
}

/* [<][>][^][v][top][bottom][index][help] */