Additional bug fixes after testing.

This commit is contained in:
curt 2001-01-05 00:04:20 +00:00
parent 70f495b4e1
commit 260dbeb3d2
4 changed files with 155 additions and 131 deletions

View File

@ -28,222 +28,224 @@
static int read_error = false ;
static int write_error = false ;
int sgReadError (void) { return read_error ; }
int sgWriteError (void) { return write_error ; }
void sgClearReadError() { read_error = false; }
void sgClearWriteError() { write_error = false; }
int sgReadError() { return read_error ; }
int sgWriteError() { return write_error ; }
void sgReadChar ( gzFile fd, char *var )
{
if ( gzread ( fd, var, sizeof(char) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(char) ) > 0 ) return ;
read_error = true ;
}
void sgWriteChar ( gzFile fd, const char var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(char) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(char) ) > 0 ) return ;
write_error = true ;
}
void sgReadFloat ( gzFile fd, float *var )
{
if ( gzread ( fd, var, sizeof(float) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(float) ) > 0 ) return ;
read_error = true ;
}
void sgWriteFloat ( gzFile fd, const float var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) > 0 ) return ;
write_error = true ;
}
void sgReadDouble ( gzFile fd, double *var )
{
if ( gzread ( fd, var, sizeof(double) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(double) ) > 0 ) return ;
read_error = true ;
}
void sgWriteDouble ( gzFile fd, const double var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) > 0 ) return ;
write_error = true ;
}
void sgReadUInt ( gzFile fd, unsigned int *var )
{
if ( gzread ( fd, var, sizeof(unsigned int) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(unsigned int) ) > 0 ) return ;
read_error = true ;
}
void sgWriteUInt ( gzFile fd, const unsigned int var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned int) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned int) ) > 0 ) return ;
write_error = true ;
}
void sgReadInt ( gzFile fd, int *var )
{
if ( gzread ( fd, var, sizeof(int) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(int) ) > 0 ) return ;
read_error = true ;
}
void sgWriteInt ( gzFile fd, const int var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(int) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(int) ) > 0 ) return ;
write_error = true ;
}
void sgReadLong ( gzFile fd, long int *var )
{
if ( gzread ( fd, var, sizeof(long int) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(long int) ) > 0 ) return ;
read_error = true ;
}
void sgWriteLong ( gzFile fd, const long int var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(long int) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(long int) ) > 0 ) return ;
write_error = true ;
}
void sgReadUShort ( gzFile fd, unsigned short *var )
{
if ( gzread ( fd, var, sizeof(unsigned short) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(unsigned short) ) > 0 ) return ;
read_error = true ;
}
void sgWriteUShort ( gzFile fd, const unsigned short var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned short) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned short) ) > 0 ) return ;
write_error = true ;
}
void sgReadShort ( gzFile fd, short *var )
{
if ( gzread ( fd, var, sizeof(short) ) == 1 ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(short) ) > 0 ) return ;
read_error = true ;
}
void sgWriteShort ( gzFile fd, const short var )
{
if ( gzwrite ( fd, (void *)(&var), sizeof(short) ) == 1 ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)(&var), sizeof(short) ) > 0 ) return ;
write_error = true ;
}
void sgReadFloat ( gzFile fd, const unsigned int n, float *var )
{
if ( gzread ( fd, var, sizeof(float) * n ) == (int)n ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(float) * n ) == (int)n ) return ;
read_error = true ;
}
void sgWriteFloat ( gzFile fd, const unsigned int n, const float *var )
{
if ( gzwrite ( fd, (void *)var, sizeof(float) * n ) == (int)n ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)var, sizeof(float) * n ) == (int)n ) return ;
write_error = true ;
}
void sgReadDouble ( gzFile fd, const unsigned int n, double *var )
{
if ( gzread ( fd, var, sizeof(double) * n ) == (int)n ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(double) * n ) == (int)n ) return ;
read_error = true ;
}
void sgWriteDouble ( gzFile fd, const unsigned int n, const double *var )
{
if ( gzwrite ( fd, (void *)var, sizeof(double) * n ) == (int)n ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)var, sizeof(double) * n ) == (int)n ) return ;
write_error = true ;
}
void sgReadBytes ( gzFile fd, const unsigned int n, void *var )
{
if ( n == 0)
return;
if ( gzread ( fd, var, n ) == 1 )
return ;
read_error = true ;
if ( n == 0)
return;
if ( gzread ( fd, var, n ) > 0 )
return ;
read_error = true ;
}
void sgWriteBytes ( gzFile fd, const unsigned int n, const void *var )
{
if ( n == 0)
return;
if ( gzwrite ( fd, (void *)var, n ) == 1 )
return ;
write_error = true ;
if ( n == 0)
return;
if ( gzwrite ( fd, (void *)var, n ) > 0 )
return ;
write_error = true ;
}
void sgReadUShort ( gzFile fd, const unsigned int n, unsigned short *var )
{
if ( gzread ( fd, var, sizeof(unsigned short) * n ) == (int)n ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(unsigned short) * n ) == (int)n ) return ;
read_error = true ;
}
void sgWriteUShort ( gzFile fd, const unsigned int n, const unsigned short *var )
{
if ( gzwrite ( fd, (void *)var, sizeof(unsigned short) * n ) == (int)n ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)var, sizeof(unsigned short) * n ) == (int)n ) return ;
write_error = true ;
}
void sgReadShort ( gzFile fd, const unsigned int n, short *var )
{
if ( gzread ( fd, var, sizeof(short) * n ) == (int)n ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(short) * n ) == (int)n ) return ;
read_error = true ;
}
void sgWriteShort ( gzFile fd, const unsigned int n, const short *var )
{
if ( gzwrite ( fd, (void *)var, sizeof(short) * n ) == (int)n ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)var, sizeof(short) * n ) == (int)n ) return ;
write_error = true ;
}
void sgReadUInt ( gzFile fd, const unsigned int n, unsigned int *var )
{
if ( gzread ( fd, var, sizeof(unsigned int)* n ) == (int)n ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(unsigned int)* n ) == (int)n ) return ;
read_error = true ;
}
void sgWriteUInt ( gzFile fd, const unsigned int n, const unsigned int *var )
{
if ( gzwrite ( fd, (void *)var, sizeof(unsigned int) * n ) == (int)n ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)var, sizeof(unsigned int) * n ) == (int)n ) return ;
write_error = true ;
}
void sgReadInt ( gzFile fd, const unsigned int n, int *var )
{
if ( gzread ( fd, var, sizeof(int) * n ) == (int)n ) return ;
read_error = true ;
if ( gzread ( fd, var, sizeof(int) * n ) == (int)n ) return ;
read_error = true ;
}
void sgWriteInt ( gzFile fd, const unsigned int n, const int *var )
{
if ( gzwrite ( fd, (void *)var, sizeof(int) * n ) == (int)n ) return ;
write_error = true ;
if ( gzwrite ( fd, (void *)var, sizeof(int) * n ) == (int)n ) return ;
write_error = true ;
}
@ -252,41 +254,41 @@ void sgWriteInt ( gzFile fd, const unsigned int n, const int *var )
void sgReadString ( gzFile fd, char **var )
{
int i ;
char s [ MAX_ENTITY_NAME_LENGTH ] ;
int i ;
char s [ MAX_ENTITY_NAME_LENGTH ] ;
for ( i = 0 ; i < MAX_ENTITY_NAME_LENGTH ; i++ )
{
int c = gzgetc ( fd ) ;
s [ i ] = c ;
for ( i = 0 ; i < MAX_ENTITY_NAME_LENGTH ; i++ )
{
int c = gzgetc ( fd ) ;
s [ i ] = c ;
if ( c == '\0' )
break ;
}
if ( c == '\0' )
break ;
}
if ( i >= MAX_ENTITY_NAME_LENGTH-1 )
s [ MAX_ENTITY_NAME_LENGTH-1 ] = '\0' ;
if ( i >= MAX_ENTITY_NAME_LENGTH-1 )
s [ MAX_ENTITY_NAME_LENGTH-1 ] = '\0' ;
if ( s[0] == '\0' )
*var = NULL ;
else
{
*var = new char [ strlen(s)+1 ] ;
strcpy ( *var, s ) ;
}
if ( s[0] == '\0' )
*var = NULL ;
else
{
*var = new char [ strlen(s)+1 ] ;
strcpy ( *var, s ) ;
}
}
void sgWriteString ( gzFile fd, const char *var )
{
if ( var != NULL ) {
if ( gzwrite ( fd, (void *)var, strlen(var) + 1 ) ==
(int)(strlen(var) + 1) )
return ;
} else {
gzputc( fd, 0 );
}
if ( var != NULL ) {
if ( gzwrite ( fd, (void *)var, strlen(var) + 1 ) ==
(int)(strlen(var) + 1) )
return ;
} else {
gzputc( fd, 0 );
}
}

