Modified lines:  6, 7, 86, 123, 124
Added line:  57
Removed line:  None
Generated by diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  33-BadTeaPod.c     34-GoodTeaPod.c
  156 lines
5549 bytes
Last modified : Mon Oct 24 12:24:47 2011

    157 lines
5661 bytes
Last modified : Mon Oct 24 12:24:40 2011

1 // Keisanki Joron 2 (Introduction to Computing II)   1 // Keisanki Joron 2 (Introduction to Computing II)
2 // Dept. of Engineering Systems, University of Tsukuba   2 // Dept. of Engineering Systems, University of Tsukuba
3 // [UTF-8 / Unix]   3 // [UTF-8 / Unix]
4   4
5 // 2011/10/24 kameda[at]iit.tsukuba.ac.jp   5 // 2011/10/24 kameda[at]iit.tsukuba.ac.jp
6 // 3.3. Teapod!    6 // 3.4. Teapod! 
7 //      でも少しおかしい。特に注ぎ口。   7 //      Depth Mapを設定。
8   8
9 #include <stdlib.h> // exit()   9 #include <stdlib.h> // exit()
10 #include <GL/glut.h>   10 #include <GL/glut.h>
11   11
12 // +----------------------------------------------------   12 // +----------------------------------------------------
13 // Global Variables   13 // Global Variables
14 // +----------------------------------------------------   14 // +----------------------------------------------------
15   15
16 // +----------------------------------------------------   16 // +----------------------------------------------------
17 // 正方形を描く (白色の線幅 1.0)   17 // 正方形を描く (白色の線幅 1.0)
18 // +----------------------------------------------------   18 // +----------------------------------------------------
19 void ic2_FigSquare (float s) {   19 void ic2_FigSquare (float s) {
20   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る   20   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る
21   glColor3f(1.0, 1.0, 1.0);   21   glColor3f(1.0, 1.0, 1.0);
22   glLineWidth(1.0);   22   glLineWidth(1.0);
23   glBegin(GL_LINE_LOOP); {   23   glBegin(GL_LINE_LOOP); {
24     glVertex3f(s * -1, s * -1, 0.0);   24     glVertex3f(s * -1, s * -1, 0.0);
25     glVertex3f(s * +1, s * -1, 0.0);   25     glVertex3f(s * +1, s * -1, 0.0);
26     glVertex3f(s * +1, s * +1, 0.0);   26     glVertex3f(s * +1, s * +1, 0.0);
27     glVertex3f(s * -1, s * +1, 0.0);   27     glVertex3f(s * -1, s * +1, 0.0);
28   } glEnd();   28   } glEnd();
29   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   29   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
30 }   30 }
31   31
32 // +----------------------------------------------------   32 // +----------------------------------------------------
33 // ティーポットを描く (glutの作り付け関数の1つ)   33 // ティーポットを描く (glutの作り付け関数の1つ)
34 // +----------------------------------------------------   34 // +----------------------------------------------------
35 void ic2_FigSolidTeapot (float s) {   35 void ic2_FigSolidTeapot (float s) {
36   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)   36   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)
37   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)   37   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)
38   38
39   // 色の設定   39   // 色の設定
40   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);   40   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);
41   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);   41   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);
42   42
43   glutSolidTeapot(s);   43   glutSolidTeapot(s);
44 }   44 }
45   45
46 // +----------------------------------------------------   46 // +----------------------------------------------------
47 // 光源を用意   47 // 光源を用意
48 // +----------------------------------------------------   48 // +----------------------------------------------------
49 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)   49 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)
50 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4   50 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4
51 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4   51 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4
52 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0   52 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0
53 void ic2_LightSetA (void) {   53 void ic2_LightSetA (void) {
54   static int initflag = 0;   54   static int initflag = 0;
55   55
56   if (initflag == 0) {   56   if (initflag == 0) {
      57     glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う
57     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる   58     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる
58     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   59     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
59     glEnable(GL_LIGHT0);     // LIGHT0 を利用   60     glEnable(GL_LIGHT0);     // LIGHT0 を利用
60     glEnable(GL_LIGHT1);     // LIGHT1 を利用   61     glEnable(GL_LIGHT1);     // LIGHT1 を利用
61     glEnable(GL_LIGHT2);     // LIGHT2 を利用   62     glEnable(GL_LIGHT2);     // LIGHT2 を利用
62     initflag = 1;   63     initflag = 1;
63   }   64   }
64      65   
65   GLfloat val[4];   66   GLfloat val[4];
66   67
67   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);   68   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);
68   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);   69   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);
69   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);   70   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);
70   71
71   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);   72   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);
72   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);   73   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);
73   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);   74   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);
74   75
75   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);   76   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);
76   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);   77   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);
77   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);   78   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);
78 }   79 }
79   80
80 // +----------------------------------------------------   81 // +----------------------------------------------------
81 // スクリーンに描画する   82 // スクリーンに描画する
82 // +----------------------------------------------------   83 // +----------------------------------------------------
83 void ic2_DrawFrame (void) {   84 void ic2_DrawFrame (void) {
84   85
85   // 以前にglClearColor()で指定した色で塗り潰す   86   // 以前にglClearColor()で指定した色で塗り潰す
86   glClear(GL_COLOR_BUFFER_BIT);   87   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
87   88
88   // ある設定の光源の用意   89   // ある設定の光源の用意
89   ic2_LightSetA();   90   ic2_LightSetA();
90   91
91   // 物体描画:正方形   92   // 物体描画:正方形
92   ic2_FigSquare(0.9);   93   ic2_FigSquare(0.9);
93   // 物体描画:ティーポット   94   // 物体描画:ティーポット
94   ic2_FigSolidTeapot(0.5);   95   ic2_FigSolidTeapot(0.5);
95   96
96   // スクリーンの切り替え   97   // スクリーンの切り替え
97   glutSwapBuffers();   98   glutSwapBuffers();
98   99
99 }   100 }
100   101
101 // +----------------------------------------------------   102 // +----------------------------------------------------
102 // キーが何か押されたときの対策用関数    103 // キーが何か押されたときの対策用関数 
103 // +----------------------------------------------------   104 // +----------------------------------------------------
104 // glutKeyboardFunc()にて登録予定   105 // glutKeyboardFunc()にて登録予定
105 // 引数 : key ... 入力文字    106 // 引数 : key ... 入力文字 
106 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置    107 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置 
107 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置    108 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置 
108 void ic2_NormalKeyInput (unsigned char key, int x, int y) {   109 void ic2_NormalKeyInput (unsigned char key, int x, int y) {
109   switch (key) {   110   switch (key) {
110   case 'q' :   111   case 'q' :
111   case 'Q' :   112   case 'Q' :
112   case 27 : // ESCキーのこと   113   case 27 : // ESCキーのこと
113     exit (0);   114     exit (0);
114     break;   115     break;
115   }   116   }
116 }   117 }
117   118
118 // +----------------------------------------------------   119 // +----------------------------------------------------
119 // OpenGLとしてのWindowの初期化   120 // OpenGLとしてのWindowの初期化
120 // +----------------------------------------------------   121 // +----------------------------------------------------
121 void ic2_BootWindow (char winname[]) {   122 void ic2_BootWindow (char winname[]) {
122   123
123   // ダブルバッファ,RGB表色モード を利用   124   // ダブルバッファ,RGB表色モード,デプスバッファ を利用
124   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);    125   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
125   126
126   // ウィンドウを開く   127   // ウィンドウを開く
127   glutCreateWindow(winname);   128   glutCreateWindow(winname);
128   129
129   // レンダリングにはSmooth Shadingを採用   130   // レンダリングにはSmooth Shadingを採用
130   glShadeModel(GL_SMOOTH);   131   glShadeModel(GL_SMOOTH);
131   132
132   // ウィンドウ全体を書き直すときの色(ここでは黒)   133   // ウィンドウ全体を書き直すときの色(ここでは黒)
133   glClearColor(0.0, 0.0, 0.0, 0.0);   134   glClearColor(0.0, 0.0, 0.0, 0.0);
134   135
135   // Callback関数を設定 (イベント処理)   136   // Callback関数を設定 (イベント処理)
136   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)   137   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)
137   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの準備   138   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの準備
138 }   139 }
139   140
140 //d main.c  **********************************************************************   141 //d main.c  **********************************************************************
141 // +----------------------------------------------------   142 // +----------------------------------------------------
142 // Main Function   143 // Main Function
143 // +----------------------------------------------------   144 // +----------------------------------------------------
144 int main (int argc, char *argv[]) {   145 int main (int argc, char *argv[]) {
145   146
146   // glutライブラリによる引数の解釈   147   // glutライブラリによる引数の解釈
147   glutInit(&argc, argv);   148   glutInit(&argc, argv);
148   149
149   // OpenGL Window の初期化   150   // OpenGL Window の初期化
150   ic2_BootWindow(argv[0]);   151   ic2_BootWindow(argv[0]);
151   152
152   // 無限ループの開始   153   // 無限ループの開始
153   glutMainLoop();   154   glutMainLoop();
154      155   
155   return 0;   156   return 0;
156 }   157 }

Generated by diff2html.pl on Mon Oct 24 12:33:20 2011
Command-line:
/home/ubuntu/scripts/diff2html.pl 33-BadTeaPod.c 34-GoodTeaPod.c