Modified lines:  6, 339, 340, 341, 342
Added line:  30, 31, 32, 346, 347, 407, 408
Removed line:  None
Generated by diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  ../110-1/110-1-MergedSource.c     110-2-TogglePredefined.c
  482 lines
17874 bytes
Last modified : Sat Nov 12 18:55:55 2011

    489 lines
18111 bytes
Last modified : Sun Nov 13 17:49:22 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/11/07 kameda[at]iit.tsukuba.ac.jp   5 // 2011/11/07 kameda[at]iit.tsukuba.ac.jp
6 // 10.1 モデル読み込みとCG表示の統合   6 // 10.2 既定義モデルのトグル (キー 'T')
7   7
8 #include <stdio.h>   8 #include <stdio.h>
9 #include <stdlib.h> // exit(), calloc()   9 #include <stdlib.h> // exit(), calloc()
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 // Global Variables   16 // Global Variables
17 // +----------------------------------------------------   17 // +----------------------------------------------------
18   18
19 // Windowサイズ   19 // Windowサイズ
20 int window_w = 400;   20 int window_w = 400;
21 int window_h = 400;   21 int window_h = 400;
22   22
23 // 直交投影時のスケールファクタ [pixel / unit_of_imager]   23 // 直交投影時のスケールファクタ [pixel / unit_of_imager]
24 // ここでは正規化カメラの撮像面での 1.0 単位を 200画素に相当させる   24 // ここでは正規化カメラの撮像面での 1.0 単位を 200画素に相当させる
25 float ortho_unit = 200.0;    25 float ortho_unit = 200.0; 
26   26
27 // WindowのID(描画管理用)   27 // WindowのID(描画管理用)
28 int window_id = -1;   28 int window_id = -1;
29   29
      30 // トグルスイッチ (1 ... On, -1 ... Off)
      31 int tgl_showpredefined = -1; // プログラム内定義物体の表示
      32