View File

@ -81,8 +81,10 @@ void sgWriteVec4 ( gzFile fd, const sgVec4 var ) ;
void sgReadMat4 ( gzFile fd, sgMat4 var ) ;
void sgWriteMat4 ( gzFile fd, const sgMat4 var ) ;
int sgReadError ( void ) ;
int sgWriteError ( void ) ;
void sgClearReadError();
void sgClearWriteError();
int sgReadError();
int sgWriteError();
#endif // _SG_LOWLEVEL_HXX

View File

@ -110,7 +110,7 @@ double sgCalcBoundingRadius( Point3D center, point_list& wgs84_nodes ) {
// write out the structures to an ASCII file. We assume that the
// groups come to us sorted by material property. If not, things
// don't break, but the result won't be as optimal.
void sgWriteAsciiObj( const string& base, const string& name, const SGBucket& b,
bool sgWriteAsciiObj( const string& base, const string& name, const SGBucket& b,
Point3D gbs_center, float gbs_radius,
const point_list& wgs84_nodes, const point_list& normals,
const point_list& texcoords,
@ -139,7 +139,7 @@ void sgWriteAsciiObj( const string& base, const string& name, const SGBucket& b,
FILE *fp;
if ( (fp = fopen( file.c_str(), "w" )) == NULL ) {
cout << "ERROR: opening " << file << " for writing!" << endl;
exit(-1);
return false;
}
cout << "triangles size = " << tris_v.size() << " tri_materials = "
@ -299,11 +299,13 @@ void sgWriteAsciiObj( const string& base, const string& name, const SGBucket& b,
command = "gzip --force --best " + file;
system(command.c_str());
return true;
}
// read a binary file and populate the provided structures.
void sgReadBinObj( const string& file,
bool sgReadBinObj( const string& file,
Point3D &gbs_center, float *gbs_radius,
point_list& wgs84_nodes, point_list& normals,
point_list& texcoords,
@ -315,7 +317,8 @@ void sgReadBinObj( const string& file,
string_list& fan_materials )
{
Point3D p;
int i, j, k, m;
int i, j, k;
char material[256];
// zero out structures
wgs84_nodes.clear();
@ -342,19 +345,23 @@ void sgReadBinObj( const string& file,
if ( (fp = gzopen( filegz.c_str(), "rb" )) == NULL ) {
cout << "ERROR: opening " << file << " or " << filegz
<< "for reading!" << endl;
exit(-1);
return false;
}
}
sgClearReadError();
// read headers
int header, version;
sgReadInt( fp, &header );
if ( ((header & 0xFF000000) >> 24) == 'T' &&
if ( ((header & 0xFF000000) >> 24) == 'S' &&
((header & 0x00FF0000) >> 16) == 'G' ) {
cout << "Good header" << endl;
// read file version
version = (header & 0x0000FFFF);
cout << "File version = " << version << endl;
} else {
return false;
}
// read creation time
@ -470,8 +477,9 @@ void sgReadBinObj( const string& file,
sgReadBytes( fp, nbytes, ptr );
int count = nbytes / 3;
for ( k = 0; k < count; ++k ) {
p = Point3D( ptr[0] / 256.0, ptr[1] / 256.0,
ptr[2] / 256.0 );
p = Point3D( ptr[0] / 128.0 - 1.0,
ptr[1] / 128.0 - 1.0,
ptr[2] / 128.0 - 1.0 );
cout << "normal = " << p << endl;
normals.push_back( p );
ptr += 3;
@ -521,11 +529,9 @@ void sgReadBinObj( const string& file,
char *ptr = buf;
sgReadBytes( fp, nbytes, ptr );
if ( prop_type == SG_MATERIAL ) {
char material[256];
strncpy( material, ptr, nbytes );
material[nbytes] = '\0';
cout << "material type = " << material << endl;
tri_materials.push_back( material );
}
}
@ -537,21 +543,20 @@ void sgReadBinObj( const string& file,
char buf[nbytes];
char *ptr = buf;
sgReadBytes( fp, nbytes, ptr );
int count = nbytes / (sizeof(short) * 2 * 3);
int count = nbytes / (sizeof(short) * 2);
short *sptr = (short *)ptr;
int_list vs, tcs;
vs.clear(); tcs.clear();
for ( k = 0; k < count; ++k ) {
vs.clear(); tcs.clear();
for ( m = 0; m < 3; ++m ) {
vs.push_back( sptr[0] );
tcs.push_back( sptr[1] );
cout << sptr[0] << "/" << sptr[1] << " ";
sptr += 2;
}
cout << endl;
tris_v.push_back( vs );
tris_tc.push_back( tcs );
vs.push_back( sptr[0] );
tcs.push_back( sptr[1] );
cout << sptr[0] << "/" << sptr[1] << " ";
sptr += 2;
}
cout << endl;
tris_v.push_back( vs );
tris_tc.push_back( tcs );
tri_materials.push_back( material );
}
} else if ( obj_type == SG_TRIANGLE_STRIPS ) {
// read triangle strip properties
@ -566,11 +571,9 @@ void sgReadBinObj( const string& file,
char *ptr = buf;
sgReadBytes( fp, nbytes, ptr );
if ( prop_type == SG_MATERIAL ) {
char material[256];
strncpy( material, ptr, nbytes );
material[nbytes] = '\0';
cout << "material type = " << material << endl;
strip_materials.push_back( material );
}
}
@ -582,7 +585,7 @@ void sgReadBinObj( const string& file,
char buf[nbytes];
char *ptr = buf;
sgReadBytes( fp, nbytes, ptr );
int count = nbytes / (sizeof(short) * 2 * 3);
int count = nbytes / (sizeof(short) * 2);
short *sptr = (short *)ptr;
int_list vs, tcs;
vs.clear(); tcs.clear();
@ -595,6 +598,7 @@ void sgReadBinObj( const string& file,
cout << endl;
strips_v.push_back( vs );
strips_tc.push_back( tcs );
strip_materials.push_back( material );
}
} else if ( obj_type == SG_TRIANGLE_FANS ) {
// read triangle fan properties
@ -609,11 +613,9 @@ void sgReadBinObj( const string& file,
char *ptr = buf;
sgReadBytes( fp, nbytes, ptr );
if ( prop_type == SG_MATERIAL ) {
char material[256];
strncpy( material, ptr, nbytes );
material[nbytes] = '\0';
cout << "material type = " << material << endl;
fan_materials.push_back( material );
}
}
@ -625,7 +627,7 @@ void sgReadBinObj( const string& file,
char buf[nbytes];
char *ptr = buf;
sgReadBytes( fp, nbytes, ptr );
int count = nbytes / (sizeof(short) * 2 * 3);
int count = nbytes / (sizeof(short) * 2);
short *sptr = (short *)ptr;
int_list vs, tcs;
vs.clear(); tcs.clear();
@ -638,6 +640,7 @@ void sgReadBinObj( const string& file,
cout << endl;
fans_v.push_back( vs );
fans_tc.push_back( tcs );
fan_materials.push_back( material );
}
} else {
// unknown object type, just skip
@ -669,13 +672,20 @@ void sgReadBinObj( const string& file,
// close the file
gzclose(fp);
if ( sgReadError() ) {
cout << "We detected an error while reading the file." << endl;
return false;
}
return true;
}
// write out the structures to a binary file. We assume that the
// groups come to us sorted by material property. If not, things
// don't break, but the result won't be as optimal.
void sgWriteBinObj( const string& base, const string& name, const SGBucket& b,
bool sgWriteBinObj( const string& base, const string& name, const SGBucket& b,
Point3D gbs_center, float gbs_radius,
const point_list& wgs84_nodes, const point_list& normals,
const point_list& texcoords,
@ -705,9 +715,11 @@ void sgWriteBinObj( const string& base, const string& name, const SGBucket& b,
gzFile fp;
if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
cout << "ERROR: opening " << file << " for writing!" << endl;
exit(-1);
return false;
}
sgClearWriteError();
cout << "triangles size = " << tris_v.size() << " tri_materials = "
<< tri_materials.size() << endl;
cout << "strips size = " << strips_v.size() << " strip_materials = "
@ -808,9 +820,9 @@ void sgWriteBinObj( const string& base, const string& name, const SGBucket& b,
char normal[3];
for ( i = 0; i < (int)normals.size(); ++i ) {
p = normals[i];
normal[0] = (char)(p.x() * 256);
normal[1] = (char)(p.y() * 256);
normal[2] = (char)(p.z() * 256);
normal[0] = (char)((p.x() + 1.0) * 128);
normal[1] = (char)((p.y() + 1.0) * 128);
normal[2] = (char)((p.z() + 1.0) * 128);
sgWriteBytes( fp, 3, normal );
}
@ -947,4 +959,11 @@ void sgWriteBinObj( const string& base, const string& name, const SGBucket& b,
// close the file
gzclose(fp);
if ( sgWriteError() ) {
cout << "We detected an error while writing the file." << endl;
return false;
}
return true;
}

View File

@ -34,6 +34,8 @@
#include <simgear/compiler.h>
#include <simgear/constants.h>
#include <simgear/math/sg_types.hxx>
#include <simgear/bucket/newbucket.hxx>
#include <stdio.h>
#include <time.h>
@ -41,7 +43,6 @@
#include <list>
#include STL_STRING
#include <simgear/math/sg_types.hxx>
typedef vector < int_list > group_list;
@ -79,7 +80,7 @@ double sgCalcBoundingRadius( Point3D center, point_list& wgs84_nodes );
// write out the structures to an ASCII file. We assume that the
// groups come to us sorted by material property. If not, things
// don't break, but the result won't be as optimal.
void sgWriteAsciiObj( const string& base, const string& name, const SGBucket& b,
bool sgWriteAsciiObj( const string& base, const string& name, const SGBucket& b,
Point3D gbs_center, float gbs_radius,
const point_list& wgs84_nodes, const point_list& normals,
const point_list& texcoords,
@ -92,7 +93,7 @@ void sgWriteAsciiObj( const string& base, const string& name, const SGBucket& b,
// read a binary file object and populate the provided structures.
void sgReadBinObj( const string& file,
bool sgReadBinObj( const string& file,
Point3D &gbs_center, float *gbs_radius,
point_list& wgs84_nodes, point_list& normals,
point_list& texcoords,
@ -106,7 +107,7 @@ void sgReadBinObj( const string& file,
// write out the structures to a binary file. We assume that the
// groups come to us sorted by material property. If not, things
// don't break, but the result won't be as optimal.
void sgWriteBinObj( const string& base, const string& name, const SGBucket& b,
bool sgWriteBinObj( const string& base, const string& name, const SGBucket& b,
Point3D gbs_center, float gbs_radius,
const point_list& wgs84_nodes, const point_list& normals,
const point_list& texcoords,