X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Fhitlist.hxx;h=df54ef26a6abbe4ff6c016a089537774893a09d9;hb=048da049f87fe3f543795f3b1b511d774caa2787;hp=b734897002d389897b816150911179c4e9ec69da;hpb=17c781a870ea28eea5143d7e2c74ebe7e863a3d0;p=flightgear.git diff --git a/src/Scenery/hitlist.hxx b/src/Scenery/hitlist.hxx index b73489700..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 @@ -13,7 +17,6 @@ SG_USING_STD(vector); - class FGHitRec { private: @@ -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,52 +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 ); -inline void FGHitList::Intersect( ssgBranch *scene, - sgdVec3 orig, sgdVec3 dir ) -{ - sgdMat4 m; + void IntersectBranch( ssgBranch *branch, sgdMat4 m, sgdVec3 orig, sgdVec3 dir); -#ifdef USE_CACHED_HIT - // This optimization gives a slight speedup - // but it precludes using the hitlist for dynamic - // objects NHV - init(); - if( last_hit() ) { - sgdMakeIdentMat4 ( m ) ; - IntersectCachedLeaf(m, orig, dir); - } - if( ! num_hits() ) { -#endif - clear(); - sgdMakeIdentMat4 ( m ) ; - IntersectBranch( scene, m, orig, dir); -#ifdef USE_CACHED_HIT - } -#endif -} + int IntersectLeaf( ssgLeaf *leaf, sgdMat4 m, + sgdVec3 orig, sgdVec3 dir ); + + int IntersectLeaf( ssgLeaf *leaf, sgdMat4 m, + sgdVec3 orig, sgdVec3 dir, + GLenum primType ); +}; -// Associated function, assuming a wgs84 world with 0,0,0 at the +// 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, - FGHitList *hit_list, - double *terrain_elev, double *radius, double *normal ); - +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