Modified lines:  6, 33
Added line:  34, 35, 440, 441, 442, 443, 444, 445, 453, 454, 455, 456, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532
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-5/110-5-ShowNormal.c     110-6-MoveLight.c
  588 lines
21550 bytes
Last modified : Sun Nov 13 18:00:13 2011

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

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