X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Fhitlist.hxx;h=df54ef26a6abbe4ff6c016a089537774893a09d9;hb=048da049f87fe3f543795f3b1b511d774caa2787;hp=3a4da70a14bd3b8620c0253311042a56977440a1;hpb=bb61414e04c908b7209566527ebf409821188f8d;p=flightgear.git diff --git a/src/Scenery/hitlist.hxx b/src/Scenery/hitlist.hxx index 3a4da70a1..df54ef26a 100644 --- a/src/Scenery/hitlist.hxx +++ b/src/Scenery/hitlist.hxx @@ -1,3 +1,7 @@ +// hitlist.hxx +// Height Over Terrain and Assosciated Routines for FlightGear based Scenery +// Written by Norman Vine, started 2000. + #ifndef _HITLIST_HXX #define _HITLIST_HXX @@ -11,8 +15,7 @@ #include -FG_USING_STD(vector); - +SG_USING_STD(vector); class FGHitRec { @@ -25,10 +28,10 @@ private: public: FGHitRec( ssgEntity *e, int idx, sgdVec3 p, sgdVec3 n ) { - ent = e; - index = idx; - sgdSetVec3(point,p[0],p[1],p[2]); - sgdSetVec3(normal,n[0],n[1],n[2]); + ent = e; + index = idx; + sgdSetVec3(point,p[0],p[1],p[2]); + sgdSetVec3(normal,n[0],n[1],n[2]); } ssgEntity *get_entity(void) { return ent; } @@ -44,15 +47,18 @@ private: ssgEntity *last; vector < FGHitRec > list; + double test_dist; public: - FGHitList() { last = NULL; } - void init(void) { list.clear(); } + FGHitList(); + ~FGHitList(); + + void init(void) { list.clear(); test_dist=DBL_MAX; } void clear(void) { init(); last = NULL; } void add( ssgEntity *ent, int idx, sgdVec3 point, sgdVec3 normal ) { - list.push_back( FGHitRec( ent,idx,point,normal) ); - last = ent; + list.push_back( FGHitRec( ent,idx,point,normal) ); + last = ent; } int num_hits(void) { return list.size(); } ssgEntity *get_entity(int i) { return list[i].get_entity(); } @@ -60,37 +66,37 @@ public: int get_face(int i) { return list[i].get_face(); } double *get_point(int i) { return list[i].get_point(); } double *get_normal(int i) { return list[i].get_normal(); } - - void Intersect( ssgBranch *branch, - sgdVec3 orig, sgdVec3 dir ); - - void IntersectBranch( ssgBranch *branch, sgdMat4 m, - sgdVec3 orig, sgdVec3 dir); - - void IntersectCachedLeaf( sgdMat4 m, - sgdVec3 orig, sgdVec3 dir); - - int IntersectLeaf( ssgLeaf *leaf, sgdMat4 m, - sgdVec3 orig, sgdVec3 dir ); -}; + void Intersect( ssgBranch *branch, sgdVec3 orig, sgdVec3 dir ); + void Intersect( ssgBranch *scene, sgdMat4 m, sgdVec3 orig, sgdVec3 dir ); + + void IntersectBranch( ssgBranch *branch, sgdMat4 m, sgdVec3 orig, sgdVec3 dir); -inline void FGHitList::Intersect( ssgBranch *scene, - sgdVec3 orig, sgdVec3 dir ) -{ - sgdMat4 m; + int IntersectLeaf( ssgLeaf *leaf, sgdMat4 m, + sgdVec3 orig, sgdVec3 dir ); + + int IntersectLeaf( ssgLeaf *leaf, sgdMat4 m, + sgdVec3 orig, sgdVec3 dir, + GLenum primType ); +}; - init(); - if( last_hit() ) { - sgdMakeIdentMat4 ( m ) ; - IntersectCachedLeaf(m, orig, dir); - } - if( ! num_hits() ) { - clear(); - sgdMakeIdentMat4 ( m ) ; - IntersectBranch( scene, m, orig, dir); - } -} +// Associated functions, assuming a wgs84 world with 0,0,0 at the +// center, find the current terrain intersection elevation for the +// point specified. +bool fgCurrentElev( sgdVec3 abs_view_pos, + sgdVec3 scenery_center, + ssgTransform *terra_transform, + FGHitList *hit_list, + double *terrain_elev, + double *radius, + double *normal ); + +bool fgCurrentElev( sgdVec3 abs_view_pos, + sgdVec3 scenery_center, + FGHitList *hit_list, + double *terrain_elev, + double *radius, + double *normal ); #endif // _HITLIST_HXX