//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#include <simgear/compiler.h>
#include <simgear/constants.h>
+class SGMaterial;
+
class FGGroundCache {
public:
+ FGGroundCache();
+ ~FGGroundCache();
+
//////////////////////////////////////////////////////////////////////////
// Ground handling routines
//////////////////////////////////////////////////////////////////////////
// Return the altitude above ground below the wgs84 point pt
- // Search for the nearest triangle to pt.
+ // Search for highest triangle not higher than pt + max_altoff.
// Return ground properties like the ground type, 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 double pt[3],
+ bool get_agl(double t, const double pt[3], double max_altoff,
double contact[3], double normal[3], double vel[3],
- int *type, double *loadCapacity,
- double *frictionFactor, double *agl);
-
+ int *type, const SGMaterial** material, double *agl);
// Return 1 if the hook intersects with a wire.
// That test is done by checking if the quad spanned by the points pt*
void release_wire(void);
private:
- // Holds the private ground triangle cache ...
- // The surface cache itself.
- ssgRoot cache_root;
+ struct Triangle {
+ Triangle() : material(0) {}
+ // The edge vertices.
+ sgdVec3 vertices[3];
+ // The surface normal.
+ sgdVec4 plane;
+ // The bounding shpere.
+ sgdSphere sphere;
+ // The linear and angular velocity.
+ sgdVec3 velocity;
+ sgdVec3 rotation;
+ sgdVec3 rotation_pivot;
+ // Ground type
+ int type;
+ // the simgear material reference, contains friction coeficients ...
+ const SGMaterial* material;
+ };
+ struct Catapult {
+ sgdVec3 start;
+ sgdVec3 end;
+ sgdVec3 velocity;
+ sgdVec3 rotation;
+ sgdVec3 rotation_pivot;
+ };
+ struct Wire {
+ sgdVec3 ends[2];
+ sgdVec3 velocity;
+ sgdVec3 rotation;
+ sgdVec3 rotation_pivot;
+ int wire_id;
+ };
+
+
// The center of the cache.
sgdVec3 cache_center;
// Approximate ground radius.
// The wire identifier to track.
int wire_id;
+ // Containers which hold all the essential information about this cache.
+ std::vector<Triangle> triangles;
+ std::vector<Catapult> catapults;
+ std::vector<Wire> wires;
+
// The point and radius where the cache is built around.
// That are the arguments that were given to prepare_ground_cache.
sgdVec3 reference_wgs84_point;
// Fills the environment cache with everything inside the sphere sp.
- void cache_fill(ssgBranch *branch, sgMat4 xform,
- sgSphere* sp, sgVec3 down, sgSphere* wsp);
+ void cache_fill(ssgBranch *branch, sgdMat4 xform,
+ sgdSphere* sp, sgdVec3 down, sgdSphere* wsp);
+
+ // compute the ground property of this leaf.
+ void putSurfaceLeafIntoCache(const sgdSphere *sp, const sgdMat4 xform,
+ bool sphIsec, sgdVec3 down, ssgLeaf *l);
+
+ void putLineLeafIntoCache(const sgdSphere *wsp, const sgdMat4 xform,
+ ssgLeaf *l);
// Helper class to hold some properties of the ground triangle.
- class GroundProperty
- : public ssgBase {
- public:
- GroundProperty() : type(0) {}
+ struct GroundProperty {
+ GroundProperty() : type(0), material(0) {}
int type;
int wire_id;
- sgVec3 vel;
- // not yet implemented ...
-// double loadCapacity;
+ sgdVec3 vel;
+ sgdVec3 rot;
+ sgdVec3 pivot;
+ const SGMaterial* material;
};
// compute the ground property of this leaf.
- static GroundProperty *extractGroundProperty( ssgLeaf* leaf );
-
-
- // compute the ground property of this leaf.
- void putSurfaceLeafIntoCache(const sgSphere *sp, const sgMat4 xform,
- bool sphIsec, sgVec3 down, ssgLeaf *l);
-
- void putLineLeafIntoCache(const sgSphere *wsp, const sgMat4 xform,
- ssgLeaf *l);
-
- void addAndFlattenLeaf(GLenum ty, ssgLeaf *l, ssgIndexArray *ia,
- const sgMat4 xform);
-
+ static GroundProperty extractGroundProperty( ssgLeaf* leaf );
- void extractCacheRelativeVertex(double t, ssgVtxArray *va,
- GroundProperty *gp,
- short i, sgVec3 rel_pos,
- sgdVec3 wgs84_vel);
- void extractWgs84Vertex(double t, ssgVtxArray *va,
- GroundProperty *gp, short i,
- sgdVec3 wgs84_pos, sgdVec3 wgs84_vel);
+ static void velocityTransformTriangle(double dt, Triangle& dst,
+ const Triangle& src);
};
#endif