Extended .btg format to support a 'points' primitive.
This commit is contained in:
@@ -52,6 +52,8 @@ enum {
|
|||||||
SG_NORMAL_LIST = 2,
|
SG_NORMAL_LIST = 2,
|
||||||
SG_TEXCOORD_LIST = 3,
|
SG_TEXCOORD_LIST = 3,
|
||||||
|
|
||||||
|
SG_POINTS = 9,
|
||||||
|
|
||||||
SG_TRIANGLE_FACES = 10,
|
SG_TRIANGLE_FACES = 10,
|
||||||
SG_TRIANGLE_STRIPS = 11,
|
SG_TRIANGLE_STRIPS = 11,
|
||||||
SG_TRIANGLE_FANS = 12
|
SG_TRIANGLE_FANS = 12
|
||||||
@@ -161,6 +163,9 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
normals.clear();
|
normals.clear();
|
||||||
texcoords.clear();
|
texcoords.clear();
|
||||||
|
|
||||||
|
pts_v.clear();
|
||||||
|
pt_materials.clear();
|
||||||
|
|
||||||
tris_v.clear();
|
tris_v.clear();
|
||||||
tris_tc.clear();
|
tris_tc.clear();
|
||||||
tri_materials.clear();
|
tri_materials.clear();
|
||||||
@@ -375,6 +380,47 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
fptr += 2;
|
fptr += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if ( obj_type == SG_POINTS ) {
|
||||||
|
// read points properties
|
||||||
|
for ( j = 0; j < nproperties; ++j ) {
|
||||||
|
char prop_type;
|
||||||
|
sgReadChar( fp, &prop_type );
|
||||||
|
|
||||||
|
sgReadUInt( fp, &nbytes );
|
||||||
|
// cout << "property size = " << nbytes << endl;
|
||||||
|
if ( nbytes > buf.get_size() ) { buf.resize( nbytes ); }
|
||||||
|
char *ptr = buf.get_ptr();
|
||||||
|
sgReadBytes( fp, nbytes, ptr );
|
||||||
|
if ( prop_type == SG_MATERIAL ) {
|
||||||
|
strncpy( material, ptr, nbytes );
|
||||||
|
material[nbytes] = '\0';
|
||||||
|
// cout << "material type = " << material << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// read point elements
|
||||||
|
for ( j = 0; j < nelements; ++j ) {
|
||||||
|
sgReadUInt( fp, &nbytes );
|
||||||
|
// cout << "element size = " << nbytes << endl;
|
||||||
|
if ( nbytes > buf.get_size() ) { buf.resize( nbytes ); }
|
||||||
|
char *ptr = buf.get_ptr();
|
||||||
|
sgReadBytes( fp, nbytes, ptr );
|
||||||
|
int count = nbytes / sizeof(short);
|
||||||
|
short *sptr = (short *)ptr;
|
||||||
|
int_list vs;
|
||||||
|
vs.clear();
|
||||||
|
for ( k = 0; k < count; ++k ) {
|
||||||
|
if ( sgIsBigEndian() ) {
|
||||||
|
sgEndianSwap( (unsigned short *)&(sptr[0]) );
|
||||||
|
}
|
||||||
|
vs.push_back( sptr[0] );
|
||||||
|
// cout << sptr[0] << " ";
|
||||||
|
++sptr;
|
||||||
|
}
|
||||||
|
// cout << endl;
|
||||||
|
pts_v.push_back( vs );
|
||||||
|
pt_materials.push_back( material );
|
||||||
|
}
|
||||||
} else if ( obj_type == SG_TRIANGLE_FACES ) {
|
} else if ( obj_type == SG_TRIANGLE_FACES ) {
|
||||||
// read triangle face properties
|
// read triangle face properties
|
||||||
for ( j = 0; j < nproperties; ++j ) {
|
for ( j = 0; j < nproperties; ++j ) {
|
||||||
@@ -575,6 +621,8 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
|
|
||||||
sgClearWriteError();
|
sgClearWriteError();
|
||||||
|
|
||||||
|
cout << "points size = " << pts_v.size() << " pt_materials = "
|
||||||
|
<< pt_materials.size() << endl;
|
||||||
cout << "triangles size = " << tris_v.size() << " tri_materials = "
|
cout << "triangles size = " << tris_v.size() << " tri_materials = "
|
||||||
<< tri_materials.size() << endl;
|
<< tri_materials.size() << endl;
|
||||||
cout << "strips size = " << strips_v.size() << " strip_materials = "
|
cout << "strips size = " << strips_v.size() << " strip_materials = "
|
||||||
@@ -600,6 +648,20 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
nobjects++; // for normals
|
nobjects++; // for normals
|
||||||
nobjects++; // for texcoords
|
nobjects++; // for texcoords
|
||||||
|
|
||||||
|
// points
|
||||||
|
short npts = 0;
|
||||||
|
start = 0; end = 1;
|
||||||
|
while ( start < (int)pt_materials.size() ) {
|
||||||
|
material = pt_materials[start];
|
||||||
|
while ( (end < (int)pt_materials.size()) &&
|
||||||
|
(material == pt_materials[end]) ) {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
npts++;
|
||||||
|
start = end; end = start + 1;
|
||||||
|
}
|
||||||
|
nobjects += npts;
|
||||||
|
|
||||||
// tris
|
// tris
|
||||||
short ntris = 0;
|
short ntris = 0;
|
||||||
start = 0; end = 1;
|
start = 0; end = 1;
|
||||||
@@ -692,6 +754,45 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
sgWriteVec2( fp, t );
|
sgWriteVec2( fp, t );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dump point groups if they exist
|
||||||
|
if ( pts_v.size() > 0 ) {
|
||||||
|
int start = 0;
|
||||||
|
int end = 1;
|
||||||
|
string material;
|
||||||
|
while ( start < (int)pt_materials.size() ) {
|
||||||
|
// find next group
|
||||||
|
material = pt_materials[start];
|
||||||
|
while ( (end < (int)pt_materials.size()) &&
|
||||||
|
(material == pt_materials[end]) )
|
||||||
|
{
|
||||||
|
// cout << "end = " << end << endl;
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
// cout << "group = " << start << " to " << end - 1 << endl;
|
||||||
|
|
||||||
|
// write group headers
|
||||||
|
sgWriteChar( fp, (char)SG_POINTS ); // type
|
||||||
|
sgWriteShort( fp, 1 ); // nproperties
|
||||||
|
sgWriteShort( fp, end - start ); // nelements
|
||||||
|
|
||||||
|
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
||||||
|
sgWriteUInt( fp, material.length() ); // nbytes
|
||||||
|
sgWriteBytes( fp, material.length(), material.c_str() );
|
||||||
|
|
||||||
|
// write strips
|
||||||
|
for ( i = start; i < end; ++i ) {
|
||||||
|
// nbytes
|
||||||
|
sgWriteUInt( fp, pts_v[i].size() * sizeof(short) );
|
||||||
|
for ( j = 0; j < (int)pts_v[i].size(); ++j ) {
|
||||||
|
sgWriteShort( fp, (short)pts_v[i][j] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
start = end;
|
||||||
|
end = start + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// dump individual triangles if they exist
|
// dump individual triangles if they exist
|
||||||
if ( tris_v.size() > 0 ) {
|
if ( tris_v.size() > 0 ) {
|
||||||
int start = 0;
|
int start = 0;
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ typedef group_list::const_iterator const_group_list_iterator;
|
|||||||
* - property: prop_typecode, nbytes, BYTE+
|
* - property: prop_typecode, nbytes, BYTE+
|
||||||
*
|
*
|
||||||
* - obj_typecode: bounding sphere | vertices | normals | texcoords |
|
* - obj_typecode: bounding sphere | vertices | normals | texcoords |
|
||||||
* triangles | fans | strips
|
* points | triangles | fans | strips
|
||||||
*
|
*
|
||||||
* - prop_typecode: material_name | ???
|
* - prop_typecode: material_name | ???
|
||||||
*
|
*
|
||||||
@@ -94,6 +94,8 @@ class SGBinObject {
|
|||||||
point_list wgs84_nodes;
|
point_list wgs84_nodes;
|
||||||
point_list normals;
|
point_list normals;
|
||||||
point_list texcoords;
|
point_list texcoords;
|
||||||
|
group_list pts_v;
|
||||||
|
string_list pt_materials;
|
||||||
group_list tris_v;
|
group_list tris_v;
|
||||||
group_list tris_tc;
|
group_list tris_tc;
|
||||||
string_list tri_materials;
|
string_list tri_materials;
|
||||||
@@ -123,6 +125,11 @@ public:
|
|||||||
inline point_list get_texcoords() const { return texcoords; }
|
inline point_list get_texcoords() const { return texcoords; }
|
||||||
inline void set_texcoords( point_list t ) { texcoords = t; }
|
inline void set_texcoords( point_list t ) { texcoords = t; }
|
||||||
|
|
||||||
|
inline group_list get_pts_v() const { return pts_v; }
|
||||||
|
inline void set_pts_v( group_list g ) { pts_v = g; }
|
||||||
|
inline string_list get_pt_materials() const { return pt_materials; }
|
||||||
|
inline void set_pt_materials( string_list s ) { pt_materials = s; }
|
||||||
|
|
||||||
inline group_list get_tris_v() const { return tris_v; }
|
inline group_list get_tris_v() const { return tris_v; }
|
||||||
inline void set_tris_v( group_list g ) { tris_v = g; }
|
inline void set_tris_v( group_list g ) { tris_v = g; }
|
||||||
inline group_list get_tris_tc() const { return tris_tc; }
|
inline group_list get_tris_tc() const { return tris_tc; }
|
||||||
|
|||||||
Reference in New Issue
Block a user