X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2Fgroundcache.hxx;h=9319666a6ba83508f9f1c364ab8d9e624ba740ed;hb=de38157916ac06e19c47fd3b596ec18329771ed1;hp=58996a811b79f864a900c4abdfd003d7e34c332e;hpb=d5a893589c7193abf6fe2b13d370fcf6323945f8;p=flightgear.git diff --git a/src/FDM/groundcache.hxx b/src/FDM/groundcache.hxx index 58996a811..9319666a6 100644 --- a/src/FDM/groundcache.hxx +++ b/src/FDM/groundcache.hxx @@ -23,20 +23,24 @@ #ifndef _GROUNDCACHE_HXX #define _GROUNDCACHE_HXX -#include - -namespace osgUtil -{ -class PolytopeIntersector; -} - #include #include #include #include +#include +#include + +// #define GROUNDCACHE_DEBUG +#ifdef GROUNDCACHE_DEBUG +#include +#include +#include +#endif -class SGMaterial; -class WireIntersector; +namespace simgear { +class BVHLineGeometry; +class BVHMaterial; +} class FGGroundCache { public: @@ -50,14 +54,28 @@ public: // Prepare the ground cache for the wgs84 position pt_*. // That is take all vertices in the ball with radius rad around the // position given by the pt_* and store them in a local scene graph. - bool prepare_ground_cache(double ref_time, const SGVec3d& pt, - double rad); + bool prepare_ground_cache(double startSimTime, double endSimTime, + const SGVec3d& pt, double rad); // Returns true if the cache is valid. // Also the reference time, point and radius values where the cache // is valid for are returned. bool is_valid(double& ref_time, SGVec3d& pt, double& rad); + // Returns the unit down vector at the ground cache + const SGVec3d& get_down() const + { return down; } + + // The time offset that originates from a simtime different than zero + // at initialization time of the fdm. + double get_cache_time_offset() const + { return cache_time_offset; } + void set_cache_time_offset(double time_offset) + { cache_time_offset = time_offset; } + + bool get_body(double t, SGMatrixd& bodyToWorld, SGVec3d& linearVel, + SGVec3d& angularVel, simgear::BVHNode::Id id); + // Return the nearest catapult to the given point // pt in wgs84 coordinates. double get_cat(double t, const SGVec3d& pt, @@ -66,13 +84,18 @@ public: // Return the altitude above ground below the wgs84 point pt // Search for highest triangle not higher than pt + max_altoff. - // Return ground properties like the ground type, the maximum load + // Return ground properties like the maximum load // this kind kind of ground can carry, the friction factor between - // 0 and 1 which can be used to model lower friction with wet runways - // and finally the altitude above ground. - bool get_agl(double t, const SGVec3d& pt, double max_altoff, - SGVec3d& contact, SGVec3d& normal, SGVec3d& vel, - int *type, const SGMaterial** material, double *agl); + // 0 and 1 which can be used to model lower friction with wet runways. + bool get_agl(double t, const SGVec3d& pt, SGVec3d& contact, + SGVec3d& normal, SGVec3d& linearVel, SGVec3d& angularVel, + simgear::BVHNode::Id& id, + const simgear::BVHMaterial*& material); + + bool get_nearest(double t, const SGVec3d& pt, double maxDist, + SGVec3d& contact, SGVec3d& linearVel, SGVec3d& angularVel, + simgear::BVHNode::Id& id, + const simgear::BVHMaterial*& material); // Return 1 if the hook intersects with a wire. // That test is done by checking if the quad spanned by the points pt* @@ -89,56 +112,24 @@ public: void release_wire(void); private: - friend class GroundCacheFillVisitor; - - - // Helper class to hold some properties of the ground triangle. - struct GroundProperty { - GroundProperty() : type(0), wire_id(0), material(0) {} - int type; - int wire_id; - // The linear and angular velocity. - SGVec3d vel; - SGVec3d rot; - SGVec3d pivot; - // the simgear material reference, contains friction coeficients ... - const SGMaterial* material; - }; - - struct Triangle { - GroundProperty gp; - // The triangle we represent - SGTriangled triangle; - SGSphered sphere; - }; - struct Catapult { - GroundProperty gp; - SGVec3d start; - SGVec3d end; - }; - struct Wire { - GroundProperty gp; - SGVec3d ends[2]; - }; - + class CacheFill; + class BodyFinder; + class CatapultFinder; + class WireIntersector; + class WireFinder; // Approximate ground radius. // In case the aircraft is too high above ground. - double ground_radius; - // Ground type - int _type; + double _altitude; // the simgear material reference, contains friction coeficients ... - const SGMaterial* _material; + const simgear::BVHMaterial* _material; // The time reference for later call to intersection test routines. // Is required since we will have moving triangles in carriers. double cache_ref_time; - // The wire identifier to track. - int wire_id; - - // Containers which hold all the essential information about this cache. - std::vector triangles; - std::vector catapults; - std::vector wires; + // The time the cache was initialized. + double cache_time_offset; + // The wire to track. + const simgear::BVHLineGeometry* _wire; // The point and radius where the cache is built around. // That are the arguments that were given to prepare_ground_cache. @@ -147,14 +138,16 @@ private: SGVec3d down; bool found_ground; - void getGroundProperty(osg::Drawable* drawable, - const osg::NodePath& nodePath, - GroundProperty& gp, bool& backfaceCulling); - static void velocityTransformTriangle(double dt, SGTriangled& dst, - SGSphered& sdst, const Triangle& src); - void getTriIntersectorResults(osgUtil::PolytopeIntersector* triInt); - void getWireIntersectorResults(WireIntersector* wireInt, - double wireCacheRadius); + SGSharedPtr _localBvhTree; + +#ifdef GROUNDCACHE_DEBUG + SGTimeStamp _lookupTime; + unsigned _lookupCount; + SGTimeStamp _buildTime; + unsigned _buildCount; + + osg::ref_ptr _group; +#endif }; #endif