1 #define _CRT_SECURE_NO_WARNINGS
33 #define LOG(format,...) fprintf (stderr,"LOG %s:%s:%s - " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
34 #define WARN(format,...) fprintf (stderr,"Warning %s:%s:%s - " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
35 #define ERR(format,...) fprintf (stderr,"Error %s:%s:%s - " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
37 #define LOG(format, ...)
38 #define WARN(format, ...)
39 #define ERR(format,...) fprintf (stderr,"Error %s:%s:%s - " format, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
60 if ((un.c[0] == 1) && (un.c[1] == 2))
68 if (b0 > 0) m = m >> b0;
70 for(
int i=0;i<=n;i++) {
71 str[n-i] = (m & 0x00000001 ?
'1':
'0');
78 return GetMask(m,0,31);
82 if (((
EDGE *) x)->a > ((
EDGE *) y)->a)
return 1;
83 else if (((
EDGE *) x)->a < ((
EDGE *) y)->a)
return -1;
86 if (((
EDGE *) x)->b > ((
EDGE *) y)->b)
return 1;
87 else if (((
EDGE *) x)->b < ((
EDGE *) y)->b)
return -1;
95 for(
int i=0;i<npoints;i++) {
96 if (fabs(points[i].x) > dM) dM=fabs(points[i].x);
97 if (fabs(points[i].y) > dM) dM=fabs(points[i].y);
98 if (fabs(points[i].z) > dM) dM=fabs(points[i].z);
109 float d, dm,bx,by,bz;
112 d = sqrt(P[0]*P[0] + P[1]*P[1] + P[2]*P[2]);
119 for(j=0;j<npoints;j++) {
131 for(j=0;j<npoints;j++) {
132 d = (bx - points[j].x) * (bx - points[j].x)
133 + (by - points[j].y) * (by - points[j].y)
134 + (bz - points[j].z) * (bz - points[j].z);
142 d = (points[j0].x - bx) * points[j0].nx
143 + (points[j0].y - by) * points[j0].ny
144 + (points[j0].z - bz) * points[j0].nz;
147 if (d>0)
return true;
155 unsigned char *cor =
new unsigned char[npoints];
156 memset(cor,0,npoints*
sizeof(
unsigned char));
159 for(
int i=0;i<nfaces;i++) {
160 for (
int j=0; j<faces[i].npts; j++) {
161 if (faces[i].ind[j] >= (
unsigned int)npoints) {
164 }
else cor[ faces[i].ind[j] ]++;
171 for (
int i = 0; i < npoints; i++)
172 if (cor[i] == 0) p++;
180 for (
int i=0;i<npoints;i++) nedges += cor[i];
186 for (
int i = 0; i < nfaces; i++) {
187 for (j = 0; j < faces[i].npts - 1; j++) {
188 edge[p].
a = faces[i].ind[j];
189 edge[p].
b = faces[i].ind[j + 1];
193 edge[p].
a = faces[i].ind[j];
194 edge[p].
b = faces[i].ind[0];
203 for (
int i = 0; i < nedges; i++) {
204 if (edge[i].a > edge[i].b) {
206 edge[i].
a = edge[i].
b;
221 while (i + 1 < nedges) {
222 if ((edge[i].a != edge[i + 1].a) || (edge[i].b != edge[i + 1].b)) {
226 if (edge[i].s == edge[i + 1].s)
231 if (i + 1 == nedges) p++;
243 {+1,-1,-1},{+1,-1,+1},{+1,+1,+1},{+1,+1,-1},
244 {-1,-1,-1},{-1,-1,+1},{-1,+1,+1},{-1,+1,-1},
245 {0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}
247 int ngood = 0, nbad = 0;
249 float dM = 1.5f * MaxBound();
251 for(
int i=0;i<
NTEST;i++) {
253 if (PerformNormalCheck(10*dM,PTEST[i])) ngood++;
272 printf(
"TRACE : 10 first vertex\n");
273 for (
int i=0; i<
min(10,npoints); i++) {
275 if (HavePos) printf(
"\tcoord:<%f,%f,%f>\n", points[i].x, points[i].y, points[i].z);
276 if (HaveNrm) printf(
"\tnorm :<%f,%f,%f>\n", points[i].nx, points[i].ny, points[i].nz);
277 if (HaveCol) printf(
"\tcolor:<%f %f %f>\n", points[i].r, points[i].g, points[i].b);
278 if (HaveUV) printf (
"\tcolor:<%f %f>\n", points[i].u, points[i].v);
279 if (HaveTol) printf (
"\tconf :%e\n", points[i].c);
282 printf(
"TRACE : 10 first polygons\n");
283 for (
int i=0; i<
min(10,nfaces); i++) {
284 printf (
"%5d : ", i);
285 for (
int j=0; j<faces[i].npts; j++)
286 printf (
"%u ", faces[i].ind[j]);
294 printf(
"TRACE : all vertex\n");
295 for (i = 0; i < npoints; i++) {
297 printf (
"\tcoord:<%f,%f,%f>\n", points[i].x, points[i].y, points[i].z);
300 printf(
"TRACE : all polygons\n");
301 for (i = 0; i < nfaces; i++) {
302 printf (
"%5d : ", i);
303 for (j = 0; j < faces[i].npts; j++)
304 printf (
"%u ", faces[i].ind[j]);
314 bool ReadTextFloat(FILE *ptf,
float &sto) {
float v;
int lu=fscanf(ptf,
"%f",&v); sto = v;
return lu==1; };
315 bool ReadTextInt1(FILE *ptf,
float &sto) {
int v;
int lu=fscanf(ptf,
"%d",&v); sto = float(v)*
iMaxInt1;
return lu==1; };
316 bool ReadTextInt2(FILE *ptf,
float &sto) {
int v;
int lu=fscanf(ptf,
"%d",&v); sto = float(v)*
iMaxInt2;
return lu==1; };
317 bool ReadTextInt4(FILE *ptf,
float &sto) {
int v;
int lu=fscanf(ptf,
"%d",&v); sto = float(v)*
iMaxInt4;
return lu==1; };
318 bool ReadTextUInt1(FILE *ptf,
float &sto) {
unsigned int v;
int lu=fscanf(ptf,
"%u",&v); sto = float(v)*
iMaxUInt1;
return lu==1; };
319 bool ReadTextUInt2(FILE *ptf,
float &sto) {
unsigned int v;
int lu=fscanf(ptf,
"%u",&v); sto = float(v)*
iMaxUInt2;
return lu==1; };
320 bool ReadTextUInt4(FILE *ptf,
float &sto) {
unsigned int v;
int lu=fscanf(ptf,
"%u",&v); sto = float(v)*
iMaxUInt4;
return lu==1; };
324 int lu=fread(&v,
sizeof(
float ),1,ptf);
328 bool ReadBinFloat8(FILE *ptf,
float &sto) {
double v;
int lu=fread(&v,
sizeof(
double),1,ptf); sto = float(v);
return lu==1; };
329 bool ReadBinUInt1(FILE *ptf,
float &sto) {
unsigned char v;
int lu=fread(&v,
sizeof(
unsigned char ),1,ptf); sto = float(v)*
iMaxUInt1;
return lu==1; };
330 bool ReadBinUInt2(FILE *ptf,
float &sto) {
unsigned short v;
int lu=fread(&v,
sizeof(
unsigned short),1,ptf); sto = float(v)*
iMaxUInt2;
return lu==1; };
331 bool ReadBinUInt4(FILE *ptf,
float &sto) {
unsigned int v;
int lu=fread(&v,
sizeof(
unsigned int ),1,ptf); sto = float(v)*
iMaxUInt4;
return lu==1; };
332 bool ReadBinInt1(FILE *ptf,
float &sto) {
char v;
int lu=fread(&v,
sizeof(
char ),1,ptf); sto = float(v)*
iMaxInt1;
return lu==1; };
333 bool ReadBinInt2(FILE *ptf,
float &sto) {
short v;
int lu=fread(&v,
sizeof(
short),1,ptf); sto = float(v)*
iMaxInt2;
return lu==1; };
334 bool ReadBinInt4(FILE *ptf,
float &sto) {
int v;
int lu=fread(&v,
sizeof(
int ),1,ptf); sto = float(v)*
iMaxInt4;
return lu==1; };
338 int lu=fread(&v,
sizeof(
float ),1,ptf);
339 unsigned int *w = (
unsigned int *)&v;
345 bool ReadSwapBinFloat8(FILE *ptf,
float &sto) {
double v;
int lu=fread(&v,
sizeof(
double),1,ptf); Swap<double>(v); sto = float(v);
return lu==1; };
346 bool ReadSwapBinUInt2(FILE *ptf,
float &sto) {
unsigned short v;
int lu=fread(&v,
sizeof(
unsigned short),1,ptf); Swap<unsigned short>(v); sto = float(v)*
iMaxUInt2;
return lu==1; };
347 bool ReadSwapBinUInt4(FILE *ptf,
float &sto) {
unsigned int v;
int lu=fread(&v,
sizeof(
unsigned int ),1,ptf); Swap<unsigned int>(v); sto = float(v)*
iMaxUInt4;
return lu==1; };
348 bool ReadSwapBinInt2(FILE *ptf,
float &sto) {
short v;
int lu=fread(&v,
sizeof(
short),1,ptf); Swap<short>(v); sto = float(v)*
iMaxInt2;
return lu==1; };
349 bool ReadSwapBinInt4(FILE *ptf,
float &sto) {
int v;
int lu=fread(&v,
sizeof(
int ),1,ptf); Swap<int>(v); sto = float(v)*
iMaxInt4;
return lu==1; };
352 const int nbTypes = 12;
353 char TypeStr[nbTypes][8] = {
"char",
"uchar",
"uint8",
"uint16",
"uint32",
"int8",
"int16",
"int32",
"int",
"float",
"float32",
"float64" };
355 {
ReadTextInt1,
ReadTextUInt1,
ReadTextUInt1,
ReadTextUInt2,
ReadTextUInt4,
ReadTextInt1,
ReadTextInt2,
ReadTextInt4,
ReadTextInt4,
ReadTextFloat,
ReadTextFloat, ReadTextFloat },
356 {
ReadBinInt1,
ReadBinUInt1,
ReadBinUInt1,
ReadBinUInt2,
ReadBinUInt4,
ReadBinInt1,
ReadBinInt2,
ReadBinInt4,
ReadBinInt4,
ReadBinFloat4,
ReadBinFloat4,
ReadBinFloat8 },
357 {
ReadBinInt1,
ReadBinUInt1,
ReadBinUInt1,
ReadSwapBinUInt2,
ReadSwapBinUInt4,
ReadBinInt1,
ReadSwapBinInt2,
ReadSwapBinInt4,
ReadSwapBinInt4,
ReadSwapBinFloat4,
ReadSwapBinFloat4,
ReadSwapBinFloat8 }
361 for(FunId=0;FunId<nbTypes;FunId++)
362 if (! strcmp(TypeStr[FunId],type))
break;
363 if (FunId==nbTypes)
return false;
366 field[id].readfun = Fun[FunType][FunId];
377 char line[512], lineaux[512];
379 fscanf (ptf,
"%s", line);
380 if (strcmp (line,
"ply"))
return false;
381 fscanf (ptf,
"%s", line);
382 if (strcmp (line,
"format"))
return false;
384 fscanf (ptf,
"%s", line);
385 if (strcmp (line,
"binary_big_endian") == 0) mode = (machFMT ==
BigEndian ? 1 : 2);
386 else if (strcmp (line,
"binary_little_endian") == 0) mode = (machFMT ==
LittleEndian ? 1 : 2);
387 else if (strcmp (line,
"ascii") == 0) mode = 0;
390 doswap = (mode == 2 ?
true :
false);
392 do fscanf (ptf,
"%s", line);
while (strcmp(line,
"vertex"));
393 fscanf(ptf,
"%d", &npoints);
396 do fscanf (ptf,
"%s", line);
while (strcmp (line,
"property"));
400 fscanf (ptf,
"%s", lineaux);
401 fscanf (ptf,
"%s", line);
402 if (!strcmp(line,
"x")) BuildReader(nfields,mode,&(P.
x)-&(P.
x),HavePos, lineaux);
403 else if (!strcmp(line,
"y")) BuildReader(nfields,mode,&(P.
y)-&(P.
x),HavePos, lineaux);
404 else if (!strcmp(line,
"z")) BuildReader(nfields,mode,&(P.
z)-&(P.
x),HavePos, lineaux);
405 else if (!strcmp(line,
"nx")) BuildReader(nfields,mode,&(P.
nx)-&(P.
x),HaveNrm, lineaux);
406 else if (!strcmp(line,
"ny")) BuildReader(nfields,mode,&(P.
ny)-&(P.
x),HaveNrm, lineaux);
407 else if (!strcmp(line,
"nz")) BuildReader(nfields,mode,&(P.
nz)-&(P.
x),HaveNrm, lineaux);
408 else if (!strcmp(line,
"r") || !strcmp (line,
"red" )) BuildReader(nfields,mode,&(P.
r)-&(P.
x),HaveCol, lineaux);
409 else if (!strcmp(line,
"g") || !strcmp (line,
"green")) BuildReader(nfields,mode,&(P.
g)-&(P.
x),HaveCol, lineaux);
410 else if (!strcmp(line,
"b") || !strcmp (line,
"blue" )) BuildReader(nfields,mode,&(P.
b)-&(P.
x),HaveCol, lineaux);
411 else if (!strcmp(line,
"u")) BuildReader(nfields,mode,&(P.
u)-&(P.
x), HaveUV, lineaux);
412 else if (!strcmp(line,
"s")) BuildReader(nfields,mode,&(P.
u)-&(P.
x), HaveUV, lineaux);
413 else if (!strcmp(line,
"v")) BuildReader(nfields,mode,&(P.
v)-&(P.
y), HaveUV, lineaux);
414 else if (!strcmp(line,
"t")) BuildReader(nfields,mode,&(P.
v)-&(P.
y), HaveUV, lineaux);
415 else if (!strcmp(line,
"confidence")) BuildReader(nfields,mode,&(P.
c)-&(P.
x), HaveTol, lineaux);
418 fscanf (ptf,
"%s", line);
419 }
while (! strcmp (line,
"property"));
421 while (strcmp (line,
"element")) fscanf (ptf,
"%s", line);
422 fscanf (ptf,
"%s", line);
424 fscanf (ptf,
"%d", &nfaces);
426 do fscanf (ptf,
"%s", line);
427 while (strcmp (line,
"end_header"));
438 for(
int i=0;i<npoints;i++)
439 for(
int j=0;j<nfields;j++)
440 if (! (*field[j].readfun)(ptf,*(&(points[i].x) + field[j].dec)))
446 for (
int i=0;i<nfaces;i++) {
447 if (fscanf(ptf,
"%d",(
int*)&(faces[i].npts)) != 1)
return false;
448 if (faces[i].npts != 3)
return false;
449 for (
int j=0;j<faces[i].npts;j++)
450 if (fscanf(ptf,
"%d",&(faces[i].ind[j])) != 1)
return false;
456 for (
int i=0;i<nfaces;i++) {
457 fread( &(faces[i].npts),
sizeof(
unsigned char), 1, ptf);
458 if (faces[i].npts != 3)
return false;
459 for (
int j=0;j<faces[i].npts;j++) {
460 fread( &(faces[i].ind[j]),
sizeof(
int), 1, ptf);
461 if (doswap) Swap<unsigned int>(faces[i].ind[j]);
471 for (i=0; i<nfaces; i++) {
472 faces[i].nx = -faces[i].nx;
473 faces[i].ny = -faces[i].ny;
474 faces[i].nz = -faces[i].nz;
479 sw = faces[i].ind[j];
480 faces[i].ind[j] = faces[i].ind[n-1-j];
481 faces[i].ind[n-1-j] = sw;
493 for(j=0;j<faces[0].npts;j++) {
495 v = faces[0].nx * points[i].nx + faces[0].ny * points[i].ny + faces[0].nz * points[i].nz;
499 InvertFaceNormalsAndIndex();
515 InvertFaceNormalsAndIndex();
519 InvertFaceNormalsIfNeeded();
527 for(i=0;i<npoints;i++) {
528 points[i].nx = -points[i].nx;
529 points[i].ny = -points[i].ny;
530 points[i].nz = -points[i].nz;
541 float vec1[3], vec2[3];
544 for (i=0; i<nfaces; i++) {
545 vec1[0] = points[ faces[i].ind[0] ].x - points[ faces[i].ind[1] ].x;
546 vec1[1] = points[ faces[i].ind[0] ].y - points[ faces[i].ind[1] ].y;
547 vec1[2] = points[ faces[i].ind[0] ].z - points[ faces[i].ind[1] ].z;
549 vec2[0] = points[ faces[i].ind[2] ].x - points[ faces[i].ind[1] ].x;
550 vec2[1] = points[ faces[i].ind[2] ].y - points[ faces[i].ind[1] ].y;
551 vec2[2] = points[ faces[i].ind[2] ].z - points[ faces[i].ind[1] ].z;
553 faces[i].nx = vec2[1] * vec1[2] - vec2[2] * vec1[1];
554 faces[i].ny = vec2[2] * vec1[0] - vec2[0] * vec1[2];
555 faces[i].nz = vec2[0] * vec1[1] - vec2[1] * vec1[0];
557 lg = sqrt( faces[i].nx * faces[i].nx +
558 faces[i].ny * faces[i].ny +
559 faces[i].nz * faces[i].nz);
570 for (i = 0; i < npoints; i++) {
577 for (i=0; i<nfaces; i++)
578 for (j=0; j<faces[i].npts; j++) {
579 points[ faces[i].ind[j] ].nx += faces[i].nx;
580 points[ faces[i].ind[j] ].ny += faces[i].ny;
581 points[ faces[i].ind[j] ].nz += faces[i].nz;
585 for (i=0; i<npoints; i++) {
586 lg = sqrt( points[i].nx * points[i].nx +
587 points[i].ny * points[i].ny +
588 points[i].nz * points[i].nz );
616 npoints = nfaces = nfields = 0;
617 machFMT = WhichEndian();
618 HavePos = HaveNrm = HaveCol = HaveTol = HaveUV = 0;
625 else if (HaveNrm == 3) InvertFaceNormalsIfNeeded();
631 float dM = 10 * MaxBound();
633 bool result = PerformNormalCheck(dM,P);
634 if (!result) InvertNormals();
635 InvertFaceNormalsIfNeeded();
652 ptf = fopen(name,
"rb");
653 if (!ptf)
return false;
657 if (!s) { printf(
"Scan Header Failed\n");
return false; }
660 memset(points,0,npoints*
sizeof(
POINT_PLY));
662 if (!s) { printf(
"Read points Failed\n");
return false; }
665 faces[0].
ind =
new unsigned int[3*nfaces];
666 for(
int i=1;i<nfaces;i++) faces[i].ind = faces[i-1].ind + 3;
667 if (fileFMT ==
BinaryFile) s = ReadBinaryFaces();
668 else s = ReadTextFaces();
669 if (!s) { printf(
"Read faces Failed\n");
return false; }
683 return 2.f * (Val - Min)/(Max - Min) - 1.f;
686 #define MaxMin(v,m,M) { if (v<m) m=v; if (v>M) M=v; }
687 #define NormalizePoint(v,m,M) ( 2.f*(v-m)/(M-m) - 1.f )
689 float Xmax, Ymax, Zmax, Xmin, Ymin, Zmin, Cx, Cy, Cz;
690 Cx = Xmax = Xmin = points[0].x;
691 Cy = Ymax = Ymin = points[0].y;
692 Cz = Zmax = Zmin = points[0].z;
693 for(
int i=1;i<npoints;i++) {
694 MaxMin(points[i].x, Xmin, Xmax);
695 MaxMin(points[i].y, Ymin, Ymax);
696 MaxMin(points[i].z, Zmin, Zmax);
701 Cx /= float(npoints);
702 Cy /= float(npoints);
703 Cz /= float(npoints);
704 float norm =
max(
max(Xmax-Xmin,Ymax-Ymin),Zmax-Zmin);
705 for(
int i=0;i<npoints;i++) {
706 points[i].x = (points[i].x - Cx) / norm;
707 points[i].y = (points[i].y - Cy) / norm;
708 points[i].z = (points[i].z - Cz) / norm;
const dword CheckNormal
si SimpleCheck (A = v�rification des normales) a �t� effectu�
void Init(void)
m�thode interne
void ProcessNormals(void)
Recalcul des normales sur un objet.
bool BuildReader(int, int, int, uchar &, char *)
m�thode interne
bool ReadBinFloat8(FILE *ptf, float &sto)
bool ReadTextFaces(void)
m�thode interne
const dword CheckCoherence
si CoherenceCheck (B) a �t� effectu�
float MaxBound(void)
m�thode interne
bool ReadBinUInt2(FILE *ptf, float &sto)
void CheckAndRepair(void)
= NormalCheck + CoherenceCheck
bool ReadBinInt1(FILE *ptf, float &sto)
bool ReadSwapBinUInt4(FILE *ptf, float &sto)
const dword CheckBadNormals
si les normales semblent invers�es (heuristique) (B)
void InvertFaceNormalsIfNeeded(void)
m�thode interne
Ply::Endian WhichEndian(void)
m�thode interne
bool ReadPoints(void)
m�thode interne
#define NormalizePoint(v, m, M)
bool ReadSwapBinInt4(FILE *ptf, float &sto)
bool Load(const char *name)
charge le fichier PLY et construit les structures de donn�es.
void SmartInvertNormals(void)
inverse les normales si n�cessaire: si les normales sont lues, inverse simplement les normales...
bool ReadSwapBinFloat4(FILE *ptf, float &sto)
#define SwapByte32(u)
Swap par décalage et masque sur 4 octets.
Namespace utilis� pour stocker les structures, �num�rations, ... du PlyLoader. ...
bool ReadSwapBinUInt2(FILE *ptf, float &sto)
bool ReadBinFloat4(FILE *ptf, float &sto)
bool ReadSwapBinFloat8(FILE *ptf, float &sto)
void DumpSample(void)
affiche les 10 premiers sommets lus dans le fichier
void InvertNormals(void)
m�thode interne
bool ReadTextInt4(FILE *ptf, float &sto)
const dword CheckRevFacets
si des polygones adjacents ne sont pas orient�s dans le m�me sens (B)
bool ReadTextUInt4(FILE *ptf, float &sto)
#define SAFE_DELETE_ARRAY(x)
bool ReadBinUInt4(FILE *ptf, float &sto)
void CoherenceCheck(void)
test de la coh�rence g�om�trique d'un objet
const dword CheckNotChecked
constante pour les v�rifications d'une g�om�trie
structure interne pour le stockage des fonctions internes de lecture
Structure interne utilis�e pour les tests de coh�rence sur les faces.
bool ReadTextFloat(FILE *ptf, float &sto)
bool ReadBinaryFaces(void)
m�thode interne
bool PerformNormalCheck(float, float *)
m�thode interne
const dword CheckInvalidIndices
si un indice utilis� n'a pas de sommet associ� (B)
bool(* ReadFun)(FILE *, float &)
pointeur interne sur une fonction de lecture
Structure utilis�e pour lire les caract�ristiques des sommets.
bool ReadTextInt1(FILE *ptf, float &sto)
int EdgeSort(const void *x, const void *y)
void InvertFaceNormalsAndIndex(void)
m�thode interne
void NormalizeObject(void)
renormalise l'objet pour qu'il soit centr� � l'origine du rep�re (local) et de largeur 1...
Field
pour enum�ration des champs pr�sents dans le fichier PLY lu
bool ReadBinUInt1(FILE *ptf, float &sto)
const int maxfields
nombre maximum de champs lus dans un fichier PLY
const dword CheckInvNormals
si le sens des normales a �t� test� (B)
void Delete(void)
m�thode interne
const dword CheckUnsharedEdges
si chaque ar�te n'est pas partag�e par 2 polygones (B)
bool ReadTextInt2(FILE *ptf, float &sto)
void NormalCheck(void)
test des normales (si elles existent)
bool ReadBinInt4(FILE *ptf, float &sto)
bool ReadTextUInt1(FILE *ptf, float &sto)
void Dump(void)
Affiche les valeurs de tous les sommets et faces lus dans la structure. Ne change pas le r�sultat de...
structure utilis�e pour lire un fichier au format PLY
bool ReadTextUInt2(FILE *ptf, float &sto)
const dword CheckUnconnectedPts
si un sommet n'appartient � aucun polygone (B)
bool ReadSwapBinInt2(FILE *ptf, float &sto)
bool ReadBinInt2(FILE *ptf, float &sto)
bool ReadHeader(void)
m�thode interne
const char * GetMask(dword, int, int)
m�thode interne
le stockage est en binaire
Endian
Enum pour le type de stockage des donn�es en binaire.