1
0
Fork 0

Tweaks to my ssg LOS routines and their usage.

This commit is contained in:
curt 1999-11-04 00:41:23 +00:00
parent 1d6675a895
commit 846ac621a2
3 changed files with 59 additions and 15 deletions

View file

@ -123,7 +123,7 @@ bool fgInitConfig ( int argc, char **argv ) {
return false; return false;
} }
return true; return true;
} }

View file

@ -409,7 +409,7 @@ static bool my_ssg_instersect_leaf( string s, ssgLeaf *leaf, sgMat4 m,
int side1, side2; int side1, side2;
short i1, i2, i3; short i1, i2, i3;
cout << s << "Intersecting" << endl; // cout << s << "Intersecting" << endl;
// traverse the triangle list for this leaf // traverse the triangle list for this leaf
for ( int i = 0; i < leaf->getNumTriangles(); ++i ) { for ( int i = 0; i < leaf->getNumTriangles(); ++i ) {
@ -649,7 +649,7 @@ void FGTileMgr::my_ssg_los( string s, ssgBranch *branch, sgMat4 m,
sgXformPnt3( center, m ) ; sgXformPnt3( center, m ) ;
// cout << s << "entity bounding sphere:" << endl; // cout << s << "entity bounding sphere:" << endl;
// cout << s << "center = " << center[0] << " " // cout << s << "center = " << center[0] << " "
// << center[1] << " " << center[2] << endl; // << center[1] << " " << center[2] << endl;
// cout << s << "radius = " << bsphere->getRadius() << endl; // cout << s << "radius = " << bsphere->getRadius() << endl;
double radius_sqd = bsphere->getRadius() * bsphere->getRadius(); double radius_sqd = bsphere->getRadius() * bsphere->getRadius();
if ( sgPointLineDistSquared( center, p, dir ) < radius_sqd ) { if ( sgPointLineDistSquared( center, p, dir ) < radius_sqd ) {
@ -667,10 +667,12 @@ void FGTileMgr::my_ssg_los( string s, ssgBranch *branch, sgMat4 m,
sgVec3 result; sgVec3 result;
if ( my_ssg_instersect_leaf( s, (ssgLeaf *)kid, m, p, dir, if ( my_ssg_instersect_leaf( s, (ssgLeaf *)kid, m, p, dir,
result ) ) result ) )
{ {
cout << "sgLOS hit: " << result[0] << "," cout << "sgLOS hit: " << result[0] << ","
<< result[1] << "," << result[2] << endl; << result[1] << "," << result[2] << endl;
} hit_pts[hitcount] = result;
hitcount++;
}
} }
} else { } else {
// end of the line for this branch // end of the line for this branch
@ -700,9 +702,38 @@ FGTileMgr::current_elev_ssg( const Point3D& abs_view_pos,
sgSetVec3(sgavp, abs_view_pos.x(), abs_view_pos.y(), abs_view_pos.z() ); sgSetVec3(sgavp, abs_view_pos.x(), abs_view_pos.y(), abs_view_pos.z() );
sgSetVec3(sgvp, view_pos.x(), view_pos.y(), view_pos.z() ); sgSetVec3(sgvp, view_pos.x(), view_pos.y(), view_pos.z() );
cout << "starting ssg_los, abs view pos = " << abs_view_pos[0] << " "
<< abs_view_pos[1] << " " << abs_view_pos[2] << endl;
cout << "starting ssg_los, view pos = " << view_pos[0] << " " cout << "starting ssg_los, view pos = " << view_pos[0] << " "
<< view_pos[1] << " " << view_pos[2] << endl; << view_pos[1] << " " << view_pos[2] << endl;
my_ssg_los( "", scene, m, sgvp, sgavp ); my_ssg_los( "", scene, m, sgvp, sgavp );
double result = -9999;
for ( int i = 0; i < hitcount; ++i ) {
Point3D rel_cart( hit_pts[i][0], hit_pts[i][1], hit_pts[i][2] );
Point3D abs_cart = rel_cart + scenery.center;
Point3D pp = fgCartToPolar3d( abs_cart );
FG_LOG( FG_TERRAIN, FG_INFO, " polar form = " << pp );
// convert to geodetic coordinates
double lat_geod, alt, sea_level_r;
fgGeocToGeod(pp.lat(), pp.radius(), &lat_geod,
&alt, &sea_level_r);
// printf("alt = %.2f\n", alt);
// exit since we found an intersection
if ( alt > result && alt < 10000 ) {
// printf("returning alt\n");
result = alt;
}
}
if ( result > -9000 ) {
return result;
} else {
FG_LOG( FG_TERRAIN, FG_INFO, "no terrain intersection" );
return 0.0;
}
} }
@ -757,6 +788,18 @@ int FGTileMgr::update( void ) {
0, 0 ); 0, 0 );
sched_tile( p2 ); sched_tile( p2 );
// prime scenery center calculations
Point3D geod_center( p2.get_center_lon() * RAD_TO_DEG,
p2.get_center_lat() * RAD_TO_DEG, 0.0 );
scenery.center = scenery.next_center = fgGeodToCart( geod_center );
Point3D geod_view_center( p2.get_center_lon() * RAD_TO_DEG,
p2.get_center_lat() * RAD_TO_DEG,
cur_fdm_state->get_Altitude()*FEET_TO_METER +
3 );
current_view.abs_view_pos = fgGeodToCart( geod_view_center );
current_view.view_pos = current_view.abs_view_pos - scenery.center;
for ( i = 3; i <= tile_diameter; i = i + 2 ) { for ( i = 3; i <= tile_diameter; i = i + 2 ) {
int span = i / 2; int span = i / 2;
@ -896,12 +939,13 @@ int FGTileMgr::update( void ) {
Point3D geod_pos = Point3D( f->get_Longitude(), f->get_Latitude(), 0.0); Point3D geod_pos = Point3D( f->get_Longitude(), f->get_Latitude(), 0.0);
Point3D tmp_abs_view_pos = fgGeodToCart(geod_pos); Point3D tmp_abs_view_pos = fgGeodToCart(geod_pos);
scenery.cur_elev = cout << "current elevation (old) == "
current_elev( f->get_Longitude(), f->get_Latitude(), tmp_abs_view_pos ); << current_elev( f->get_Longitude(), f->get_Latitude(),
cout << "current elevation == " << scenery.cur_elev << endl; tmp_abs_view_pos )
double junk = current_elev_ssg( current_view.abs_view_pos, << endl;
current_view.view_pos ); scenery.cur_elev = current_elev_ssg( current_view.abs_view_pos,
cout << "current elevation (ssg) == " << junk << endl; current_view.view_pos );
cout << "current elevation (ssg) == " << scenery.cur_elev << endl;
p_last = p1; p_last = p1;
last_lon = f->get_Longitude() * RAD_TO_DEG; last_lon = f->get_Longitude() * RAD_TO_DEG;

View file

@ -85,7 +85,7 @@ private:
void load_tile( const FGBucket& b, int cache_index ); void load_tile( const FGBucket& b, int cache_index );
int hitcount; int hitcount;
ssgHit hitlist [ MAX_HITS ] ; sgVec3 hit_pts [ MAX_HITS ] ;
public: public: