1 #ifdef HAVE_CONFIG_H
2   #include <config.h>
3 #endif
4 
5 #include <simgear/scene/material/mat.hxx>
6 
7 #include <FDM/flight.hxx>
8 
9 #include "Glue.hpp"
10 #include "Ground.hpp"
11 
12 #include "FGGround.hpp"
13 namespace yasim {
14 
FGGround(FGInterface * iface)15 FGGround::FGGround(FGInterface *iface) : _iface(iface)
16 {
17     _toff = 0.0;
18 }
19 
~FGGround()20 FGGround::~FGGround()
21 {
22 }
23 
getGroundPlane(const double pos[3],double plane[4],float vel[3],unsigned int & body)24 void FGGround::getGroundPlane(const double pos[3],
25                               double plane[4], float vel[3],
26                               unsigned int &body)
27 {
28     // Return values for the callback.
29     double cp[3], dvel[3], dangvel[3];
30     const simgear::BVHMaterial* material;
31     _iface->get_agl_m(_toff, pos, 2, cp, plane, dvel, dangvel, material, body);
32 
33     // The plane below the actual contact point.
34     plane[3] = plane[0]*cp[0] + plane[1]*cp[1] + plane[2]*cp[2];
35 
36     for(int i=0; i<3; i++) vel[i] = dvel[i];
37 }
38 
getGroundPlane(const double pos[3],double plane[4],float vel[3],const simgear::BVHMaterial ** material,unsigned int & body)39 void FGGround::getGroundPlane(const double pos[3],
40                               double plane[4], float vel[3],
41                               const simgear::BVHMaterial **material,
42                               unsigned int &body)
43 {
44     // Return values for the callback.
45     double cp[3], dvel[3], dangvel[3];
46     _iface->get_agl_m(_toff, pos, 2, cp, plane, dvel, dangvel, *material, body);
47 
48     // The plane below the actual contact point.
49     plane[3] = plane[0]*cp[0] + plane[1]*cp[1] + plane[2]*cp[2];
50 
51     for(int i=0; i<3; i++) vel[i] = dvel[i];
52 }
53 
getBody(double t,double bodyToWorld[16],double linearVel[3],double angularVel[3],unsigned int & body)54 bool FGGround::getBody(double t, double bodyToWorld[16], double linearVel[3],
55                        double angularVel[3], unsigned int &body)
56 {
57     if (!_iface->get_body_m(_toff + t , body, bodyToWorld, linearVel, angularVel))
58         return false;
59 
60     return true;
61 }
62 
caughtWire(const double pos[4][3])63 bool FGGround::caughtWire(const double pos[4][3])
64 {
65     return _iface->caught_wire_m(_toff, pos);
66 }
67 
getWire(double end[2][3],float vel[2][3])68 bool FGGround::getWire(double end[2][3], float vel[2][3])
69 {
70     double dvel[2][3];
71     bool ret = _iface->get_wire_ends_m(_toff, end, dvel);
72     for (int i=0; i<2; ++i)
73       for (int j=0; j<3; ++j)
74         vel[i][j] = dvel[i][j];
75     return ret;
76 }
77 
releaseWire(void)78 void FGGround::releaseWire(void)
79 {
80     _iface->release_wire();
81 }
82 
getCatapult(const double pos[3],double end[2][3],float vel[2][3])83 float FGGround::getCatapult(const double pos[3], double end[2][3],
84                             float vel[2][3])
85 {
86     double dvel[2][3];
87     float dist = _iface->get_cat_m(_toff, pos, end, dvel);
88     for (int i=0; i<2; ++i)
89       for (int j=0; j<3; ++j)
90         vel[i][j] = dvel[i][j];
91     return dist;
92 }
93 
setTimeOffset(double toff)94 void FGGround::setTimeOffset(double toff)
95 {
96     _toff = toff;
97 }
98 
99 
100 }; // namespace yasim
101 
102