infrastructure for lights
This commit is contained in:
parent
5e1ed20e4d
commit
6f7df8da5e
9 changed files with 128 additions and 98 deletions
|
@ -353,63 +353,58 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
SGBucket b( apt_lon, apt_lat );
|
||||
SG_LOG(SG_GENERAL, SG_INFO, b.gen_base_path() << "/" << b.gen_index_str());
|
||||
|
||||
// Build precision runways first
|
||||
for (i=0; i<runways.size(); i++ )
|
||||
{
|
||||
if ( runways[i]->IsPrecision() )
|
||||
{
|
||||
runways[i]->BuildBtg( altitude, &rwy_polys, &rwy_tps, &accum, &apt_base, &apt_clearing );
|
||||
}
|
||||
}
|
||||
|
||||
// Now generate pavements, and gather the linear features and lights from them
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Features before pavement add " << features.size() );
|
||||
superpoly_list rwy_lights;
|
||||
rwy_lights.clear();
|
||||
|
||||
// If we are cutting in the linear features, add them first
|
||||
if (pavements.size())
|
||||
{
|
||||
for ( i=0; i<pavements.size(); i++ )
|
||||
{
|
||||
AddFeatures( pavements[i]->GetMarkings() );
|
||||
AddFeatures( pavements[i]->GetFeatures() );
|
||||
}
|
||||
}
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Features after pavement add " << features.size() );
|
||||
|
||||
// Then the linear features
|
||||
// Add the linear features
|
||||
if (features.size())
|
||||
{
|
||||
for ( i=0; i<features.size(); i++ )
|
||||
{
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Build feature Poly " << i << ": " << features[i]->GetDescription() );
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Build Feature Poly " << i << ": " << features[i]->GetDescription() );
|
||||
|
||||
// cut the linear feature in until we get the geometry right...
|
||||
// features[i]->BuildBtg( altitude, &line_polys, &line_tps, &line_accum );
|
||||
features[i]->BuildBtg( altitude, &pvmt_polys, &pvmt_tps, &accum );
|
||||
features[i]->BuildBtg( altitude, &pvmt_polys, &pvmt_tps, &accum, &rwy_lights );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "no pavements");
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "no markings");
|
||||
}
|
||||
// wipe out the pavements to save memory
|
||||
features.clear();
|
||||
|
||||
// Now generate pavements, and gather the linear features and lights from them
|
||||
// Build runways next
|
||||
for (i=0; i<runways.size(); i++ )
|
||||
{
|
||||
if ( runways[i]->IsPrecision() )
|
||||
{
|
||||
runways[i]->BuildBtg( altitude, &rwy_polys, &rwy_tps, &rwy_lights, &accum, &apt_base, &apt_clearing );
|
||||
}
|
||||
}
|
||||
|
||||
// Build the pavements
|
||||
if (pavements.size())
|
||||
{
|
||||
for ( i=0; i<pavements.size(); i++ )
|
||||
{
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Build Pavement Poly " << i << ": " << pavements[i]->GetDescription());
|
||||
pavements[i]->BuildBtg( altitude, &pvmt_polys, &pvmt_tps, &accum, &apt_base, &apt_clearing );
|
||||
AddFeatures( pavements[i]->GetMarkings() );
|
||||
// AddFeatures( pavements[i]->GetMarkings() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "no pavements");
|
||||
}
|
||||
// wipe out the pavements to save memory
|
||||
pavements.clear();
|
||||
|
||||
if ( apt_base.total_size() == 0 )
|
||||
{
|
||||
|
@ -894,14 +889,11 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
// extend the min/max coordinates of airport area to cover all
|
||||
// lights as well
|
||||
for ( i = 0; i < (int)rwy_lights.size(); ++i )
|
||||
{
|
||||
for ( j = 0;
|
||||
j < (int)rwy_lights[i].get_poly().get_contour(0).size();
|
||||
++j )
|
||||
for ( j = 0; j < (int)rwy_lights[i].get_poly().get_contour(0).size(); ++j )
|
||||
{
|
||||
Point3D p = rwy_lights[i].get_poly().get_contour(0)[j];
|
||||
if ( p.lon() < min_deg.lon() )
|
||||
|
@ -922,7 +914,6 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// need newmat....
|
||||
|
||||
|
@ -1070,11 +1061,9 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
strips_tc.push_back( base_tc );
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
// add light points
|
||||
|
||||
superpoly_list tmp_light_list; tmp_light_list.clear();
|
||||
superpoly_list tmp_light_list;
|
||||
tmp_light_list.clear();
|
||||
typedef map < string, double, less<string> > elev_map_type;
|
||||
typedef elev_map_type::const_iterator const_elev_map_iterator;
|
||||
elev_map_type elevation_map;
|
||||
|
@ -1082,7 +1071,6 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
SG_LOG(SG_GENERAL, SG_INFO, "Computing runway/approach lighting elevations");
|
||||
|
||||
// pass one, calculate raw elevations from Array
|
||||
|
||||
for ( i = 0; i < (int)rwy_lights.size(); ++i )
|
||||
{
|
||||
TGTriNodes light_nodes;
|
||||
|
@ -1095,7 +1083,6 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
}
|
||||
|
||||
// calculate light node elevations
|
||||
|
||||
point_list geod_light_nodes = calc_elevations( apt_surf, light_nodes.get_node_list(), 0.5 );
|
||||
TGPolygon p;
|
||||
p.add_contour( geod_light_nodes, 0 );
|
||||
|
@ -1155,7 +1142,6 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
pts_n.push_back( pt_n );
|
||||
pt_materials.push_back( rwy_lights[i].get_material() );
|
||||
}
|
||||
#endif
|
||||
|
||||
// calculate wgs84 mapping of nodes
|
||||
std::vector< SGVec3d > wgs84_nodes;
|
||||
|
|
|
@ -31,7 +31,7 @@ ClosedPoly::ClosedPoly( int st, float s, float th, char* desc )
|
|||
|
||||
boundary = NULL;
|
||||
cur_contour = NULL;
|
||||
cur_marking = NULL;
|
||||
cur_feature = NULL;
|
||||
}
|
||||
|
||||
void ClosedPoly::AddNode( BezNode* node )
|
||||
|
@ -52,22 +52,22 @@ void ClosedPoly::AddNode( BezNode* node )
|
|||
// if recording a linear feature on the pavement, add this node
|
||||
// to it as well
|
||||
// TODO: just doing marking now, need lighting as well
|
||||
if (!cur_marking)
|
||||
if (!cur_feature)
|
||||
{
|
||||
string marking_desc = description + ":";
|
||||
string feature_desc = description + ":";
|
||||
if (boundary)
|
||||
{
|
||||
marking_desc += "hole";
|
||||
feature_desc += "hole";
|
||||
}
|
||||
else
|
||||
{
|
||||
marking_desc += "boundary";
|
||||
feature_desc += "boundary";
|
||||
}
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, " Adding node (" << node->GetLoc().x() << "," << node->GetLoc().y() << ") to current linear feature " << cur_marking);
|
||||
cur_marking = new LinearFeature(marking_desc, 1.0f );
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, " Adding node (" << node->GetLoc().x() << "," << node->GetLoc().y() << ") to current linear feature " << cur_feature);
|
||||
cur_feature = new LinearFeature(feature_desc, 1.0f );
|
||||
}
|
||||
cur_marking->AddNode( node );
|
||||
cur_feature->AddNode( node );
|
||||
}
|
||||
|
||||
void ClosedPoly::CreateConvexHull( void )
|
||||
|
@ -93,14 +93,13 @@ int ClosedPoly::CloseCurContour()
|
|||
|
||||
// if we are recording a pavement marking - it must be closed -
|
||||
// add the first node of the poly
|
||||
if (cur_marking)
|
||||
if (cur_feature)
|
||||
{
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "We still have an active linear feature - add the first node to close it");
|
||||
// cur_marking->Close();
|
||||
cur_marking->Finish();
|
||||
cur_feature->Finish();
|
||||
|
||||
markings.push_back(cur_marking);
|
||||
cur_marking = NULL;
|
||||
features.push_back(cur_feature);
|
||||
cur_feature = NULL;
|
||||
}
|
||||
|
||||
// add the contour to the poly - first one is the outer boundary
|
||||
|
@ -596,7 +595,7 @@ int ClosedPoly::BuildBtg( float alt_m, superpoly_list* rwy_polys, texparams_list
|
|||
break;
|
||||
|
||||
default:
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "ClosedPoly::BuildBtg: unknown material " << surface_type );
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "ClosedPoly::BuildBtg: unknown surface type " << surface_type );
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,9 +27,9 @@ public:
|
|||
int BuildOsg( osg::Group* airport );
|
||||
int BuildBtg( float alt_m, superpoly_list* rwy_polys, texparams_list* texparams, TGPolygon* accum, TGPolygon* apt_base, TGPolygon* apt_clearing );
|
||||
|
||||
FeatureList* GetMarkings()
|
||||
FeatureList* GetFeatures()
|
||||
{
|
||||
return &markings;
|
||||
return &features;
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -61,8 +61,8 @@ private:
|
|||
TGPolygon pre_tess;
|
||||
|
||||
// pavement definitions have multiple linear features (markings and lights for each contour)
|
||||
LinearFeature* cur_marking;
|
||||
FeatureList markings;
|
||||
LinearFeature* cur_feature;
|
||||
FeatureList features;
|
||||
};
|
||||
|
||||
typedef std::vector <ClosedPoly *> PavementList;
|
||||
|
|
|
@ -405,10 +405,10 @@ int LinearFeature::Finish()
|
|||
|
||||
// create the inner and outer boundaries to generate polys
|
||||
// this generates 2 point lists for the contours, and remembers
|
||||
// the start stop points for markings
|
||||
// the start stop points for markings and lights
|
||||
ConvertContour( &contour );
|
||||
|
||||
// now generate the supoerpoly and texparams list
|
||||
// now generate the supoerpoly and texparams lists for markings
|
||||
for (i=0; i<marks.size(); i++)
|
||||
{
|
||||
prev_inner = Point3D(0.0f, 0.0f, 0.0f);
|
||||
|
@ -525,17 +525,8 @@ int LinearFeature::Finish()
|
|||
width = 0.25f;
|
||||
break;
|
||||
|
||||
case 101:
|
||||
case 102:
|
||||
case 103:
|
||||
case 104:
|
||||
case 105:
|
||||
case 106:
|
||||
// don't generate lights yet...
|
||||
break;
|
||||
|
||||
default:
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "ClosedPoly::BuildBtg: unknown material " << marks[i]->type );
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "LinearFeature::Finish: unknown marking " << marks[i]->type );
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
@ -580,11 +571,11 @@ int LinearFeature::Finish()
|
|||
sp.set_poly( poly );
|
||||
sp.set_material( material );
|
||||
sp.set_flag("lf");
|
||||
feature_polys.push_back(sp);
|
||||
marking_polys.push_back(sp);
|
||||
|
||||
tp = TGTexParams( prev_inner, width, 1.0f, heading );
|
||||
tp.set_minv(last_end_v);
|
||||
feature_tps.push_back(tp);
|
||||
marking_tps.push_back(tp);
|
||||
|
||||
last_end_v = 1.0f - (fmod( (dist - last_end_v), 1.0f ));
|
||||
}
|
||||
|
@ -593,18 +584,44 @@ int LinearFeature::Finish()
|
|||
prev_inner = cur_inner;
|
||||
}
|
||||
}
|
||||
|
||||
// now generate the supoerpoly list for lights
|
||||
for (i=0; i<lights.size(); i++)
|
||||
{
|
||||
// which material for this light
|
||||
switch( lights[i]->type )
|
||||
{
|
||||
case LF_BIDIR_GREEN:
|
||||
break;
|
||||
|
||||
case LF_OMNIDIR_BLUE:
|
||||
break;
|
||||
|
||||
case LF_UNIDIR_CLOSE_AMBER:
|
||||
break;
|
||||
|
||||
case LF_UNIDIR_CLOSE_AMBER_PULSE:
|
||||
break;
|
||||
|
||||
case LF_BIDIR_GREEN_AMBER:
|
||||
break;
|
||||
|
||||
case LF_OMNIDIR_RED:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int LinearFeature::BuildBtg(float alt_m, superpoly_list* line_polys, texparams_list* line_tps, TGPolygon* line_accum )
|
||||
int LinearFeature::BuildBtg(float alt_m, superpoly_list* line_polys, texparams_list* line_tps, TGPolygon* line_accum, superpoly_list* lights )
|
||||
{
|
||||
TGPolygon poly;
|
||||
TGPolygon clipped;
|
||||
TGPolygon split;
|
||||
int i;
|
||||
|
||||
for (i=0; i<feature_polys.size(); i++)
|
||||
for (i=0; i<marking_polys.size(); i++)
|
||||
{
|
||||
poly = feature_polys[i].get_poly();
|
||||
poly = marking_polys[i].get_poly();
|
||||
clipped = tgPolygonDiff( poly, *line_accum );
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "BuildBtg: clipped poly has " << clipped.contours() << " contours");
|
||||
|
@ -612,11 +629,11 @@ int LinearFeature::BuildBtg(float alt_m, superpoly_list* line_polys, texparams_l
|
|||
TGPolygon split = tgPolygonSplitLongEdges( clipped, 400.0 );
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "BuildBtg: split poly has " << split.contours() << " contours");
|
||||
|
||||
feature_polys[i].set_poly( split );
|
||||
line_polys->push_back( feature_polys[i] );
|
||||
marking_polys[i].set_poly( split );
|
||||
line_polys->push_back( marking_polys[i] );
|
||||
|
||||
*line_accum = tgPolygonUnion( poly, *line_accum );
|
||||
line_tps->push_back( feature_tps[i] );
|
||||
line_tps->push_back( marking_tps[i] );
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -53,6 +53,14 @@ public:
|
|||
};
|
||||
typedef std::vector <Marking*> MarkingList;
|
||||
|
||||
struct Lighting
|
||||
{
|
||||
public:
|
||||
int type;
|
||||
int start_idx;
|
||||
int end_idx;
|
||||
};
|
||||
typedef std::vector <Lighting*> LightingList;
|
||||
|
||||
class LinearFeature
|
||||
{
|
||||
|
@ -85,7 +93,7 @@ public:
|
|||
|
||||
int Finish();
|
||||
int BuildOsg( osg::Group* airport );
|
||||
int BuildBtg( float alt_m, superpoly_list* line_polys, texparams_list* line_tps, TGPolygon* line_accum );
|
||||
int BuildBtg( float alt_m, superpoly_list* line_polys, texparams_list* line_tps, TGPolygon* line_accum, superpoly_list* lights );
|
||||
|
||||
private:
|
||||
Point3D OffsetPointFirst( Point3D *cur, Point3D *next, double offset_by );
|
||||
|
@ -94,8 +102,12 @@ private:
|
|||
|
||||
double offset;
|
||||
double width;
|
||||
MarkingList marks;
|
||||
Marking* cur_mark;
|
||||
|
||||
MarkingList marks;
|
||||
Marking* cur_mark;
|
||||
|
||||
LightingList lights;
|
||||
Lighting* cur_light;
|
||||
|
||||
void ConvertContour( BezContour* src );
|
||||
|
||||
|
@ -108,8 +120,10 @@ private:
|
|||
// contour definition after bezier interpolation
|
||||
point_list points;
|
||||
|
||||
superpoly_list feature_polys;
|
||||
texparams_list feature_tps;
|
||||
superpoly_list marking_polys;
|
||||
texparams_list marking_tps;
|
||||
|
||||
superpoly_list lighting_polys;
|
||||
};
|
||||
|
||||
typedef std::vector <LinearFeature *> FeatureList;
|
||||
|
|
|
@ -293,7 +293,7 @@ int main(int argc, char **argv)
|
|||
Parser* parser = new Parser(input_file);
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Parse katl");
|
||||
parser->Parse((char*)"katl");
|
||||
parser->Parse((char*)"edfe");
|
||||
|
||||
if (view_osg)
|
||||
{
|
||||
|
|
|
@ -38,14 +38,14 @@ BezNode* Parser::ParseNode( int type, char* line, BezNode* prevNode )
|
|||
{
|
||||
double lat, lon;
|
||||
double ctrl_lat, ctrl_lon;
|
||||
int mark_type, light_type;
|
||||
int feat_type1, feat_type2;
|
||||
BezNode *curNode = NULL;
|
||||
|
||||
bool hasCtrl;
|
||||
bool close;
|
||||
bool term;
|
||||
bool hasMarking = false;
|
||||
bool hasLighting = false;
|
||||
bool hasFeat1 = false;
|
||||
bool hasFeat2 = false;
|
||||
int numParams;
|
||||
|
||||
switch(type)
|
||||
|
@ -90,26 +90,26 @@ BezNode* Parser::ParseNode( int type, char* line, BezNode* prevNode )
|
|||
// parse the line
|
||||
if (hasCtrl)
|
||||
{
|
||||
numParams = sscanf(line, "%lf %lf %lf %lf %d %d", &lat, &lon, &ctrl_lat, &ctrl_lon, &mark_type, &light_type);
|
||||
numParams = sscanf(line, "%lf %lf %lf %lf %d %d", &lat, &lon, &ctrl_lat, &ctrl_lon, &feat_type1, &feat_type2);
|
||||
if (numParams > 4)
|
||||
{
|
||||
hasMarking = true;
|
||||
hasFeat1 = true;
|
||||
}
|
||||
if (numParams > 5)
|
||||
{
|
||||
hasLighting = true;
|
||||
hasFeat2 = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
numParams = sscanf(line, "%lf %lf %d %d", &lat, &lon, &mark_type, &light_type);
|
||||
numParams = sscanf(line, "%lf %lf %d %d", &lat, &lon, &feat_type1, &feat_type2);
|
||||
if (numParams > 2)
|
||||
{
|
||||
hasMarking = true;
|
||||
hasFeat1 = true;
|
||||
}
|
||||
if (numParams > 3)
|
||||
{
|
||||
hasLighting = true;
|
||||
hasFeat2 = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,14 +143,28 @@ BezNode* Parser::ParseNode( int type, char* line, BezNode* prevNode )
|
|||
}
|
||||
}
|
||||
|
||||
if (hasMarking)
|
||||
if (hasFeat1)
|
||||
{
|
||||
curNode->SetMarking( mark_type );
|
||||
if (feat_type1 < 100)
|
||||
{
|
||||
curNode->SetMarking( feat_type1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
curNode->SetLighting( feat_type1 );
|
||||
}
|
||||
}
|
||||
|
||||
if (hasLighting)
|
||||
if (hasFeat2)
|
||||
{
|
||||
curNode->SetLighting( light_type );
|
||||
if (feat_type2 < 100)
|
||||
{
|
||||
curNode->SetMarking( feat_type2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
curNode->SetLighting( feat_type2 );
|
||||
}
|
||||
}
|
||||
|
||||
return curNode;
|
||||
|
|
|
@ -370,7 +370,7 @@ void Runway::gen_marked_rwy( double alt_m, const string& material, superpoly_lis
|
|||
}
|
||||
#endif
|
||||
|
||||
int Runway::BuildBtg( float alt_m, superpoly_list* rwy_polys, texparams_list* texparams, TGPolygon* accum, TGPolygon* apt_base, TGPolygon* apt_clearing )
|
||||
int Runway::BuildBtg( float alt_m, superpoly_list* rwy_polys, texparams_list* texparams, superpoly_list* rwy_lights, TGPolygon* accum, TGPolygon* apt_base, TGPolygon* apt_clearing )
|
||||
{
|
||||
TGPolygon base, safe_base;
|
||||
string material;
|
||||
|
|
|
@ -69,7 +69,7 @@ TGRunway rwy;
|
|||
}
|
||||
|
||||
int BuildOsg( osg::Group* airport );
|
||||
int BuildBtg( float alt_m, superpoly_list* rwy_polys, texparams_list* texparams, TGPolygon* accum, TGPolygon* apt_base, TGPolygon* apt_clearing );
|
||||
int BuildBtg( float alt_m, superpoly_list* rwy_polys, texparams_list* texparams, superpoly_list* rwy_lights, TGPolygon* accum, TGPolygon* apt_base, TGPolygon* apt_clearing );
|
||||
|
||||
private:
|
||||
|
||||
|
|
Loading…
Reference in a new issue