diff --git a/src/BuildTiles/Main/tgconstruct.cxx b/src/BuildTiles/Main/tgconstruct.cxx index cd01b92c..2a5e5586 100644 --- a/src/BuildTiles/Main/tgconstruct.cxx +++ b/src/BuildTiles/Main/tgconstruct.cxx @@ -27,32 +27,15 @@ #include <iomanip> -//#include <boost/foreach.hpp> - -//#include <simgear/compiler.h> -//#include <simgear/constants.h> -//#include <simgear/math/sg_geodesy.hxx> -//#include <simgear/math/SGGeometry.hxx> -//#include <simgear/misc/sg_dir.hxx> -//#include <simgear/misc/texcoord.hxx> -//#include <simgear/io/sg_binobj.hxx> -//#include <simgear/structure/exception.hxx> #include <simgear/debug/logstream.hxx> -//#include <CGAL/Plane_3.h> - -//#include <Geometry/poly_support.hxx> -//#include <Geometry/poly_extra.hxx> - #include "tgconstruct.hxx" -//#include "usgs.hxx" - -//using std::string; // Constructor TGConstruct::TGConstruct(): ignoreLandmass(false), debug_all(false), - ds_id((void*)-1) + ds_id((void*)-1), + isOcean(false) { } @@ -109,6 +92,7 @@ void TGConstruct::ConstructBucketStage1() { if ( LoadLandclassPolys() == 0 ) { // don't build the tile if there is no 2d data ... it *must* // be ocean and the sim can build the tile on the fly. + SetOceanTile(); return; } @@ -133,101 +117,105 @@ void TGConstruct::ConstructBucketStage1() { } void TGConstruct::ConstructBucketStage2() { - // First, set the precision of floating point logging: - SG_LOG(SG_GENERAL, SG_ALERT, std::setprecision(12) << std::fixed); - SG_LOG(SG_GENERAL, SG_ALERT, "\nConstructing tile ID " << bucket.gen_index_str() << " in " << bucket.gen_base_path() ); + if ( !IsOceanTile() ) { + // First, set the precision of floating point logging: + SG_LOG(SG_GENERAL, SG_ALERT, std::setprecision(12) << std::fixed); + SG_LOG(SG_GENERAL, SG_ALERT, "\nConstructing tile ID " << bucket.gen_index_str() << " in " << bucket.gen_base_path() ); - /* If we have some debug IDs, create a datasource */ - if ( debug_shapes.size() || debug_all ) { - sprintf(ds_name, "%s/constructdbg_%s", debug_path.c_str(), bucket.gen_index_str().c_str() ); - SG_LOG(SG_GENERAL, SG_ALERT, "Debug_string: " << ds_name ); - } else { - strcpy( ds_name, "" ); + /* If we have some debug IDs, create a datasource */ + if ( debug_shapes.size() || debug_all ) { + sprintf(ds_name, "%s/constructdbg_%s", debug_path.c_str(), bucket.gen_index_str().c_str() ); + SG_LOG(SG_GENERAL, SG_ALERT, "Debug_string: " << ds_name ); + } else { + strcpy( ds_name, "" ); + } + + // STEP 7) + // Need the array of elevation data for stage 2 + LoadElevationArray(); + + // STEP 6) + // Merge in Shared data - should just be x,y nodes on the borders from stage1 + LoadSharedEdgeData( 1 ); + + // STEP 7) + // Fix T-Junctions by finding nodes that lie close to polygon edges, and + // inserting them into the edge + FixTJunctions(); + + // STEP 8) + // Generate triangles - we can't generate the node-face lookup table + // until all polys are tesselated, as extra nodes can still be generated + TesselatePolys(); + + // STEP 9) + // Generate triangle vertex coordinates to node index lists + // NOTE: After this point, no new nodes can be added + LookupNodesPerVertex(); + + // STEP 10) + // Interpolate elevations, and flatten stuff + CalcElevations(); + + // STEP 11) + // Generate face_connected list + LookupFacesPerNode(); + + // STEP 12) + // Save the tile boundary info for stage 3 + // includes elevation info, and a list of connected triangles + SaveSharedEdgeData( 2 ); } - - // STEP 7) - // Need the array of elevation data for stage 2 - LoadElevationArray(); - - // STEP 6) - // Merge in Shared data - should just be x,y nodes on the borders from stage1 - LoadSharedEdgeData( 1 ); - - // STEP 7) - // Fix T-Junctions by finding nodes that lie close to polygon edges, and - // inserting them into the edge - FixTJunctions(); - - // STEP 8) - // Generate triangles - we can't generate the node-face lookup table - // until all polys are tesselated, as extra nodes can still be generated - TesselatePolys(); - - // STEP 9) - // Generate triangle vertex coordinates to node index lists - // NOTE: After this point, no new nodes can be added - LookupNodesPerVertex(); - - // STEP 10) - // Interpolate elevations, and flatten stuff - CalcElevations(); - - // STEP 11) - // Generate face_connected list - LookupFacesPerNode(); - - // STEP 12) - // Save the tile boundary info for stage 3 - // includes elevation info, and a list of connected triangles - SaveSharedEdgeData( 2 ); } void TGConstruct::ConstructBucketStage3() { - // First, set the precision of floating point logging: - SG_LOG(SG_GENERAL, SG_ALERT, std::setprecision(12) << std::fixed); - SG_LOG(SG_GENERAL, SG_ALERT, "\nConstructing tile ID " << bucket.gen_index_str() << " in " << bucket.gen_base_path() ); + if ( !IsOceanTile() ) { + // First, set the precision of floating point logging: + SG_LOG(SG_GENERAL, SG_ALERT, std::setprecision(12) << std::fixed); + SG_LOG(SG_GENERAL, SG_ALERT, "\nConstructing tile ID " << bucket.gen_index_str() << " in " << bucket.gen_base_path() ); - /* If we have some debug IDs, create a datasource */ - if ( debug_shapes.size() || debug_all ) { - sprintf(ds_name, "%s/constructdbg_%s", debug_path.c_str(), bucket.gen_index_str().c_str() ); - SG_LOG(SG_GENERAL, SG_ALERT, "Debug_string: " << ds_name ); - } else { - strcpy( ds_name, "" ); - } + /* If we have some debug IDs, create a datasource */ + if ( debug_shapes.size() || debug_all ) { + sprintf(ds_name, "%s/constructdbg_%s", debug_path.c_str(), bucket.gen_index_str().c_str() ); + SG_LOG(SG_GENERAL, SG_ALERT, "Debug_string: " << ds_name ); + } else { + strcpy( ds_name, "" ); + } - // Load in the neighbor faces and elevation data - LoadSharedEdgeDataStage2(); + // Load in the neighbor faces and elevation data + LoadSharedEdgeDataStage2(); - // STEP 12) - // Average out the elevation for nodes on tile boundaries - AverageEdgeElevations(); + // STEP 12) + // Average out the elevation for nodes on tile boundaries + AverageEdgeElevations(); - // STEP 12) - // Calculate Face Normals - CalcFaceNormals(); + // STEP 12) + // Calculate Face Normals + CalcFaceNormals(); - // STEP 13) - // Calculate Point Normals - CalcPointNormals(); + // STEP 13) + // Calculate Point Normals + CalcPointNormals(); #if 0 - if ( c.get_cover().size() > 0 ) { - // Now for all the remaining "default" land cover polygons, assign - // each one it's proper type from the land use/land cover - // database. - fix_land_cover_assignments( c ); - } + if ( c.get_cover().size() > 0 ) { + // Now for all the remaining "default" land cover polygons, assign + // each one it's proper type from the land use/land cover + // database. + fix_land_cover_assignments( c ); + } #endif - // STEP 14) - // Calculate Texture Coordinates - CalcTextureCoordinates(); + // STEP 14) + // Calculate Texture Coordinates + CalcTextureCoordinates(); - // STEP 16) - // Generate the btg file - WriteBtgFile(); + // STEP 16) + // Generate the btg file + WriteBtgFile(); - // STEP 17) - // Write Custom objects to .stg file - AddCustomObjects(); + // STEP 17) + // Write Custom objects to .stg file + AddCustomObjects(); + } } \ No newline at end of file diff --git a/src/BuildTiles/Main/tgconstruct.hxx b/src/BuildTiles/Main/tgconstruct.hxx index ff90dee5..960cb3e7 100644 --- a/src/BuildTiles/Main/tgconstruct.hxx +++ b/src/BuildTiles/Main/tgconstruct.hxx @@ -123,10 +123,17 @@ private: // All Nodes TGNodes nodes; + // ocean tile? + bool isOcean; + // Neighbor Faces neighbor_face_list neighbor_faces; private: + // Ocean tile or not + void SetOceanTile() { isOcean = true; } + bool IsOceanTile() { return isOcean; } + // Load Data void LoadElevationArray( void ); int LoadLandclassPolys( void ); diff --git a/src/BuildTiles/Main/tgconstruct_shared.cxx b/src/BuildTiles/Main/tgconstruct_shared.cxx index 99bf0395..fe327a7d 100644 --- a/src/BuildTiles/Main/tgconstruct_shared.cxx +++ b/src/BuildTiles/Main/tgconstruct_shared.cxx @@ -354,58 +354,63 @@ void TGConstruct::SaveToIntermediateFiles( int stage ) switch( stage ) { case 1: // Save the clipped polys and node list { - dir = share_base + "/stage1/" + bucket.gen_base_path(); + /* Only create the file this isn't an ocean tile */ + if ( !IsOceanTile() ) { + dir = share_base + "/stage1/" + bucket.gen_base_path(); - SGPath sgp( dir ); - sgp.append( "dummy" ); - sgp.create_dir( 0755 ); + SGPath sgp( dir ); + sgp.append( "dummy" ); + sgp.create_dir( 0755 ); - file = dir + "/" + bucket.gen_index_str() + "_clipped_polys"; - std::ofstream ofs_cp( file.c_str() ); + file = dir + "/" + bucket.gen_index_str() + "_clipped_polys"; + std::ofstream ofs_cp( file.c_str() ); - // first, set the precision - ofs_cp << std::setprecision(15); - ofs_cp << std::fixed; - ofs_cp << polys_clipped; - ofs_cp.close(); + // first, set the precision + ofs_cp << std::setprecision(15); + ofs_cp << std::fixed; + ofs_cp << polys_clipped; + ofs_cp.close(); + file = dir + "/" + bucket.gen_index_str() + "_nodes"; + std::ofstream ofs_n( file.c_str() ); - file = dir + "/" + bucket.gen_index_str() + "_nodes"; - std::ofstream ofs_n( file.c_str() ); + // first, set the precision + ofs_n << std::setprecision(15); + ofs_n << std::fixed; + ofs_n << nodes; + ofs_n.close(); + } - // first, set the precision - ofs_n << std::setprecision(15); - ofs_n << std::fixed; - ofs_n << nodes; - ofs_n.close(); break; } case 2: // Save the clipped polys and node list { - dir = share_base + "/stage2/" + bucket.gen_base_path(); + if ( !IsOceanTile() ) { + dir = share_base + "/stage2/" + bucket.gen_base_path(); - SGPath sgp( dir ); - sgp.append( "dummy" ); - sgp.create_dir( 0755 ); + SGPath sgp( dir ); + sgp.append( "dummy" ); + sgp.create_dir( 0755 ); - file = dir + "/" + bucket.gen_index_str() + "_clipped_polys"; - std::ofstream ofs_cp( file.c_str() ); + file = dir + "/" + bucket.gen_index_str() + "_clipped_polys"; + std::ofstream ofs_cp( file.c_str() ); - // first, set the precision - ofs_cp << std::setprecision(15); - ofs_cp << std::fixed; - ofs_cp << polys_clipped; - ofs_cp.close(); + // first, set the precision + ofs_cp << std::setprecision(15); + ofs_cp << std::fixed; + ofs_cp << polys_clipped; + ofs_cp.close(); - file = dir + "/" + bucket.gen_index_str() + "_nodes"; - std::ofstream ofs_n( file.c_str() ); + file = dir + "/" + bucket.gen_index_str() + "_nodes"; + std::ofstream ofs_n( file.c_str() ); - // first, set the precision - ofs_n << std::setprecision(15); - ofs_n << std::fixed; - ofs_n << nodes; - ofs_n.close(); + // first, set the precision + ofs_n << std::setprecision(15); + ofs_n << std::fixed; + ofs_n << nodes; + ofs_n.close(); + } break; } } @@ -512,6 +517,7 @@ void TGConstruct::LoadFromIntermediateFiles( int stage ) { string dir; string file; + bool read_ok = false; switch( stage ) { case 1: // Load the clipped polys and node list @@ -520,14 +526,21 @@ void TGConstruct::LoadFromIntermediateFiles( int stage ) file = dir + "/" + bucket.gen_index_str() + "_clipped_polys"; std::ifstream ifs_cp( file.c_str() ); - ifs_cp >> polys_clipped; - ifs_cp.close(); + if ( ifs_cp.good() ) { + ifs_cp >> polys_clipped; + ifs_cp.close(); - file = dir + "/" + bucket.gen_index_str() + "_nodes"; + file = dir + "/" + bucket.gen_index_str() + "_nodes"; + + std::ifstream ifs_n( file.c_str() ); + if ( ifs_n.good() ) { + ifs_n >> nodes; + ifs_n.close(); + + read_ok = true; + } + } - std::ifstream ifs_n( file.c_str() ); - ifs_n >> nodes; - ifs_n.close(); break; } @@ -537,15 +550,26 @@ void TGConstruct::LoadFromIntermediateFiles( int stage ) file = dir + "/" + bucket.gen_index_str() + "_clipped_polys"; std::ifstream ifs_cp( file.c_str() ); - ifs_cp >> polys_clipped; - ifs_cp.close(); + if ( ifs_cp.good() ) { + ifs_cp >> polys_clipped; + ifs_cp.close(); - file = dir + "/" + bucket.gen_index_str() + "_nodes"; + file = dir + "/" + bucket.gen_index_str() + "_nodes"; + + std::ifstream ifs_n( file.c_str() ); + if ( ifs_n.good() ) { + ifs_n >> nodes; + ifs_n.close(); + + read_ok = true; + } + } - std::ifstream ifs_n( file.c_str() ); - ifs_n >> nodes; - ifs_n.close(); break; } } + + if ( !read_ok ) { + SetOceanTile(); + } }