Modified lines:  5, 6, 216, 217
Added line:  10, 33, 69, 70, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 157, 158, 159, 242, 243, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 506, 507
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-4/110-4-NormalVector.c     110-5-ShowNormal.c
  548 lines
20154 bytes
Last modified : Sun Nov 13 18:00:54 2011

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

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