Modified lines:  7, 9
Added line:  None
Removed line:  None
Generated by UTF-8 version of diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  ../10-02/10-02-ReadModel.c     11-02-ReadModel.c
  137 lines
4755 bytes
Last modified : Mon Nov 19 19:12:10 2012

    137 lines
4759 bytes
Last modified : Mon Nov 19 12:28:59 2012

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 // 計算機序論2・実習 (筑波大学工学システム学類)   4 // 計算機序論2・実習 (筑波大学工学システム学類)
5   5
6 // 2012/11/19a kameda[at]iit.tsukuba.ac.jp   6 // 2012/11/19a kameda[at]iit.tsukuba.ac.jp
7 // 10.02. モデルの読込   7 // 11.02. プログラム統合
8   8
9 #include "ic2-ModelHeaders.h"   9 #include "ic2-CommonHeaders.h"
10   10
11 // ***********************************************************************    11 // *********************************************************************** 
12 // ReadModel *************************************************************   12 // ReadModel *************************************************************
13   13
14 // +++--------------------------------------------------   14 // +++--------------------------------------------------
15 // 3DCGモデルを記述したファイルを読み込む   15 // 3DCGモデルを記述したファイルを読み込む
16 // +++--------------------------------------------------   16 // +++--------------------------------------------------
17   17
18 // -----------------------------------------------------   18 // -----------------------------------------------------
19 // 三角形パッチ構造体(ic2PATCH)リストの表示   19 // 三角形パッチ構造体(ic2PATCH)リストの表示
20 // -----------------------------------------------------   20 // -----------------------------------------------------
21 int ic2_PrintPATCHList (struct ic2PATCH *firstpatchptr) {   21 int ic2_PrintPATCHList (struct ic2PATCH *firstpatchptr) {
22   struct ic2PATCH *p = NULL;   22   struct ic2PATCH *p = NULL;
23   int np = 0;   23   int np = 0;
24   24
25   for (p = firstpatchptr; p != NULL; p = p->next) {   25   for (p = firstpatchptr; p != NULL; p = p->next) {
26     printf("PATCH %2d: "   26     printf("PATCH %2d: "
27            "(%5.2f, %5.2f, %5.2f), (%5.2f, %5.2f, %5.2f), (%5.2f, %5.2f, %5.2f), "   27            "(%5.2f, %5.2f, %5.2f), (%5.2f, %5.2f, %5.2f), (%5.2f, %5.2f, %5.2f), "
28            "rgb=[%4.2f, %4.2f, %4.2f] \n",   28            "rgb=[%4.2f, %4.2f, %4.2f] \n",
29            np,   29            np,
30            p->s.x, p->s.y, p->s.z,   30            p->s.x, p->s.y, p->s.z,
31            p->t.x, p->t.y, p->t.z,   31            p->t.x, p->t.y, p->t.z,
32            p->u.x, p->u.y, p->u.z,   32            p->u.x, p->u.y, p->u.z,
33            p->c.r, p->c.g, p->c.b);   33            p->c.r, p->c.g, p->c.b);
34     np++;   34     np++;
35   }   35   }
36   36
37   return np;   37   return np;
38 }   38 }
39   39
40   40
41 // +----------------------------------------------------   41 // +----------------------------------------------------
42 // 三角形パッチ1つ分のメモリ確保と読込   42 // 三角形パッチ1つ分のメモリ確保と読込
43 // +----------------------------------------------------   43 // +----------------------------------------------------
44 static int ic2_InsertPATCH (struct ic2PATCH **firstpatchptr, char *onelinedata) {   44 static int ic2_InsertPATCH (struct ic2PATCH **firstpatchptr, char *onelinedata) {
45   // (1) 文字列へのポインタは存在するか   45   // (1) 文字列へのポインタは存在するか
46   // (2) メモリ確保/下請け   46   // (2) メモリ確保/下請け
47   // (3) 値の読み込み   47   // (3) 値の読み込み
48   // (4) ic2PATCHリスト構造への組み込み   48   // (4) ic2PATCHリスト構造への組み込み
49   struct ic2PATCH *newpatch = NULL; // 三角形パッチ構造体ヘのポインタ   49   struct ic2PATCH *newpatch = NULL; // 三角形パッチ構造体ヘのポインタ
50   int number_of_element = 0;        // 読み込めた項目数   50   int number_of_element = 0;        // 読み込めた項目数
51   51
52   // (1) 文字列へのポインタは存在するか   52   // (1) 文字列へのポインタは存在するか
53   if (onelinedata == NULL) return -1;   53   if (onelinedata == NULL) return -1;
54   54
55   // (2) メモリ確保   55   // (2) メモリ確保
56   newpatch = (struct ic2PATCH *)calloc(1, sizeof(struct ic2PATCH));   56   newpatch = (struct ic2PATCH *)calloc(1, sizeof(struct ic2PATCH));
57   if (newpatch == NULL) {   57   if (newpatch == NULL) {
58     printf("ic2_InsertPATCH: Memory allocation failed.\n");   58     printf("ic2_InsertPATCH: Memory allocation failed.\n");
59     return -2;   59     return -2;
60   }   60   }
61   61
62   // (3) 値の読み込み   62   // (3) 値の読み込み
63   number_of_element =    63   number_of_element = 
64     sscanf(onelinedata, "%f %f %f  %f %f %f  %f %f %f  %f %f %f",    64     sscanf(onelinedata, "%f %f %f  %f %f %f  %f %f %f  %f %f %f", 
65            &newpatch->s.x, &newpatch->s.y, &newpatch->s.z,   65            &newpatch->s.x, &newpatch->s.y, &newpatch->s.z,
66            &newpatch->t.x, &newpatch->t.y, &newpatch->t.z,   66            &newpatch->t.x, &newpatch->t.y, &newpatch->t.z,
67            &newpatch->u.x, &newpatch->u.y, &newpatch->u.z,   67            &newpatch->u.x, &newpatch->u.y, &newpatch->u.z,
68            &newpatch->c.r, &newpatch->c.g, &newpatch->c.b);   68            &newpatch->c.r, &newpatch->c.g, &newpatch->c.b);
69   if (number_of_element != 12) {   69   if (number_of_element != 12) {
70     printf("ic2_InsertPATCH: format error (%d elements found)\n", number_of_element);   70     printf("ic2_InsertPATCH: format error (%d elements found)\n", number_of_element);
71     printf("ic2_InsertPATCH: \"%s\"\n", onelinedata);   71     printf("ic2_InsertPATCH: \"%s\"\n", onelinedata);
72     free(newpatch);   72     free(newpatch);
73     return -3;   73     return -3;
74   }   74   }
75   75
76   // (4) パッチに関する追加属性の事前計算   76   // (4) パッチに関する追加属性の事前計算
77   77
78   // (5) ic2PATCHリスト構造への組み込み   78   // (5) ic2PATCHリスト構造への組み込み
79   // *newpatch を 三角形パッチ集合の先頭に挿入   79   // *newpatch を 三角形パッチ集合の先頭に挿入
80   newpatch->next = *firstpatchptr;   80   newpatch->next = *firstpatchptr;
81   *firstpatchptr = newpatch;   81   *firstpatchptr = newpatch;
82   return 0;   82   return 0;
83 }   83 }
84   84
85 // +----------------------------------------------------   85 // +----------------------------------------------------
86 // 3DCGモデルファイルのオープン・読込・クローズ   86 // 3DCGモデルファイルのオープン・読込・クローズ
87 // +----------------------------------------------------   87 // +----------------------------------------------------
88 int ic2_ReadModel(char *filename, struct ic2PATCH **firstpatchptr) {   88 int ic2_ReadModel(char *filename, struct ic2PATCH **firstpatchptr) {
89   FILE *filetoopen = NULL; // FILE構造体へのポインタ   89   FILE *filetoopen = NULL; // FILE構造体へのポインタ
90   int  patchnumber = 0; // パッチ数   90   int  patchnumber = 0; // パッチ数
91   char oneline[256]; // 1行分のバッファ,固定長にしておくとsizeof()が利用可能   91   char oneline[256]; // 1行分のバッファ,固定長にしておくとsizeof()が利用可能
92   char firstword[256]; // コメント行かどうかの判定用   92   char firstword[256]; // コメント行かどうかの判定用
93   int  linenumber = 0; // ファイル中の行番号   93   int  linenumber = 0; // ファイル中の行番号
94   94
95   // Foolproof   95   // Foolproof
96   if (filename == NULL) {    96   if (filename == NULL) { 
97     printf("Error: You need to specify file name to open.\n");   97     printf("Error: You need to specify file name to open.\n");
98     return -1;   98     return -1;
99   }   99   }
100   100
101   // ファイルのオープン   101   // ファイルのオープン
102   filetoopen = fopen(filename, "r");   102   filetoopen = fopen(filename, "r");
103   if (filetoopen == NULL) {   103   if (filetoopen == NULL) {
104     printf("Error: Failed to open/read \"%s\".\n", filename);   104     printf("Error: Failed to open/read \"%s\".\n", filename);
105     return -2;   105     return -2;
106   }   106   }
107   // ファイル名を表示   107   // ファイル名を表示
108   printf("Reading model from \"%s\"\n", filename);   108   printf("Reading model from \"%s\"\n", filename);
109   109
110   // 1行ずつ読込して登録   110   // 1行ずつ読込して登録
111   while (fgets(oneline, sizeof(oneline), filetoopen) != NULL) {   111   while (fgets(oneline, sizeof(oneline), filetoopen) != NULL) {
112     linenumber++;   112     linenumber++;
113   113
114     // もし行内に1文字もなければ(1単語もなければ)次行へ   114     // もし行内に1文字もなければ(1単語もなければ)次行へ
115     if (sscanf(oneline, "%256s", firstword) < 1)   115     if (sscanf(oneline, "%256s", firstword) < 1)
116       continue;   116       continue;
117     // もし先頭が#で始まっていれば次行へ   117     // もし先頭が#で始まっていれば次行へ
118     if (firstword[0] == '#')    118     if (firstword[0] == '#') 
119       continue;   119       continue;
120     if (ic2_InsertPATCH(firstpatchptr, oneline)) {   120     if (ic2_InsertPATCH(firstpatchptr, oneline)) {
121       printf("Model reading is interrupted.\n");   121       printf("Model reading is interrupted.\n");
122       break;   122       break;
123     }   123     }
124     patchnumber++;   124     patchnumber++;
125   }   125   }
126   126
127   // ファイルのクローズ   127   // ファイルのクローズ
128   if (fclose(filetoopen) != 0) {   128   if (fclose(filetoopen) != 0) {
129     printf("Error: Failed to close \"%s\".\n", filename);   129     printf("Error: Failed to close \"%s\".\n", filename);
130     // error, but we get data anyway...   130     // error, but we get data anyway...
131   }   131   }
132   132
133   printf("Finish reading the model (%d patches).\n", patchnumber);   133   printf("Finish reading the model (%d patches).\n", patchnumber);
134   ic2_PrintPATCHList (*firstpatchptr);   134   ic2_PrintPATCHList (*firstpatchptr);
135     135  
136   return patchnumber;   136   return patchnumber;
137 }   137 }

Generated by diff2html.pl on Thu Feb 6 07:50:08 2014
Command-line:
/home/ubuntu/www-mirror/2013-tsukuba-ic2/code/diff2html_utf8.pl ../10-02/10-02-ReadModel.c 11-02-ReadModel.c