00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <sofa/helper/io/TriangleLoader.h>
00028 #include <sofa/helper/system/FileRepository.h>
00029
00030 #include <assert.h>
00031 #include <stdlib.h>
00032 #include <iostream>
00033 #include <vector>
00034 #include <sofa/defaulttype/Vec.h>
00035 #include <string.h>
00036
00037 namespace sofa
00038 {
00039
00040 namespace helper
00041 {
00042
00043 namespace io
00044 {
00045
00046 using namespace sofa::defaulttype;
00047
00048
00049
00050
00051
00052
00053
00054 bool TriangleLoader::load(const char *filename)
00055 {
00056 std::string fname = filename;
00057 if (!sofa::helper::system::DataRepository.findFile(fname)) return false;
00058 FILE* file;
00059
00060
00061 file = fopen(fname.c_str(), "r");
00062 if (!file)
00063 {
00064 fprintf(stderr, "readOBJ() failed: can't open data file \"%s\".\n",
00065 filename);
00066 return false;
00067 }
00068
00069
00070 printf("Loading Triangle model: %s\n", filename);
00071
00072 loadTriangles (file);
00073 fclose(file);
00074
00075 return true;
00076 }
00077
00078 void TriangleLoader::loadTriangles(FILE *file)
00079 {
00080 assert (file != NULL);
00081
00082 char buf[128];
00083 std::vector<Vector3> normals;
00084 Vector3 n;
00085 float x, y, z;
00086
00087
00088 while (fscanf(file, "%s", buf) != EOF)
00089 {
00090 switch (buf[0])
00091 {
00092 case '#':
00093
00094
00095 fgets(buf, sizeof(buf), file);
00096 break;
00097 case 'v':
00098
00099 switch (buf[1])
00100 {
00101 case '\0':
00102
00103
00104 fscanf(file, "%f %f %f", &x, &y, &z);
00105 addVertices(x, y, z);
00106
00107
00108
00109 break;
00110 case 'n':
00111
00112
00113 fgets(buf, sizeof(buf), file);
00114
00115
00116 break;
00117 case 't':
00118
00119
00120 fgets(buf, sizeof(buf), file);
00121 break;
00122 default:
00123 printf("loadTriangles(): Unknown token \"%s\".\n", buf);
00124 exit(1);
00125 break;
00126 }
00127 break;
00128 case 'm':
00129
00130 fgets(buf, sizeof(buf), file);
00131 break;
00132 case 'u':
00133
00134 fgets(buf, sizeof(buf), file);
00135 break;
00136 case 'g':
00137
00138 fgets(buf, sizeof(buf), file);
00139 break;
00140 case 'f':
00141
00142 fscanf(file, "%s", buf);
00143 int n1, n2, n3, v1, v2, v3, t1, t2, t3;
00144
00145 if (strstr(buf, "//"))
00146 {
00147
00148 sscanf(buf, "%d//%d", &v1, &n1);
00149 fscanf(file, "%d//%d", &v2, &n2);
00150 fscanf(file, "%d//%d", &v3, &n3);
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 addTriangle(v1 - 1, v2 - 1, v3 -1);
00161 }
00162 else if (sscanf(buf, "%d/%d/%d", &v1, &t1, &n1) == 3)
00163 {
00164
00165
00166 fscanf(file, "%d/%d/%d", &v2, &t2, &n2);
00167 fscanf(file, "%d/%d/%d", &v3, &t3, &n3);
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 addTriangle(v1 - 1, v2 - 1, v3 -1);
00178 }
00179 else if (sscanf(buf, "%d/%d", &v1, &t1) == 2)
00180 {
00181
00182 fscanf(file, "%d/%d", &v2, &t2);
00183 fscanf(file, "%d/%d", &v3, &t3);
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 addTriangle(v1 - 1, v2 - 1, v3 -1);
00194 }
00195 else
00196 {
00197
00198 sscanf(buf, "%d", &v1);
00199 fscanf(file, "%d", &v2);
00200 fscanf(file, "%d", &v3);
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 addTriangle(v1 - 1, v2 - 1, v3 -1);
00212 }
00213 break;
00214
00215 default:
00216
00217 fgets(buf, sizeof(buf), file);
00218 break;
00219 }
00220 }
00221
00222 if (normals.empty())
00223 {
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239 }
00240 }
00241
00242 }
00243
00244 }
00245
00246 }
00247