26#include "FgCommand.hpp"
27#include "FgFileSystem.hpp"
29#include "FgScopeGuard.hpp"
41 char *cx = (
char *)&tmp2,
43 for (
unsigned int ii=0; ii<
sizeof(T); ii++)
44 cx[ii] = ct[
sizeof(T)-ii-1];
60 if (fread((
void *)&rawVal,
sizeof(T),1,inPtr) != 1)
61 fgThrow(
"Unexpected end of file during read");
67 if (fwrite((
void *)&rawVal,
sizeof(T),1,outPtr) != 1)
68 fgThrow(
"Unexpected end of file during write");
79 if (fread((
void *)buff,1,size,inPtr) != size)
80 fgThrow(
"Unexpected end of file during read");
81 if (fwrite((
void *)buff,1,size,outPtr) != size)
82 fgThrow(
"Unexpected end of file during write");
93 copyBuff(inPtr,outPtr,8,cbuff);
95 if (
string(cbuff) !=
"FRTRI003")
96 fgThrow(
"Invalid header for input TRI file");
98 int verts,tris,quads,vertPts,surfPts,texCoords,extension,diffMorphs,statMorphs,statVerts,itmp;
103 convert(inPtr,outPtr,l2b,verts);
104 convert(inPtr,outPtr,l2b,tris);
105 convert(inPtr,outPtr,l2b,quads);
106 convert(inPtr,outPtr,l2b,vertPts);
107 convert(inPtr,outPtr,l2b,surfPts);
108 convert(inPtr,outPtr,l2b,texCoords);
109 convert(inPtr,outPtr,l2b,extension);
110 convert(inPtr,outPtr,l2b,diffMorphs);
111 convert(inPtr,outPtr,l2b,statMorphs);
112 convert(inPtr,outPtr,l2b,statVerts);
114 copyBuff(inPtr,outPtr,16,cbuff);
116 for (
int ii=0; ii<(verts+statVerts); ii++)
117 for (
int jj=0; jj<3; jj++)
118 convert(inPtr,outPtr,l2b,ftmp);
120 for (
int ii=0; ii<tris; ii++)
121 for (
int jj=0; jj<3; jj++)
122 convert(inPtr,outPtr,l2b,itmp);
124 for (
int ii=0; ii<quads; ii++)
125 for (
int jj=0; jj<4; jj++)
126 convert(inPtr,outPtr,l2b,itmp);
128 for (
int ii=0; ii<vertPts; ii++)
130 convert(inPtr,outPtr,l2b,itmp);
131 convert(inPtr,outPtr,l2b,itmp);
132 copyBuff(inPtr,outPtr,itmp,cbuff);
135 for (
int ii=0; ii<surfPts; ii++)
137 convert(inPtr,outPtr,l2b,itmp);
138 convert(inPtr,outPtr,l2b,ftmp);
139 convert(inPtr,outPtr,l2b,ftmp);
140 convert(inPtr,outPtr,l2b,ftmp);
141 convert(inPtr,outPtr,l2b,itmp);
142 copyBuff(inPtr,outPtr,itmp,cbuff);
145 if ((texCoords == 0) && (extension & 0x01))
147 for (
int ii=0; ii<verts; ii++)
148 for (
int jj=0; jj<2; jj++)
149 convert(inPtr,outPtr,l2b,ftmp);
153 for (
int ii=0; ii<texCoords; ii++)
154 for (
int jj=0; jj<2; jj++)
155 convert(inPtr,outPtr,l2b,ftmp);
156 for (
int ii=0; ii<tris; ii++)
157 for (
int jj=0; jj<3; jj++)
158 convert(inPtr,outPtr,l2b,itmp);
159 for (
int ii=0; ii<quads; ii++)
160 for (
int jj=0; jj<4; jj++)
161 convert(inPtr,outPtr,l2b,itmp);
164 for (
int ii=0; ii<diffMorphs; ii++)
166 convert(inPtr,outPtr,l2b,itmp);
167 copyBuff(inPtr,outPtr,itmp,cbuff);
168 convert(inPtr,outPtr,l2b,ftmp);
169 for (
int jj=0; jj<verts; jj++)
170 for (
int kk=0; kk<3; kk++)
171 convert(inPtr,outPtr,l2b,stmp);
175 for (
int ii=0; ii<statMorphs; ii++)
177 convert(inPtr,outPtr,l2b,itmp);
178 copyBuff(inPtr,outPtr,itmp,cbuff);
179 convert(inPtr,outPtr,l2b,numVertsStat);
180 for (uint jj=0; jj<numVertsStat; jj++)
181 convert(inPtr,outPtr,l2b,utmp);
193 copyBuff(inPtr,outPtr,8,cbuff);
195 if (
string(cbuff) !=
"FREGM002")
196 fgThrow(
"Invalid header for input EGM file");
198 int verts,modesSymm,modesAsym,itmp;
202 convert(inPtr,outPtr,l2b,verts);
203 convert(inPtr,outPtr,l2b,modesSymm);
204 convert(inPtr,outPtr,l2b,modesAsym);
205 convert(inPtr,outPtr,l2b,itmp);
207 copyBuff(inPtr,outPtr,40,cbuff);
209 for (
int ii=0; ii<modesSymm; ii++)
211 convert(inPtr,outPtr,l2b,ftmp);
212 for (
int jj=0; jj<verts; jj++)
213 for (
int kk=0; kk<3; kk++)
214 convert(inPtr,outPtr,l2b,stmp);
217 for (
int ii=0; ii<modesAsym; ii++)
219 convert(inPtr,outPtr,l2b,ftmp);
220 for (
int jj=0; jj<verts; jj++)
221 for (
int kk=0; kk<3; kk++)
222 convert(inPtr,outPtr,l2b,stmp);
234 copyBuff(inPtr,outPtr,8,cbuff);
236 if (
string(cbuff) !=
"FREGT003")
237 fgThrow(
"Invalid header for input EGT file");
239 int rows,cols,modesSymm,modesAsym,itmp;
242 convert(inPtr,outPtr,l2b,rows);
243 convert(inPtr,outPtr,l2b,cols);
244 convert(inPtr,outPtr,l2b,modesSymm);
245 convert(inPtr,outPtr,l2b,modesAsym);
246 convert(inPtr,outPtr,l2b,itmp);
248 copyBuff(inPtr,outPtr,36,cbuff);
250 for (
int ii=0; ii<modesSymm; ii++)
252 convert(inPtr,outPtr,l2b,ftmp);
253 for (
int jj=0; jj<3; jj++)
254 for (
int kk=0; kk<rows; kk++)
255 copyBuff(inPtr,outPtr,cols,cbuff);
258 for (
int ii=0; ii<modesAsym; ii++)
260 convert(inPtr,outPtr,l2b,ftmp);
261 for (
int jj=0; jj<3; jj++)
262 for (
int kk=0; kk<rows; kk++)
263 copyBuff(inPtr,outPtr,cols,cbuff);
275 copyBuff(inPtr,outPtr,8,cbuff);
277 if (
string(cbuff) !=
"FIMFF001")
278 fgThrow(
"Invalid header for input FIM file");
283 convert(inPtr,outPtr,l2b,width);
284 convert(inPtr,outPtr,l2b,height);
286 copyBuff(inPtr,outPtr,48,cbuff);
288 for (
int ii=0; ii<height; ii++)
289 for (
int jj=0; jj<width; jj++)
291 convert(inPtr,outPtr,l2b,ftmp);
292 convert(inPtr,outPtr,l2b,ftmp);
304 copyBuff(inPtr,outPtr,8,cbuff);
306 if (
string(cbuff) !=
"FRCTL001")
307 fgThrow(
"Invalid header for input CTL file");
309 uint verGeo,verTex,basisGS,basisGA,basisTS,basisTA,linCtls,utmp;
312 convert(inPtr,outPtr,l2b,verGeo);
313 convert(inPtr,outPtr,l2b,verTex);
314 convert(inPtr,outPtr,l2b,basisGS);
315 convert(inPtr,outPtr,l2b,basisGA);
316 convert(inPtr,outPtr,l2b,basisTS);
317 convert(inPtr,outPtr,l2b,basisTA);
319 convert(inPtr,outPtr,l2b,linCtls);
320 for (uint ii=0; ii<linCtls; ii++)
322 for (uint jj=0; jj<basisGS; jj++)
323 convert(inPtr,outPtr,l2b,ftmp);
324 convert(inPtr,outPtr,l2b,utmp);
325 copyBuff(inPtr,outPtr,utmp,cbuff);
328 convert(inPtr,outPtr,l2b,linCtls);
329 for (uint ii=0; ii<linCtls; ii++)
331 for (uint jj=0; jj<basisGA; jj++)
332 convert(inPtr,outPtr,l2b,ftmp);
333 convert(inPtr,outPtr,l2b,utmp);
334 copyBuff(inPtr,outPtr,utmp,cbuff);
337 convert(inPtr,outPtr,l2b,linCtls);
338 for (uint ii=0; ii<linCtls; ii++)
340 for (uint jj=0; jj<basisTS; jj++)
341 convert(inPtr,outPtr,l2b,ftmp);
342 convert(inPtr,outPtr,l2b,utmp);
343 copyBuff(inPtr,outPtr,utmp,cbuff);
346 convert(inPtr,outPtr,l2b,linCtls);
347 for (uint ii=0; ii<linCtls; ii++)
349 for (uint jj=0; jj<basisTA; jj++)
350 convert(inPtr,outPtr,l2b,ftmp);
351 convert(inPtr,outPtr,l2b,utmp);
352 copyBuff(inPtr,outPtr,utmp,cbuff);
355 for (uint ii=0; ii<5; ii++)
357 for (uint jj=0; jj<2; jj++)
359 for (uint kk=0; kk<basisGS; kk++)
360 convert(inPtr,outPtr,l2b,ftmp);
361 convert(inPtr,outPtr,l2b,ftmp);
362 for (uint kk=0; kk<basisTS; kk++)
363 convert(inPtr,outPtr,l2b,ftmp);
364 convert(inPtr,outPtr,l2b,ftmp);
368 for (uint ii=0; ii<20; ii++)
370 for (uint jj=0; jj<basisGS; jj++)
371 convert(inPtr,outPtr,l2b,ftmp);
372 for (uint jj=0; jj<basisTS; jj++)
373 convert(inPtr,outPtr,l2b,ftmp);
374 convert(inPtr,outPtr,l2b,ftmp);
377 uint basis = basisGS + basisTS;
378 for (uint ii=0; ii<5; ii++)
380 for (uint jj=0; jj<basis; jj++)
381 convert(inPtr,outPtr,l2b,ftmp);
382 for (uint jj=0; jj<basis; jj++)
383 for (uint kk=0; kk<basis; kk++)
384 convert(inPtr,outPtr,l2b,ftmp);
386 for (uint jj=0; jj<basisGS; jj++)
387 for (uint kk=0; kk<basisGS; kk++)
388 convert(inPtr,outPtr,l2b,ftmp);
390 for (uint jj=0; jj<basisTS; jj++)
391 for (uint kk=0; kk<basisTS; kk++)
392 convert(inPtr,outPtr,l2b,ftmp);
404 copyBuff(inPtr,outPtr,8,cbuff);
406 if (
string(cbuff) !=
"FRFG0001")
407 fgThrow(
"Invalid header for input FG file");
409 uint verGeo,verTex,basisGS,basisGA,basisTS,basisTA,detail,utmp;
412 convert(inPtr,outPtr,l2b,verGeo);
413 convert(inPtr,outPtr,l2b,verTex);
414 convert(inPtr,outPtr,l2b,basisGS);
415 convert(inPtr,outPtr,l2b,basisGA);
416 convert(inPtr,outPtr,l2b,basisTS);
417 convert(inPtr,outPtr,l2b,basisTA);
418 convert(inPtr,outPtr,l2b,utmp);
419 convert(inPtr,outPtr,l2b,detail);
421 for (uint ii=0; ii<basisGS; ii++)
422 convert(inPtr,outPtr,l2b,stmp);
423 for (uint ii=0; ii<basisGA; ii++)
424 convert(inPtr,outPtr,l2b,stmp);
425 for (uint ii=0; ii<basisTS; ii++)
426 convert(inPtr,outPtr,l2b,stmp);
427 for (uint ii=0; ii<basisTA; ii++)
428 convert(inPtr,outPtr,l2b,stmp);
431 int peek = fgetc(inPtr);
432 if (feof(inPtr) == 0)
435 convert(inPtr,outPtr,l2b,utmp);
437 vector<char> vbuff(utmp);
438 copyBuff(inPtr,outPtr,utmp,&vbuff[0]);
451 "<input>.<ext> <output>.<ext> (l2b | b2l)\n"
452 " <ext> = (tri | egm | egt | fim | ctl | fg)\n"
453 " Assumes IEC 559 / IEEE 754 floating point values.");
455 if (args.size() != 4)
456 syntax.errorNumArgs();
458 string input(args[1]),
461 type = pathToExt(input);
462 if (!checkExt(output,type))
463 syntax.error(
"The output file must have the same extension as the input file");
465 if (direction ==
"l2b")
467 else if (direction ==
"b2l")
470 syntax.error(
"Invalid conversion direction");
472 FILE *inPtr = openFile(input,
false);
473 ScopeGuard inSG {[inPtr](){fclose(inPtr); }};
474 FILE *outPtr = openFile(output,
true);
475 ScopeGuard outSG {[outPtr](){fclose(outPtr); }};
477 convertTri(inPtr,outPtr,l2b);
478 else if (type ==
"egm")
479 convertEgm(inPtr,outPtr,l2b);
480 else if (type ==
"egt")
481 convertEgt(inPtr,outPtr,l2b);
482 else if (type ==
"fim")
483 convertFim(inPtr,outPtr,l2b);
484 else if (type ==
"ctl")
485 convertCtl(inPtr,outPtr,l2b);
486 else if (type ==
"fg")
487 convertFg(inPtr,outPtr,l2b);
489 syntax.error(
string(
"Unknown file type extension: ") + type);
495 return Cmd{
cmd3EndianToggle,
"endian",
"Change endianness of FaceGen 3 file formats"};
void cmd3EndianToggle(CLArgs const &args)