30 // ***********************************************************************    33 // *********************************************************************** 
31 // read model ************************************************************   34 // read model ************************************************************
32   35
33 // +----------------------------------------------------   36 // +----------------------------------------------------
34 // 1つの点のための構造体   37 // 1つの点のための構造体
35 // +----------------------------------------------------   38 // +----------------------------------------------------
36 struct ic2POINT {   39 struct ic2POINT {
37   float x;   40   float x;
38   float y;   41   float y;
39   float z;   42   float z;
40 };   43 };
41   44
42 // +----------------------------------------------------   45 // +----------------------------------------------------
43 // 1つの色のための構造体   46 // 1つの色のための構造体
44 // +----------------------------------------------------   47 // +----------------------------------------------------
45 struct ic2COLOR {   48 struct ic2COLOR {
46   float r;   49   float r;
47   float g;   50   float g;
48   float b;   51   float b;
49 };   52 };
50   53
51 // +----------------------------------------------------   54 // +----------------------------------------------------
52 // 1つの三角形パッチのための構造体   55 // 1つの三角形パッチのための構造体
53 // 次の三角形パッチへのポインタを持つ。   56 // 次の三角形パッチへのポインタを持つ。
54 // v(st) × v(su) [外積]がこの面の法線ベクトルを成す(右ネジ式)   57 // v(st) × v(su) [外積]がこの面の法線ベクトルを成す(右ネジ式)
55 // +----------------------------------------------------   58 // +----------------------------------------------------
56 struct ic2PATCH {   59 struct ic2PATCH {
57   struct ic2POINT s;     // 頂点s   60   struct ic2POINT s;     // 頂点s
58   struct ic2POINT t;     // 頂点t   61   struct ic2POINT t;     // 頂点t
59   struct ic2POINT u;     // 頂点u   62   struct ic2POINT u;     // 頂点u
60   struct ic2COLOR c;     // 色の強度 (通常は0.0 - 1.0)   63   struct ic2COLOR c;     // 色の強度 (通常は0.0 - 1.0)
61   struct ic2PATCH *next; // 次の三角形パッチへのポインタ   64   struct ic2PATCH *next; // 次の三角形パッチへのポインタ
62 };   65 };
63   66
64 // +++--------------------------------------------------   67 // +++--------------------------------------------------
65 // 新しい三角形パッチ構造体(ic2PATCH)のメモリ確保と初期化   68 // 新しい三角形パッチ構造体(ic2PATCH)のメモリ確保と初期化
66 // +++--------------------------------------------------   69 // +++--------------------------------------------------
67 static struct ic2PATCH *ic2_NewPATCH (void) {   70 static struct ic2PATCH *ic2_NewPATCH (void) {
68   struct ic2PATCH *newpatch = NULL;   71   struct ic2PATCH *newpatch = NULL;
69   72
70   newpatch = (struct ic2PATCH *)calloc(1, sizeof(struct ic2PATCH));   73   newpatch = (struct ic2PATCH *)calloc(1, sizeof(struct ic2PATCH));
71   return (newpatch);   74   return (newpatch);
72 }   75 }
73   76
74 // +++--------------------------------------------------   77 // +++--------------------------------------------------
75 // 三角形パッチ構造体(ic2PATCH)1つ分の読み込み   78 // 三角形パッチ構造体(ic2PATCH)1つ分の読み込み
76 // +++--------------------------------------------------   79 // +++--------------------------------------------------
77 static int ic2_InsertPATCH (struct ic2PATCH **firstpatchptr, char *onelinedata) {   80 static int ic2_InsertPATCH (struct ic2PATCH **firstpatchptr, char *onelinedata) {
78   // (1) 文字列へのポインタは存在するか   81   // (1) 文字列へのポインタは存在するか
79   // (2) メモリ確保/下請け   82   // (2) メモリ確保/下請け
80   // (3) 値の読み込み   83   // (3) 値の読み込み
81   // (4) ic2PATCHリスト構造への組み込み   84   // (4) ic2PATCHリスト構造への組み込み
82   struct ic2PATCH *newpatch = NULL; // 三角形パッチ構造体ヘのポインタ   85   struct ic2PATCH *newpatch = NULL; // 三角形パッチ構造体ヘのポインタ
83   int number_of_element = 0;        // 読み込めた項目数   86   int number_of_element = 0;        // 読み込めた項目数
84   87
85   // (1) 文字列へのポインタは存在するか   88   // (1) 文字列へのポインタは存在するか
86   if (onelinedata == NULL) return 1;   89   if (onelinedata == NULL) return 1;
87   90
88   // (2) メモリ確保/下請け   91   // (2) メモリ確保/下請け
89   if ((newpatch = ic2_NewPATCH()) == NULL) {   92   if ((newpatch = ic2_NewPATCH()) == NULL) {
90     printf("ic2_InsertPATCH: Memory allocation failed.\n");   93     printf("ic2_InsertPATCH: Memory allocation failed.\n");
91     return 2;   94     return 2;
92   }   95   }
93   96
94   // (3) 値の読み込み   97   // (3) 値の読み込み
95   number_of_element =    98   number_of_element = 
96     sscanf(onelinedata, "%f %f %f  %f %f %f  %f %f %f  %f %f %f",    99     sscanf(onelinedata, "%f %f %f  %f %f %f  %f %f %f  %f %f %f", 
97    &newpatch->s.x, &newpatch->s.y, &newpatch->s.z,   100    &newpatch->s.x, &newpatch->s.y, &newpatch->s.z,
98    &newpatch->t.x, &newpatch->t.y, &newpatch->t.z,   101    &newpatch->t.x, &newpatch->t.y, &newpatch->t.z,
99    &newpatch->u.x, &newpatch->u.y, &newpatch->u.z,   102    &newpatch->u.x, &newpatch->u.y, &newpatch->u.z,
100    &newpatch->c.r, &newpatch->c.g, &newpatch->c.b);   103    &newpatch->c.r, &newpatch->c.g, &newpatch->c.b);
101   if (number_of_element != 12) {   104   if (number_of_element != 12) {
102     printf("ic2_InsertPATCH: format error (%d elements found)\n", number_of_element);   105     printf("ic2_InsertPATCH: format error (%d elements found)\n", number_of_element);
103     printf("ic2_InsertPATCH: \"%s\"\n", onelinedata);   106     printf("ic2_InsertPATCH: \"%s\"\n", onelinedata);
104     free(newpatch);   107     free(newpatch);
105     return 3;   108     return 3;
106   }   109   }
107   110
108   // (4) ic2PATCHリスト構造への組み込み   111   // (4) ic2PATCHリスト構造への組み込み
109   // *newpatch を 三角形パッチ集合の先頭に挿入   112   // *newpatch を 三角形パッチ集合の先頭に挿入
110   newpatch->next = *firstpatchptr;   113   newpatch->next = *firstpatchptr;
111   *firstpatchptr = newpatch;   114   *firstpatchptr = newpatch;
112   return 0;   115   return 0;
113 }   116 }
114   117
115 // +----------------------------------------------------   118 // +----------------------------------------------------
116 // モデルのファイルからの読込   119 // モデルのファイルからの読込
117 // +----------------------------------------------------   120 // +----------------------------------------------------
118 // 返値:負 ... エラー   121 // 返値:負 ... エラー
119 // 返値:0ないし正値 ... 読み込みに成功したパッチ数   122 // 返値:0ないし正値 ... 読み込みに成功したパッチ数
120 int ic2_ReadModel(char *filename, struct ic2PATCH **firstpatchptr) {   123 int ic2_ReadModel(char *filename, struct ic2PATCH **firstpatchptr) {
121   FILE *filetoopen = NULL; // A pointer to FILE structure   124   FILE *filetoopen = NULL; // A pointer to FILE structure
122   char oneline[256]; // 1行分のバッファ,固定長にしておくとsizeof()が利用可能   125   char oneline[256]; // 1行分のバッファ,固定長にしておくとsizeof()が利用可能
123   char firstword[256]; // コメント行かどうかの判定用   126   char firstword[256]; // コメント行かどうかの判定用
124   int  linenumber = 0; // ファイル中の行番号   127   int  linenumber = 0; // ファイル中の行番号
125   int  patchnumber = 0; // パッチ数   128   int  patchnumber = 0; // パッチ数
126   129
127   // We need at least one option to indicate a file to open   130   // We need at least one option to indicate a file to open
128   if (filename == NULL) {    131   if (filename == NULL) { 
129     printf("Error: You need to specify a one file to open.\n");   132     printf("Error: You need to specify a one file to open.\n");
130     return -1;   133     return -1;
131   }   134   }
132   135
133   // Try to open it   136   // Try to open it
134   filetoopen = fopen(filename, "r");   137   filetoopen = fopen(filename, "r");
135   if (filetoopen == NULL) {   138   if (filetoopen == NULL) {
136     printf("Error: Failed to open/read \"%s\".\n", filename);   139     printf("Error: Failed to open/read \"%s\".\n", filename);
137     return -2;   140     return -2;
138   }   141   }
139   printf("Reading model from \"%s\"\n", filename);   142   printf("Reading model from \"%s\"\n", filename);
140   143
141   // 1行ずつ読込   144   // 1行ずつ読込
142   while (fgets(oneline, sizeof(oneline), filetoopen) != NULL) {   145   while (fgets(oneline, sizeof(oneline), filetoopen) != NULL) {
143     linenumber++;   146     linenumber++;
144   147
145     // もし行内に1文字もなければ(1単語もなければ)次行へ   148     // もし行内に1文字もなければ(1単語もなければ)次行へ
146     if (sscanf(oneline, "%256s", firstword) < 1)   149     if (sscanf(oneline, "%256s", firstword) < 1)
147       continue;   150       continue;
148     // もし先頭が#で始まっていれば次行へ   151     // もし先頭が#で始まっていれば次行へ
149     if (firstword[0] == '#')    152     if (firstword[0] == '#') 
150       continue;   153       continue;
151     // 他のエラートラップ   154     // 他のエラートラップ
152     if (0) {   155     if (0) {
153       printf("Skip(line=%d): %s\n", linenumber, oneline);   156       printf("Skip(line=%d): %s\n", linenumber, oneline);
154       continue;   157       continue;
155     }   158     }
156   159
157     if (ic2_InsertPATCH(firstpatchptr, oneline)) {   160     if (ic2_InsertPATCH(firstpatchptr, oneline)) {
158       printf("Model reading is interrupted.\n");   161       printf("Model reading is interrupted.\n");
159       break;   162       break;
160     }   163     }
161     patchnumber++;   164     patchnumber++;
162   }   165   }
163   166
164   // And close it   167   // And close it
165   if (fclose(filetoopen) != 0) {   168   if (fclose(filetoopen) != 0) {
166     printf("Error: Failed to close \"%s\".\n", filename);   169     printf("Error: Failed to close \"%s\".\n", filename);
167     // error, but we get data anyway...   170     // error, but we get data anyway...
168   }   171   }
169   172
170   printf("Finish reading the model (%d patches).\n", patchnumber);   173   printf("Finish reading the model (%d patches).\n", patchnumber);
171   return patchnumber;   174   return patchnumber;
172 }   175 }
173   176
174 // -----------------------------------------------------   177 // -----------------------------------------------------
175 // 三角形パッチ構造体(ic2PATCH)リストの表示   178 // 三角形パッチ構造体(ic2PATCH)リストの表示
176 // -----------------------------------------------------   179 // -----------------------------------------------------
177 int ic2_PrintPATCHList (struct ic2PATCH *firstpatchptr) {   180 int ic2_PrintPATCHList (struct ic2PATCH *firstpatchptr) {
178   struct ic2PATCH *p;   181   struct ic2PATCH *p;
179   int np = 0;   182   int np = 0;
180   183
181   for (p = firstpatchptr; p != NULL; p = p->next) {   184   for (p = firstpatchptr; p != NULL; p = p->next) {
182     np++;   185     np++;
183     printf("PATCH: (%g, %g, %g), (%g, %g, %g), (%g, %g, %g), rgb=[%g, %g, %g]\n",   186     printf("PATCH: (%g, %g, %g), (%g, %g, %g), (%g, %g, %g), rgb=[%g, %g, %g]\n",
184    p->s.x, p->s.y, p->s.z,   187    p->s.x, p->s.y, p->s.z,
185    p->t.x, p->t.y, p->t.z,   188    p->t.x, p->t.y, p->t.z,
186    p->u.x, p->u.y, p->u.z,   189    p->u.x, p->u.y, p->u.z,
187    p->c.r, p->c.g, p->c.b);   190    p->c.r, p->c.g, p->c.b);
188   }   191   }
189   192
190   return np;   193   return np;
191 }   194 }
192   195
193 // ***********************************************************************    196 // *********************************************************************** 
194 // gl utilitiess *********************************************************   197 // gl utilitiess *********************************************************
195   198
196 // +----------------------------------------------------   199 // +----------------------------------------------------
197 // MODELVIEW Matrix と PROJECTION を表示する   200 // MODELVIEW Matrix と PROJECTION を表示する
198 // +----------------------------------------------------   201 // +----------------------------------------------------
199 void ic2_ShowMATRIX (char *str) {   202 void ic2_ShowMATRIX (char *str) {
200   GLfloat m[16]; // GL_MODELVIEW matrix   203   GLfloat m[16]; // GL_MODELVIEW matrix
201   GLfloat p[16]; // GL_PROJECTION matrix   204   GLfloat p[16]; // GL_PROJECTION matrix
202   205
203   glGetFloatv(GL_MODELVIEW_MATRIX , m);  // MODELVIEWのスタックトップmatrixをmにコピー   206   glGetFloatv(GL_MODELVIEW_MATRIX , m);  // MODELVIEWのスタックトップmatrixをmにコピー
204   glGetFloatv(GL_PROJECTION_MATRIX, p); // PROJECTIONのスタックトップmatrixをpにコピー   207   glGetFloatv(GL_PROJECTION_MATRIX, p); // PROJECTIONのスタックトップmatrixをpにコピー
205   if (str != NULL) printf("<< %s >>\n", str);   208   if (str != NULL) printf("<< %s >>\n", str);
206   printf("MODELVIEW Matrix                        PROJECTION Matrix\n");   209   printf("MODELVIEW Matrix                        PROJECTION Matrix\n");
207   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",   210   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",
208           m[ 0], m[ 4], m[ 8], m[12],     p[ 0], p[ 4], p[ 8], p[12]);   211           m[ 0], m[ 4], m[ 8], m[12],     p[ 0], p[ 4], p[ 8], p[12]);
209   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",    212   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n", 
210           m[ 1], m[ 5], m[ 9], m[13],     p[ 1], p[ 5], p[ 9], p[13]);   213           m[ 1], m[ 5], m[ 9], m[13],     p[ 1], p[ 5], p[ 9], p[13]);
211   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",    214   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n", 
212           m[ 2], m[ 6], m[10], m[14],     p[ 2], p[ 6], p[10], p[14]);   215           m[ 2], m[ 6], m[10], m[14],     p[ 2], p[ 6], p[10], p[14]);
213   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",    216   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n", 
214           m[ 3], m[ 7], m[11], m[15],     p[ 3], p[ 7], p[11], p[15]);   217           m[ 3], m[ 7], m[11], m[15],     p[ 3], p[ 7], p[11], p[15]);
215 }   218 }
216   219
217 // ***********************************************************************    220 // *********************************************************************** 
218 // objects_embeded *******************************************************   221 // objects_embeded *******************************************************
219   222
220 // +----------------------------------------------------   223 // +----------------------------------------------------
221 // 正方形を描く   224 // 正方形を描く
222 // +----------------------------------------------------   225 // +----------------------------------------------------
223 void ic2_FigSquare (float s) {   226 void ic2_FigSquare (float s) {
224   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る   227   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る
225   228
226   // 正方形(Z=0の平面内、+/- 0.9)   229   // 正方形(Z=0の平面内、+/- 0.9)
227   glBegin(GL_LINE_LOOP); {   230   glBegin(GL_LINE_LOOP); {
228     glColor3f(1.0, 1.0, 1.0);   231     glColor3f(1.0, 1.0, 1.0);
229     glVertex3f(s * -1, s * -1, 0.0);   232     glVertex3f(s * -1, s * -1, 0.0);
230     glVertex3f(s * +1, s * -1, 0.0);   233     glVertex3f(s * +1, s * -1, 0.0);
231     glVertex3f(s * +1, s * +1, 0.0);   234     glVertex3f(s * +1, s * +1, 0.0);
232     glVertex3f(s * -1, s * +1, 0.0);   235     glVertex3f(s * -1, s * +1, 0.0);
233   } glEnd();   236   } glEnd();
234   237
235   // 3軸   238   // 3軸
236   glBegin(GL_LINES); {   239   glBegin(GL_LINES); {
237     glColor3f(1.0, 0.5, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.85, 0.0,  0.0); // X (red)   240     glColor3f(1.0, 0.5, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.85, 0.0,  0.0); // X (red)
238     glColor3f(0.5, 1.0, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.70, 0.0); // Y (green)   241     glColor3f(0.5, 1.0, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.70, 0.0); // Y (green)
239     glColor3f(0.5, 0.5, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.0,  1.0); // Z (blue)   242     glColor3f(0.5, 0.5, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.0,  1.0); // Z (blue)
240   } glEnd();   243   } glEnd();
241   244
242   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   245   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
243 }   246 }
244   247
245 // +----------------------------------------------------   248 // +----------------------------------------------------
246 // ティーポットを描く (glutの作り付け関数の1つ)   249 // ティーポットを描く (glutの作り付け関数の1つ)
247 // +----------------------------------------------------   250 // +----------------------------------------------------
248 void ic2_FigSolidTeapot (float s) {   251 void ic2_FigSolidTeapot (float s) {
249   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)   252   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)
250   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)   253   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)
251   254
252   // 色の設定   255   // 色の設定
253   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);   256   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);
254   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);   257   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);
255   258
256   glutSolidTeapot(s);   259   glutSolidTeapot(s);
257 }   260 }
258   261
259 // ***********************************************************************    262 // *********************************************************************** 
260 // lighting **************************************************************    263 // lighting ************************************************************** 
261   264
262 // +----------------------------------------------------   265 // +----------------------------------------------------
263 // 光源を用意   266 // 光源を用意
264 // +----------------------------------------------------   267 // +----------------------------------------------------
265 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)   268 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)
266 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4   269 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4
267 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4   270 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4
268 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0   271 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0
269 void ic2_LightSetA (void) {   272 void ic2_LightSetA (void) {
270   static int initflag = 0;   273   static int initflag = 0;
271   274
272   if (initflag == 0) {   275   if (initflag == 0) {
273     glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う   276     glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う
274     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる   277     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる
275     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   278     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
276     glEnable(GL_LIGHT0);     // LIGHT0 を利用   279     glEnable(GL_LIGHT0);     // LIGHT0 を利用
277     glEnable(GL_LIGHT1);     // LIGHT1 を利用   280     glEnable(GL_LIGHT1);     // LIGHT1 を利用
278     glEnable(GL_LIGHT2);     // LIGHT2 を利用   281     glEnable(GL_LIGHT2);     // LIGHT2 を利用
279     initflag = 1;   282     initflag = 1;
280   }   283   }
281      284   
282   GLfloat val[4];   285   GLfloat val[4];
283   286
284   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);   287   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);
285   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);   288   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);
286   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);   289   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);
287   290
288   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);   291   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);
289   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);   292   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);
290   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);   293   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);
291   294
292   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);   295   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);
293   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);   296   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);
294   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);   297   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);
295 }   298 }
296   299
297 // ***********************************************************************    300 // *********************************************************************** 
298 // camera work ***********************************************************   301 // camera work ***********************************************************
299   302
300 // +----------------------------------------------------   303 // +----------------------------------------------------
301 // カメラの投影行列を設定   304 // カメラの投影行列を設定
302 // +----------------------------------------------------   305 // +----------------------------------------------------
303 // 利用する大域変数: window_w, window_h   306 // 利用する大域変数: window_w, window_h
304 // window_w/window_hの変化に対して、物体の見かけの大きさが変わらないように描画   307 // window_w/window_hの変化に対して、物体の見かけの大きさが変わらないように描画
305 // → ortho_unit が重要!   308 // → ortho_unit が重要!
306 //   309 //
307 void ic2_SetUpCamera_Ortho (void) {   310 void ic2_SetUpCamera_Ortho (void) {
308   float wlimit, hlimit;   311   float wlimit, hlimit;
309   wlimit = (window_w/2) / ortho_unit;    312   wlimit = (window_w/2) / ortho_unit; 
310   hlimit = (window_h/2) / ortho_unit;    313   hlimit = (window_h/2) / ortho_unit; 
311   314
312   // glOrtho(左端, 右端, 下端, 上端, 近接側クリッピング面,  遠方側クリッピング面)   315   // glOrtho(左端, 右端, 下端, 上端, 近接側クリッピング面,  遠方側クリッピング面)
313   glMatrixMode(GL_PROJECTION);   316   glMatrixMode(GL_PROJECTION);
314   glLoadIdentity(); // 毎フレーム再設定するのでPROJECTION行列スタックトップの初期化が必要に   317   glLoadIdentity(); // 毎フレーム再設定するのでPROJECTION行列スタックトップの初期化が必要に
315   glOrtho(-wlimit, wlimit, -hlimit, hlimit, -1.0, 1.0);   318   glOrtho(-wlimit, wlimit, -hlimit, hlimit, -1.0, 1.0);
316   glMatrixMode(GL_MODELVIEW);   319   glMatrixMode(GL_MODELVIEW);
317 }   320 }
318   321
319 // ***********************************************************************    322 // *********************************************************************** 
320 // rendering *************************************************************   323 // rendering *************************************************************
321   324
322 // +----------------------------------------------------   325 // +----------------------------------------------------
323 // スクリーンに描画する   326 // スクリーンに描画する
324 // +----------------------------------------------------   327 // +----------------------------------------------------
325 void ic2_DrawFrame (void) {   328 void ic2_DrawFrame (void) {
326   329
327   // (前処理) 以前にglClearColor()で指定した色で塗り潰す   330   // (前処理) 以前にglClearColor()で指定した色で塗り潰す
328   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    331   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
329   // (前処理) 今回CGを描画する範囲   332   // (前処理) 今回CGを描画する範囲
330   glViewport(0, 0, window_w, window_h);   333   glViewport(0, 0, window_w, window_h);
331   334
332   // (1) カメラの設置   335   // (1) カメラの設置
333   ic2_SetUpCamera_Ortho();   336   ic2_SetUpCamera_Ortho();
334   337
335   // (2) 光源の設置   338   // (2) 光源の設置
336   ic2_LightSetA();   339   ic2_LightSetA();
337   340
338   // (3) 物体の設置   341   // (3) 物体の設置
339   // 物体描画:正方形   342   if (tgl_showpredefined == 1) {
340   ic2_FigSquare(0.9);   343     // 物体描画:正方形
341   // 物体描画:ティーポット   344     ic2_FigSquare(0.9);
342   ic2_FigSolidTeapot(0.5);   345     // 物体描画:ティーポット
      346     ic2_FigSolidTeapot(0.5);
      347   }
343   348
344   // (後処理) スクリーンの切り替え   349   // (後処理) スクリーンの切り替え
345   glutSwapBuffers();   350   glutSwapBuffers();
346   351
347 }   352 }
348   353
349 // ***********************************************************************    354 // *********************************************************************** 
350 // callbacks *************************************************************    355 // callbacks ************************************************************* 
351   356
352 // +----------------------------------------------------   357 // +----------------------------------------------------
353 // キーが何か押されたときの対策用関数    358 // キーが何か押されたときの対策用関数 
354 // +----------------------------------------------------   359 // +----------------------------------------------------
355 // glutKeyboardFunc()にて登録予定   360 // glutKeyboardFunc()にて登録予定
356 // 引数 : key ... 入力文字    361 // 引数 : key ... 入力文字 
357 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置    362 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置 
358 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置    363 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置 
359 void ic2_NormalKeyInput (unsigned char key, int x, int y) {   364 void ic2_NormalKeyInput (unsigned char key, int x, int y) {
360   float delta_t = 0.1; // [unit]   365   float delta_t = 0.1; // [unit]
361   float delta_r = 1.0; // [degree]   366   float delta_r = 1.0; // [degree]
362   367
363   switch (key) {   368   switch (key) {
364   case 'q' :   369   case 'q' :
365   case 'Q' :   370   case 'Q' :
366   case 27 : // ESCキーのこと   371   case 27 : // ESCキーのこと
367     exit (0);   372     exit (0);
368     break;   373     break;
369   374
370   // Translation -_+ : [X]h_l [Y]n_u [Z]j_k   375   // Translation -_+ : [X]h_l [Y]n_u [Z]j_k
371   case 'h': glTranslatef(delta_t * -1, 0, 0); break;   376   case 'h': glTranslatef(delta_t * -1, 0, 0); break;
372   case 'l': glTranslatef(delta_t * +1, 0, 0); break;   377   case 'l': glTranslatef(delta_t * +1, 0, 0); break;
373   case 'n': glTranslatef(0, delta_t * -1, 0); break;   378   case 'n': glTranslatef(0, delta_t * -1, 0); break;
374   case 'u': glTranslatef(0, delta_t * +1, 0); break;   379   case 'u': glTranslatef(0, delta_t * +1, 0); break;
375   case 'j': glTranslatef(0, 0, delta_t * -1); break;   380   case 'j': glTranslatef(0, 0, delta_t * -1); break;
376   case 'k': glTranslatef(0, 0, delta_t * +1); break;   381   case 'k': glTranslatef(0, 0, delta_t * +1); break;
377   382
378   // Rotation -_+ : [Y]a_f [Z]s_d [X]x_w   383   // Rotation -_+ : [Y]a_f [Z]s_d [X]x_w
379   case 'x': glRotatef(delta_r * -1, 1, 0, 0); break;   384   case 'x': glRotatef(delta_r * -1, 1, 0, 0); break;
380   case 'w': glRotatef(delta_r * +1, 1, 0, 0); break;   385   case 'w': glRotatef(delta_r * +1, 1, 0, 0); break;
381   case 'a': glRotatef(delta_r * -1, 0, 1, 0); break;   386   case 'a': glRotatef(delta_r * -1, 0, 1, 0); break;
382   case 'f': glRotatef(delta_r * +1, 0, 1, 0); break;   387   case 'f': glRotatef(delta_r * +1, 0, 1, 0); break;
383   case 's': glRotatef(delta_r * -1, 0, 0, 1); break;   388   case 's': glRotatef(delta_r * -1, 0, 0, 1); break;
384   case 'd': glRotatef(delta_r * +1, 0, 0, 1); break;   389   case 'd': glRotatef(delta_r * +1, 0, 0, 1); break;
385   390
386   // [Scale] v_b   391   // [Scale] v_b
387   case 'v': glScalef(0.95, 0.95, 0.95); break;   392   case 'v': glScalef(0.95, 0.95, 0.95); break;
388   case 'b': glScalef(1.05, 1.05, 1.05); break;   393   case 'b': glScalef(1.05, 1.05, 1.05); break;
389   394
390   // [Reset]    395   // [Reset] 
391   case 'R':    396   case 'R': 
392     glMatrixMode(GL_MODELVIEW);   397     glMatrixMode(GL_MODELVIEW);
393     glPopMatrix(); // 保護されてた第1階層に降りる   398     glPopMatrix(); // 保護されてた第1階層に降りる
394     glPushMatrix(); // 保護されてた第1階層からコピーしてスタックトップを1つ上げる   399     glPushMatrix(); // 保護されてた第1階層からコピーしてスタックトップを1つ上げる
395     break;   400     break;
396   401
397   // [Show Stacktop MODELVIEW Matrix]   402   // [Show Stacktop MODELVIEW Matrix]
398   case 'p':   403   case 'p':
399     ic2_ShowMATRIX("Current status");   404     ic2_ShowMATRIX("Current status");
400     break;   405     break;
401   406
      407   // [Toggle Objects] T
      408   case 'T': tgl_showpredefined *= -1; break;
402   }   409   }
403   410
404   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求   411   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求
405   glutPostWindowRedisplay(window_id);   412   glutPostWindowRedisplay(window_id);
406 }   413 }
407   414
408 // +----------------------------------------------------   415 // +----------------------------------------------------
409 // ウィンドウサイズの変更が生じたときの対策用関数   416 // ウィンドウサイズの変更が生じたときの対策用関数
410 // +----------------------------------------------------   417 // +----------------------------------------------------
411 // glutReshapeFunc()にて登録   418 // glutReshapeFunc()にて登録
412 void ic2_ReshapeWindow (int w, int h) {   419 void ic2_ReshapeWindow (int w, int h) {
413   420
414   // 新しいウィンドウサイズを大域変数にセット   421   // 新しいウィンドウサイズを大域変数にセット
415   window_w = w; window_h = h;   422   window_w = w; window_h = h;
416   423
417   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求   424   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求
418   glutPostWindowRedisplay(window_id);   425   glutPostWindowRedisplay(window_id);
419 }   426 }
420   427
421 // +----------------------------------------------------   428 // +----------------------------------------------------
422 // OpenGLとしてのWindowの初期化   429 // OpenGLとしてのWindowの初期化
423 // +----------------------------------------------------   430 // +----------------------------------------------------
424 void ic2_BootWindow (char winname[]) {   431 void ic2_BootWindow (char winname[]) {
425   432
426   // ダブルバッファ,RGB表色モード,デプスバッファ を利用   433   // ダブルバッファ,RGB表色モード,デプスバッファ を利用
427   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);    434   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
428   435
429   // ウィンドウの大きさ   436   // ウィンドウの大きさ
430   glutInitWindowSize(window_w, window_h);   437   glutInitWindowSize(window_w, window_h);
431   438
432   // ウィンドウを開く   439   // ウィンドウを開く
433   window_id = glutCreateWindow(winname);   440   window_id = glutCreateWindow(winname);
434   441
435   // レンダリングにはSmooth Shadingを採用   442   // レンダリングにはSmooth Shadingを採用
436   glShadeModel(GL_SMOOTH);   443   glShadeModel(GL_SMOOTH);
437   444
438   // ウィンドウ全体を書き直すときの色(ここでは黒)   445   // ウィンドウ全体を書き直すときの色(ここでは黒)
439   glClearColor(0.0, 0.0, 0.0, 0.0);   446   glClearColor(0.0, 0.0, 0.0, 0.0);
440   447
441   // 初期MODELVIEW matrixの保護   448   // 初期MODELVIEW matrixの保護
442   glMatrixMode(GL_MODELVIEW);    449   glMatrixMode(GL_MODELVIEW); 
443   glPushMatrix(); // 以後本プログラムでは GL_MODELVIEW スタックの2層目以上で作業   450   glPushMatrix(); // 以後本プログラムでは GL_MODELVIEW スタックの2層目以上で作業
444   451
445   // Callback関数を設定 (イベント処理)   452   // Callback関数を設定 (イベント処理)
446   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)   453   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)
447   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの対策   454   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの対策
448   glutReshapeFunc(ic2_ReshapeWindow); // ウィンドウサイズ変更が検知されたときの対策   455   glutReshapeFunc(ic2_ReshapeWindow); // ウィンドウサイズ変更が検知されたときの対策
449 }   456 }
450   457
451 // ***********************************************************************    458 // *********************************************************************** 
452 // main  *****************************************************************   459 // main  *****************************************************************
453 // +----------------------------------------------------   460 // +----------------------------------------------------
454 // Main Function   461 // Main Function
455 // +----------------------------------------------------   462 // +----------------------------------------------------
456 int main (int argc, char *argv[]) {   463 int main (int argc, char *argv[]) {
457   struct ic2PATCH *firstpatchptr = NULL;   464   struct ic2PATCH *firstpatchptr = NULL;
458   int numberpatches = 0;   465   int numberpatches = 0;
459   466
460   // model ファイルの読み込み   467   // model ファイルの読み込み
461   if (argc <= 1) {   468   if (argc <= 1) {
462     printf("Error: no model file is specified.\n");   469     printf("Error: no model file is specified.\n");
463     return 1;   470     return 1;
464   }   471   }
465   numberpatches = ic2_ReadModel(argv[1], &firstpatchptr);   472   numberpatches = ic2_ReadModel(argv[1], &firstpatchptr);
466   if (numberpatches < 0) {   473   if (numberpatches < 0) {
467     printf("Error: invalid model \"%s\", reading failed.\n", argv[1]);   474     printf("Error: invalid model \"%s\", reading failed.\n", argv[1]);
468     return 1;   475     return 1;
469   }   476   }
470   printf("Number of Patches in the model = %d \n", numberpatches);   477   printf("Number of Patches in the model = %d \n", numberpatches);
471   478
472   // glutライブラリによる引数の解釈   479   // glutライブラリによる引数の解釈
473   glutInit(&argc, argv);   480   glutInit(&argc, argv);
474   481
475   // OpenGL Window の初期化   482   // OpenGL Window の初期化
476   ic2_BootWindow(argv[0]);   483   ic2_BootWindow(argv[0]);
477   484
478   // 無限ループの開始   485   // 無限ループの開始
479   glutMainLoop();   486   glutMainLoop();
480      487   
481   return 0;   488   return 0;
482 }   489 }

Generated by kameda[at]iit.tsukuba.ac.jp