-// ======================
-// Determine scenery altitude via ssg.
-// returned results are in meters
-bool fgCurrentElev( sgdVec3 abs_view_pos, sgdVec3 scenery_center,
- ssgTransform *terra_transform,
- FGHitList *hit_list,
- double *terrain_elev, double *radius, double *normal)
-{
- sgdVec3 view_pos;
- sgdSubVec3( view_pos, abs_view_pos, scenery_center );
-
- sgdVec3 orig, dir;
- sgdCopyVec3(orig, view_pos );
-
- sgdCopyVec3(dir, abs_view_pos );
- sgdNormalizeVec3(dir);
-
- sgMat4 fxform;
- sgMakeIdentMat4 ( fxform ) ;
- ssgGetEntityTransform( terra_transform, fxform );
-
- sgdMat4 xform;
- sgdSetMat4(xform,fxform);
- hit_list->Intersect( terra_transform, xform, orig, dir );
-
- int this_hit=0;
- Point3D geoc;
- double result = -9999;
- Point3D sc(scenery_center[0], scenery_center[1], scenery_center[2]) ;
-
- int hitcount = hit_list->num_hits();
- for ( int i = 0; i < hitcount; ++i ) {
- geoc = sgCartToPolar3d( sc + hit_list->get_point(i) );
- double lat_geod, alt, sea_level_r;
- sgGeocToGeod(geoc.lat(), geoc.radius(), &lat_geod,
- &alt, &sea_level_r);
- if ( alt > result && alt < 20000 ) {
- result = alt;
- this_hit = i;
- }
- }
-
- if ( result > -9000 ) {
- *terrain_elev = result;
- *radius = geoc.radius();
- sgVec3 tmp;
- sgMat4 TMP;
- sgSetVec3(tmp, hit_list->get_normal(this_hit));
- sgTransposeNegateMat4 ( TMP, globals->get_current_view()->get_UP() ) ;
- sgXformVec3(tmp, tmp, TMP);
- sgdSetVec3( normal, tmp[2], tmp[1], tmp[0] );
- /* ssgState *IntersectedLeafState =
- ((ssgLeaf*)hit_list->get_entity(this_hit))->getState(); */
- return true;
- } else {
- SG_LOG( SG_TERRAIN, SG_DEBUG, "DOING FULL TERRAIN INTERSECTION" );
- return fgCurrentElev( abs_view_pos, scenery_center, hit_list,
- terrain_elev,radius,normal);
- }
+ if ( hit_elev > -9000 ) {
+ *terrain_elev = hit_elev;
+ *radius = geoc.radius();
+ sgVec3 tmp;
+ sgSetVec3(tmp, hit_list->get_normal(this_hit));
+ // cout << "cur_normal: " << tmp[0] << " " << tmp[1] << " " << tmp[2] << endl;
+ sgdSetVec3( normal, tmp );
+ // float *up = globals->get_current_view()->get_world_up();
+ // cout << "world_up : " << up[0] << " " << up[1] << " " << up[2] << endl;
+ /* ssgState *IntersectedLeafState =
+ ((ssgLeaf*)hit_list->get_entity(this_hit))->getState(); */
+ result = true;
+ } else {
+ SG_LOG( SG_TERRAIN, SG_DEBUG, "DOING FULL TERRAIN INTERSECTION" );
+ result = fgCurrentElev( abs_view_pos, max_alt_m, scenery_center,
+ hit_list, terrain_elev, radius, normal);
+ }
+
+ // SGTimeStamp finish; finish.stamp();
+ // hitlist2_time = ( 29.0 * hitlist2_time + (finish - start) ) / 30.0;
+ // cout << "time per call 2 = " << hitlist2_time << endl;
+
+ return result;