]> git.mxchange.org Git - flightgear.git/blobdiff - src/Scenery/hitlist.cxx
Added static port system and a new altimeter model connected to it.
[flightgear.git] / src / Scenery / hitlist.cxx
index 4762cf8bcb9df1ca0fe6a08a4e94cb54beaad68c..856b175a2184cafee67cf1ad480b38a53cb6fb44 100644 (file)
 
 #include <Main/globals.hxx>
 #include <Main/viewer.hxx>
+#include <Scenery/scenery.hxx>
 
 #include "hitlist.hxx"
 
-extern ssgBranch *terrain_branch;
-
 // forward declaration of our helper/convenience functions
 static void sgMultMat4(sgdMat4 dst, sgdMat4 m1, sgMat4 m2);
 static void ssgGetEntityTransform(ssgEntity *entity, sgMat4 m );
@@ -214,6 +213,7 @@ int FGHitList::IntersectLeaf( ssgLeaf *leaf, sgdMat4 m,
             if( fgdPointInTriangle( point, tri ) ) {
                 // transform point into passed into desired coordinate frame
                 sgdXformPnt3( point, point, m );
+               sgdXformPnt4(plane,plane,m);
                 add(leaf,i,point,plane);
                 num_hits++;
             }
@@ -292,7 +292,7 @@ int FGHitList::IntersectLeaf( ssgLeaf *leaf, sgdMat4 m,
         sgdVec4 plane;
         sgdMakePlane( plane, tri[0], tri[1], tri[2] );
 
-        sgdVec3 point, test;
+        sgdVec3 point;
 
         // find point of intersection of line from point org
         // in direction dir with triangle's plane
@@ -317,6 +317,7 @@ int FGHitList::IntersectLeaf( ssgLeaf *leaf, sgdMat4 m,
         if( fgdPointInTriangle( point, tri ) ) {
             // transform point into passed coordinate frame
             sgdXformPnt3( point, point, m );
+           sgdXformPnt4(plane,plane,m);
             add(leaf,n,point,plane);
             test_dist = tmp_dist;
             num_hits++;
@@ -499,61 +500,58 @@ static void ssgGetCurrentBSphere( ssgEntity *entity, sgVec3 center, float *radiu
 // Determine scenery altitude via ssg.
 // returned results are in meters
 bool fgCurrentElev( sgdVec3 abs_view_pos, sgdVec3 scenery_center,
-                                       FGHitList *hit_list,
-                                       double *terrain_elev, double *radius, double *normal)
+                    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 );
-
-       // !! why is terrain not globals->get_terrain()
-       hit_list->Intersect( terrain_branch, orig, dir );
-
-       int this_hit=0;
-       Point3D geoc;
-       double result = -9999;
-       Point3D sc(scenery_center[0], scenery_center[1], scenery_center[2]) ;
-
-       // cout << "hits = ";
-       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);
-               // cout << alt << " ";
-               if ( alt > result && alt < 10000 ) {
-                       result = alt;
-                       this_hit = i;
-               }
-       }
-       // cout << endl;
-
-       if ( result > -9000 ) {
-               *terrain_elev = result;
-               *radius = geoc.radius();
-               sgVec3 tmp;
-               sgMat4 TMP;
-               sgSetVec3(tmp, hit_list->get_normal(this_hit));
-               // cout << "cur_normal: " << tmp[0] << " " << tmp[1] << " "
-               //      << tmp[2] << endl;
-               sgTransposeNegateMat4 ( TMP, globals->get_current_view()->get_UP() ) ;
-               sgXformVec3(tmp, tmp, TMP);
-               // cout << "NED: " << tmp[0] << " " << tmp[1] << " " << tmp[2] << endl;
-               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_INFO, "no terrain intersection" );
-               *terrain_elev = 0.0;
-               float *up = globals->get_current_view()->get_world_up();
-               sgdSetVec3(normal, up[0], up[1], up[2]);
-               return false;
-       }
+    sgdVec3 view_pos;
+    sgdSubVec3( view_pos, abs_view_pos, scenery_center );
+
+    sgdVec3 orig, dir;
+    sgdCopyVec3(orig, view_pos );
+    sgdCopyVec3(dir, abs_view_pos );
+
+    hit_list->Intersect( globals->get_scenery()->get_terrain_branch(),
+                         orig, dir );
+
+    int this_hit=0;
+    Point3D geoc;
+    double result = -9999;
+    Point3D sc(scenery_center[0], scenery_center[1], scenery_center[2]) ;
+
+    // cout << "hits = ";
+    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);
+        // cout << alt << " ";
+        if ( alt > result && alt < 10000 ) {
+            result = alt;
+            this_hit = i;
+        }
+    }
+    // cout << endl;
+
+    if ( result > -9000 ) {
+        *terrain_elev = result;
+        *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(); */
+        return true;
+    } else {
+        SG_LOG( SG_TERRAIN, SG_INFO, "no terrain intersection" );
+        *terrain_elev = 0.0;
+        float *up = globals->get_current_view()->get_world_up();
+        sgdSetVec3(normal, up[0], up[1], up[2]);
+        return false;
+    }
 }
 
 
@@ -561,60 +559,60 @@ bool fgCurrentElev( sgdVec3 abs_view_pos, sgdVec3 scenery_center,
 // 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)
+                    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);
-       }
+    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;
+        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(); */
+        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);
+    }
 }