#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 );
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++;
}
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
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++;
kid != NULL;
kid = branch->getNextKid() )
{
- if ( kid->getTraversalMask() & SSGTRAV_HOT )
+ if ( kid->getTraversalMask() & SSGTRAV_HOT
+ && !kid->getBSphere()->isEmpty() )
{
sgdVec3 center;
sgdSetVec3( center,
// 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;
+ }
}
// 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);
+ }
}