1
0
Fork 0

lights are much better, but not perfect

This commit is contained in:
PSadrozinski 2011-10-04 22:24:40 -04:00 committed by Christian Schmitt
parent 39ea640499
commit 81ec458cd7
2 changed files with 83 additions and 13 deletions

View file

@ -859,6 +859,8 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
// Now build the fitted airport surface ...
// calculation min/max coordinates of airport area
SG_LOG(SG_GENERAL, SG_DEBUG, " calculation min/max coordinates of airport area");
Point3D min_deg(9999.0, 9999.0, 0), max_deg(-9999.0, -9999.0, 0);
for ( j = 0; j < (int)nodes.get_node_list().size(); ++j )
{
@ -883,8 +885,13 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
// extend the min/max coordinates of airport area to cover all
// lights as well
SG_LOG(SG_GENERAL, SG_DEBUG, " extend the min/max coordinates of airport area to cover all lights as well : num rwy lights is " << rwy_lights.size() );
for ( i = 0; i < (int)rwy_lights.size(); ++i )
{
SG_LOG(SG_GENERAL, SG_DEBUG, " extend the min/max coordinates of airport area to cover all lights as well : rwy light " << i << "has " << rwy_lights[i].get_poly().get_contour(0).size() << " lights " );
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];
@ -907,6 +914,8 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
}
}
SG_LOG(SG_GENERAL, SG_DEBUG, " done " );
// Extend the area a bit so we don't have wierd things on the edges
double dlon = max_deg.lon() - min_deg.lon();
double dlat = max_deg.lat() - min_deg.lat();

View file

@ -452,6 +452,9 @@ int LinearFeature::Finish()
string material;
int mat_idx = 0;
double cur_light_dist = 0.0f;
double light_delta;
double intpart;
double pt_x, pt_y;
// create the inner and outer boundaries to generate polys
@ -639,31 +642,40 @@ int LinearFeature::Finish()
// now generate the supoerpoly list for lights with constant distance between lights (depending on feature type)
for (i=0; i<lights.size(); i++)
{
prev_outer = Point3D(0.0f, 0.0f, 0.0f);
cur_light_dist = 0.0f;
// which material for this light
switch( lights[i]->type )
{
case LF_BIDIR_GREEN:
material = "RWY_GREEN_TAXIWAY_LIGHTS";
light_delta = 10.0f;
break;
case LF_OMNIDIR_BLUE:
material = "RWY_BLUE_TAXIWAY_LIGHTS";
light_delta = 10.0f;
break;
case LF_UNIDIR_CLOSE_AMBER:
material = "RWY_YELLOW_LIGHTS";
light_delta = 4.0f;
break;
case LF_UNIDIR_CLOSE_AMBER_PULSE:
material = "RWY_YELLOW_LIGHTS";
light_delta = 4.0f;
break;
case LF_BIDIR_GREEN_AMBER:
material = "RWY_GREEN_TAXIWAY_LIGHTS";
light_delta = 10.0f;
break;
case LF_OMNIDIR_RED:
material = "RWY_RED_LIGHTS";
light_delta = 10.0f;
break;
}
@ -671,7 +683,6 @@ int LinearFeature::Finish()
normals_poly.erase();
sp.erase();
cur_light_dist = 0.0f;
for (j = lights[i]->start_idx; j <= lights[i]->end_idx; j++)
{
SG_LOG(SG_GENERAL, SG_DEBUG, "LinearFeature::Finish: calculating offsets for light " << i << " whose start idx is " << lights[i]->start_idx << " and end idx is " << lights[i]->end_idx << " cur idx is " << j );
@ -692,22 +703,72 @@ int LinearFeature::Finish()
cur_outer = OffsetPointMiddle( &points[j-1], &points[j], &points[j+1], offset );
}
poly.add_node(0, cur_outer);
if ( (prev_outer.x() != 0.0f) && (prev_outer.y() != 0.0f) )
{
Point3D tmp;
// calculate the normal
Point3D tmp = Point3D( cur_outer.x(), cur_outer.y(), 0.0 );
Point3D vec = sgGeodToCart( tmp * SG_DEGREES_TO_RADIANS );
double length = vec.distance3D( Point3D(0.0) );
vec = vec / length;
// calculate the heading and distance from prev to cur
geo_inverse_wgs_84( prev_outer.y(), prev_outer.x(), cur_outer.y(), cur_outer.x(), &heading, &az2, &dist);
if (cur_light_dist > dist)
{
// no lights in this segment - increment cur_light_dist only
cur_light_dist += dist;
}
else
{
while (cur_light_dist < dist)
{
if (cur_light_dist == 0.0f)
{
tmp = prev_outer;
}
else
{
// calculate the position of the next light
geo_direct_wgs_84( prev_outer.y(), prev_outer.x(), heading, cur_light_dist, &pt_y, &pt_x, &az2 );
tmp = Point3D( pt_x, pt_y, 0.0 );
}
poly.add_node(0, tmp);
normals_poly.add_node(0, vec );
// calculate the normal
Point3D vec = sgGeodToCart( tmp * SG_DEGREES_TO_RADIANS );
double length = vec.distance3D( Point3D(0.0) );
vec = vec / length;
normals_poly.add_node(0, vec );
// update current light distance
cur_light_dist += light_delta;
}
// add the remaining distance to the last light
// cur_light_dist += modf( dist, &intpart );
// remove
cur_light_dist = fmod (cur_light_dist, light_delta);
}
}
prev_outer = cur_outer;
}
sp.set_poly( poly );
sp.set_normals( normals_poly );
sp.set_material( material );
sp.set_flag("");
lighting_polys.push_back(sp);
// if there were lights generated - create the superpoly
if (poly.total_size())
{
SG_LOG(SG_GENERAL, SG_DEBUG, "\nLinearFeature::Finish: Adding superpoly with " << poly.total_size() << " lights" );
sp.set_poly( poly );
sp.set_normals( normals_poly );
sp.set_material( material );
sp.set_flag("");
lighting_polys.push_back(sp);
}
else
{
SG_LOG(SG_GENERAL, SG_DEBUG, "\nLinearFeature::Finish: No points for linear feature " << description << " light index " << i );
}
}
}