Am Freitag, den 22.12.2006, 22:35 +0100 schrieb Maik Justus:
> Hi,
> 
> here is a patch for the head/osg-branch. But unfortunately it does not 
> work here. It seems, that
>     FGGroundCache::get_agl(double t, const SGVec3d& dpt, double max_altoff,
>                        SGVec3d& contact, SGVec3d& normal, SGVec3d& vel,
>                        int *type, const SGMaterial** material, double *agl)
> does not return the material.
> 
> Does anyone know, if this is not supported in osg?
> 
> Or is it OS-dependent?
> 
While compiling with your patch on Gentoo Linux I get:

FGGround.cpp:70: Fehler: redefinition of `void
yasim::FGGround::getGroundPlane(const double*, double*, float*, int*,
double*, double*, double*, double*, double*, bool*)'
FGGround.cpp:47: Fehler: »virtual void
yasim::FGGround::getGroundPlane(const double*, double*, float*, int*,
double*, double*, double*, double*, double*, bool*)« wurde vorher hier
definiert
make[3]: *** [FGGround.o] Fehler 1
make[3]: Leaving directory `/home/don/work/fg_cvs/source/src/FDM/YASim'
make[2]: *** [all-recursive] Fehler 1
make[2]: Leaving directory `/home/don/work/fg_cvs/source/src/FDM'
make[1]: *** [all-recursive] Fehler 1
make[1]: Leaving directory `/home/don/work/fg_cvs/source/src'
make: *** [all-recursive] Fehler 1


It is a OSG-FG CVS of today, the unpatched FG compiles and runs fine.

Greetings

Detlef

> Maik
> 
> 
> Maik Justus schrieb am 22.12.2006 19:02:
> > Hi,
> >
> > osg and plib branch differ in some details. My patch works only on the 
> > plib-branch. I hope I find the time to patch the head/osg-branch tonight.
> >
> > Maik
> >   
> 
> einfaches Textdokument-Anlage (gear.osg.diff)
> ? df.bat
> ? gear.diff
> ? gear.osg.diff
> Index: flight.cxx
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/flight.cxx,v
> retrieving revision 1.29
> diff -u -p -r1.29 flight.cxx
> --- flight.cxx        29 Oct 2006 19:30:24 -0000      1.29
> +++ flight.cxx        22 Dec 2006 21:10:58 -0000
> @@ -883,6 +883,39 @@ FGInterface::get_agl_m(double t, const d
>    return ret;
>  }
>  
> +bool
> +FGInterface::get_agl_m(double t, const double pt[3],
> +                       double contact[3], double normal[3], double vel[3],
> +                       int *type, double *loadCapacity,
> +                       double *frictionFactor, double *agl,
> +                       double *rollingFritction, double *loadResistance,
> +                       double *bumpiness, bool *isSolid)
> +{
> +  const SGMaterial* material;
> +  SGVec3d _contact, _normal, _vel;
> +  bool ret = ground_cache.get_agl(t, SGVec3d(pt), 2.0, _contact, _normal,
> +                                  _vel, type, &material, agl);
> +  sgdCopyVec3(contact, _contact.data());
> +  sgdCopyVec3(normal, _normal.data());
> +  sgdCopyVec3(vel, _vel.data());
> +  if (material) {
> +    *loadCapacity = material->get_load_resistence();
> +    *frictionFactor = material->get_friction_factor();
> +    *rollingFritction = material->get_rolling_friction();
> +    *loadResistance = material->get_load_resistence();
> +    *bumpiness = material->get_bumpiness();
> +    *isSolid = material->get_solid();
> +  } else {
> +    *loadCapacity = DBL_MAX;
> +    *frictionFactor = 1.0;
> +    *rollingFritction = 0.02;
> +    *loadResistance = DBL_MAX;
> +    *bumpiness = 0.0;
> +    *isSolid = true;
> +  }
> +  return ret;
> +}
> +
>  // Legacy interface just kept because of JSBSim
>  bool
>  FGInterface::get_agl_ft(double t, const double pt[3],
> Index: flight.hxx
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/flight.hxx,v
> retrieving revision 1.13
> diff -u -p -r1.13 flight.hxx
> --- flight.hxx        11 Jun 2006 13:34:19 -0000      1.13
> +++ flight.hxx        22 Dec 2006 21:11:03 -0000
> @@ -1128,6 +1128,12 @@ public:
>                     double contact[3], double normal[3], double vel[3],
>                     int *type, double *loadCapacity,
>                     double *frictionFactor, double *agl);
> +    bool get_agl_m(double t, const double pt[3],
> +                       double contact[3], double normal[3], double vel[3],
> +                       int *type, double *loadCapacity,
> +                       double *frictionFactor, double *agl,
> +                       double *rollingFritction, double *loadResistance,
> +                       double *bumpiness,bool *isSolid);
>      bool get_agl_ft(double t, const double pt[3],
>                      double contact[3], double normal[3], double vel[3],
>                      int *type, double *loadCapacity,
> Index: YASim/Airplane.cpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/Airplane.cpp,v
> retrieving revision 1.22
> diff -u -p -r1.22 Airplane.cpp
> --- YASim/Airplane.cpp        22 Dec 2006 18:02:17 -0000      1.22
> +++ YASim/Airplane.cpp        22 Dec 2006 21:11:08 -0000
> @@ -602,6 +602,7 @@ void Airplane::compileContactPoints()
>          // I made these up
>          g->setStaticFriction(0.6f);
>          g->setDynamicFriction(0.5f);
> +        g->setContactPoint(1);
>  
>          _model.addGear(g);
>      }
> Index: YASim/FGFDM.cpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/FGFDM.cpp,v
> retrieving revision 1.45
> diff -u -p -r1.45 FGFDM.cpp
> --- YASim/FGFDM.cpp   18 Dec 2006 21:22:20 -0000      1.45
> +++ YASim/FGFDM.cpp   22 Dec 2006 21:11:11 -0000
> @@ -273,6 +273,10 @@ void FGFDM::startElement(const char* nam
>       g->setDynamicFriction(attrf(a, "dfric", 0.7));
>          g->setSpring(attrf(a, "spring", 1));
>          g->setDamping(attrf(a, "damp", 1));
> +        if(attrb(a,"on-water"))g->setOnWater(1);
> +        if(attrb(a,"on-solid"))g->setOnSolid(1);
> +        g->setInverseSpeedSpringIsDoubled(attrf(a, 
> "inverse-speed-spring-is-doubled", 0));
> +        g->setReduceFrictionByExtension(attrf(a, 
> "reduce-friction-by-extension", 0));
>       _airplane.addGear(g);
>      } else if(eq(name, "hook")) {
>       Hook* h = new Hook();
> Index: YASim/FGGround.cpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/FGGround.cpp,v
> retrieving revision 1.2
> diff -u -p -r1.2 FGGround.cpp
> --- YASim/FGGround.cpp        18 Feb 2005 12:40:39 -0000      1.2
> +++ YASim/FGGround.cpp        22 Dec 2006 21:11:12 -0000
> @@ -35,6 +35,29 @@ void FGGround::getGroundPlane(const doub
>      for(int i=0; i<3; i++) vel[i] = dvel[i];
>  }
>  
> +void FGGround::getGroundPlane(const double pos[3],
> +                              double plane[4], float vel[3],
> +                              int *type,
> +                              double *frictionFactor, 
> +                              double *rollingFriction,
> +                              double *loadCapacity,
> +                              double *loadResistance,
> +                              double *bumpiness,
> +                              bool *isSolid)
> +{
> +    // Return values for the callback.
> +    double agl;
> +    double cp[3], dvel[3];
> +    _iface->get_agl_m(_toff, pos, cp, plane, dvel,
> +                      type, loadCapacity, frictionFactor, &agl,
> +                      rollingFriction,loadResistance,bumpiness,isSolid);
> +
> +    // The plane below the actual contact point.
> +    plane[3] = plane[0]*cp[0] + plane[1]*cp[1] + plane[2]*cp[2];
> +
> +    for(int i=0; i<3; i++) vel[i] = dvel[i];
> +}
> +
>  bool FGGround::caughtWire(const double pos[4][3])
>  {
>      return _iface->caught_wire_m(_toff, pos);
> Index: YASim/FGGround.hpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/FGGround.hpp,v
> retrieving revision 1.1
> diff -u -p -r1.1 FGGround.hpp
> --- YASim/FGGround.hpp        17 Feb 2005 10:37:26 -0000      1.1
> +++ YASim/FGGround.hpp        22 Dec 2006 21:11:12 -0000
> @@ -18,6 +18,16 @@ public:
>      virtual void getGroundPlane(const double pos[3],
>                                  double plane[4], float vel[3]);
>  
> +    virtual void getGroundPlane(const double pos[3],
> +                              double plane[4], float vel[3],
> +                              int *type,
> +                              double *frictionFactor, 
> +                              double *rollingFriction,
> +                              double *loadCapacity,
> +                              double *loadResistance,
> +                              double *bumpiness,
> +                              bool *isSolid);
> +
>      virtual bool caughtWire(const double pos[4][3]);
>  
>      virtual bool getWire(double end[2][3], float vel[2][3]);
> Index: YASim/Gear.cpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/Gear.cpp,v
> retrieving revision 1.7
> diff -u -p -r1.7 Gear.cpp
> --- YASim/Gear.cpp    24 Nov 2005 17:35:42 -0000      1.7
> +++ YASim/Gear.cpp    22 Dec 2006 21:11:13 -0000
> @@ -4,6 +4,9 @@
>  
>  #include "Gear.hpp"
>  namespace yasim {
> +static const float YASIM_PI = 3.14159265358979323846;
> +static const float maxGroundBumpAmplitude=0.5; 
> +        //Amplitude can be positive and negative
>  
>  Gear::Gear()
>  {
> @@ -19,6 +22,20 @@ Gear::Gear()
>      _extension = 1;
>      _castering = false;
>      _frac = 0;
> +    _ground_type = 0;
> +    _ground_frictionFactor = 1;
> +    _ground_rollingFriction = 0.02;
> +    _ground_loadCapacity = 1e30;
> +    _ground_loadResistance = 1e30;
> +    _ground_isSolid=1;
> +    _ground_bumpiness = 0;
> +    _onWater=0;
> +    _onSolid=1;
> +    _global_x=0.0;
> +    _global_y=0.0;
> +    _inverseSpeedSpringIsDoubled=0;
> +    _reduceFrictionByExtension=0;
> +    _isContactPoint=0;
>  
>      for(i=0; i<3; i++)
>       _global_ground[i] = _global_vel[i] = 0;
> @@ -78,11 +95,51 @@ void Gear::setCastering(bool c)
>      _castering = c;
>  }
>  
> -void Gear::setGlobalGround(double *global_ground, float* global_vel)
> +void Gear::setContactPoint(bool c)
> +{
> +    _isContactPoint=c;
> +}
> +
> +void Gear::setOnWater(bool c)
> +{
> +    _onWater = c;
> +}
> +
> +void Gear::setOnSolid(bool c)
> +{
> +    _onSolid = c;
> +}
> +
> +void Gear::setInverseSpeedSpringIsDoubled(float s)
> +{
> +    _inverseSpeedSpringIsDoubled=s;
> +}
> +
> +void Gear::setReduceFrictionByExtension(float s)
> +{
> +    _reduceFrictionByExtension=s;
> +}
> +
> +void Gear::setGlobalGround(double *global_ground, float* global_vel,
> +                           double globalX, double globalY,
> +                           int type, double frictionFactor,
> +                           double rollingFriction, double loadCapacity,
> +                           double loadResistance, double bumpiness, 
> +                           bool isSolid)
>  {
>      int i;
>      for(i=0; i<4; i++) _global_ground[i] = global_ground[i];
>      for(i=0; i<3; i++) _global_vel[i] = global_vel[i];
> +    _ground_type = type;
> +    _ground_frictionFactor=frictionFactor;
> +    _ground_rollingFriction=rollingFriction;
> +    _ground_loadCapacity=loadCapacity;
> +    _ground_loadResistance=loadResistance;
> +    _ground_bumpiness=bumpiness;
> +    _ground_isSolid=isSolid;
> +    _global_x=globalX;
> +    _global_y=globalY;
> +
>  }
>  
>  void Gear::getPosition(float* out)
> @@ -159,6 +216,31 @@ bool Gear::getCastering()
>      return _castering;
>  }
>  
> +bool Gear::getGroundIsSolid()
> +{
> +    return _ground_isSolid;
> +}
> +
> +float Gear::getBumbAltitude()
> +{
> +    if (_ground_bumpiness<0.001) return 0.0;
> +    double x = _global_x*10;
> +    double y = _global_y*10;
> +    x-=Math::floor(x);
> +    y-=Math::floor(y);
> +    x*=2*YASIM_PI;
> +    y*=2*YASIM_PI;
> +    //now x and y are in the range of 0..2pi
> +    //we need a function, that is periodically on 2pi and gives some
> +    //height. This is not very fast, but for a beginning.
> +    //maybe this should be done by interpolating between some precalculated
> +    //values
> +    float h= Math::sin(x)+Math::sin(7*x)+Math::sin(8*x)+Math::sin(13*x);
> +    h+= Math::sin(2*y)+Math::sin(5*y)+Math::sin(9*y*x)+Math::sin(17*y);
> +    
> +    return h *(1/8.)*_ground_bumpiness*maxGroundBumpAmplitude;
> +}
> +
>  void Gear::calcForce(RigidBody* body, State *s, float* v, float* rot)
>  {
>      // Init the return values
> @@ -169,6 +251,15 @@ void Gear::calcForce(RigidBody* body, St
>      if(_extension < 1)
>       return;
>  
> +    if (!((_onWater&&!_ground_isSolid)||(_onSolid&&_ground_isSolid)))  {
> +     _wow = 0;
> +     _frac = 0;
> +        _compressDist = 0;
> +        _rollSpeed = 0;
> +        _casterAngle = 0;
> +     return;
> +    }
> +
>      // The ground plane transformed to the local frame.
>      float ground[4];
>      s->planeGlobalToLocal(_global_ground, ground);
> @@ -180,6 +271,12 @@ void Gear::calcForce(RigidBody* body, St
>      // First off, make sure that the gear "tip" is below the ground.
>      // If it's not, there's no force.
>      float a = ground[3] - Math::dot3(_pos, ground);
> +    float BumbAltitude=0;
> +    if (a<maxGroundBumpAmplitude)
> +    {
> +        BumbAltitude=getBumbAltitude();
> +        a+=BumbAltitude;
> +    }
>      _compressDist = -a;
>      if(a > 0) {
>       _wow = 0;
> @@ -196,7 +293,7 @@ void Gear::calcForce(RigidBody* body, St
>      // above ground is negative.
>      float tmp[3];
>      Math::add3(_cmpr, _pos, tmp);
> -    float b = ground[3] - Math::dot3(tmp, ground);
> +    float b = ground[3] - Math::dot3(tmp, ground)+BumbAltitude;
>  
>      // Calculate the point of ground _contact.
>      _frac = a/(a-b);
> @@ -219,7 +316,11 @@ void Gear::calcForce(RigidBody* body, St
>      // compression.   (note the clamping of _frac to 1):
>      _frac = (_frac > 1) ? 1 : _frac;
>      float fmag = _frac*clen*_spring;
> -
> +    float inversespeed_multiplied_by_speed=0;
> +    if (_inverseSpeedSpringIsDoubled>0.0000001) {
> +        
> inversespeed_multiplied_by_speed=Math::mag3(cv)*_inverseSpeedSpringIsDoubled;
> +        fmag*=1+inversespeed_multiplied_by_speed;
> +    }
>      // Then the damping.  Use the only the velocity into the ground
>      // (projection along "ground") projected along the compression
>      // axis.  So Vdamp = ground*(ground dot cv) dot cmpr
> @@ -284,11 +385,28 @@ void Gear::calcForce(RigidBody* body, St
>          _rollSpeed = vsteer;
>          _casterAngle = _rot;
>      }
> -
> -    float fsteer = _brake * calcFriction(wgt, vsteer);
> -    float fskid  = calcFriction(wgt, vskid);
> +    float fsteer,fskid;
> +    if(_ground_isSolid)
> +    {
> +        fsteer = (_brake * _ground_frictionFactor 
> +                    +(1-_brake)*_ground_rollingFriction
> +                   )*calcFriction(wgt, vsteer);
> +        fskid  = calcFriction(wgt, vskid)*_ground_frictionFactor;
> +    }
> +    else
> +    {
> +        fsteer = _ground_frictionFactor *calcFrictionV2(wgt, vsteer);
> +        fskid  = calcFrictionV2(wgt, vskid)*_ground_frictionFactor;
> +    }
>      if(vsteer > 0) fsteer = -fsteer;
>      if(vskid > 0) fskid = -fskid;
> +    
> +    //reduce friction if wanted by _reduceFrictionByExtension
> +    //float factor = 
> 1-inversespeed_multiplied_by_speed*_reduceFrictionByExtension;
> +    float factor = (1-_frac)*(1-_reduceFrictionByExtension)+_frac*1;
> +    factor=Math::clamp(factor,0,1);
> +    fsteer*=factor;
> +    fskid*=factor;
>  
>      // Phoo!  All done.  Add it up and get out of here.
>      Math::mul3(fsteer, steer, tmp);
> @@ -308,5 +426,14 @@ float Gear::calcFriction(float wgt, floa
>      else         return wgt * _dfric;
>  }
>  
> +float Gear::calcFrictionV2(float wgt, float v)
> +{
> +    // How slow is stopped?  10 cm/second?
> +    const float STOP = 0.1f;
> +    const float iSTOP = 1.0f/STOP;
> +    v = Math::abs(v);
> +    if(v < STOP) return v*iSTOP * wgt * _sfric;
> +    else         return wgt * _dfric*v*v*0.01;
> +}
>  }; // namespace yasim
>  
> Index: YASim/Gear.hpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/Gear.hpp,v
> retrieving revision 1.5
> diff -u -p -r1.5 Gear.hpp
> --- YASim/Gear.hpp    24 Nov 2005 17:35:42 -0000      1.5
> +++ YASim/Gear.hpp    22 Dec 2006 21:11:13 -0000
> @@ -39,8 +39,15 @@ public:
>      void setRotation(float rotation);
>      void setExtension(float extension);
>      void setCastering(bool castering);
> -    void setGlobalGround(double* global_ground, float* global_vel);
> -
> +    void setOnWater(bool c);
> +    void setOnSolid(bool c);
> +    void setInverseSpeedSpringIsDoubled(float s);
> +    void setReduceFrictionByExtension(float s);
> +    void setGlobalGround(double* global_ground, float* global_vel,
> +        double globalX, double globalY,
> +        int type, double frictionFactor,double rollingFriction,
> +        double loadCapacity, double loadResistance, double bumpiness,
> +        bool isSolid);
>      void getPosition(float* out);
>      void getCompression(float* out);
>      void getGlobalGround(double* global_ground);
> @@ -54,6 +61,8 @@ public:
>      bool getCastering();
>      float getCasterAngle() { return _casterAngle; }
>      float getRollSpeed() { return _rollSpeed; }
> +    float getBumbAltitude();
> +    bool getGroundIsSolid();
>  
>      // Takes a velocity of the aircraft relative to ground, a rotation
>      // vector, and a ground plane (all specified in local coordinates)
> @@ -67,9 +76,12 @@ public:
>      float getWoW();
>      float getCompressFraction();
>      float getCompressDist() { return _compressDist; }
> +    bool getIgnoreAtCrashDetection() {return 
> (!_ground_isSolid)&&(!_isContactPoint); }
> +    void setContactPoint(bool c);
>  
>  private:
>      float calcFriction(float wgt, float v);
> +    float calcFrictionV2(float wgt, float v);
>  
>      bool _castering;
>      float _pos[3];
> @@ -90,6 +102,21 @@ private:
>      float _global_vel[3];
>      float _casterAngle;
>      float _rollSpeed;
> +    bool _isContactPoint;
> +    bool _onWater;
> +    bool _onSolid;
> +    float _inverseSpeedSpringIsDoubled;
> +    float _reduceFrictionByExtension;
> +
> +    int _ground_type;
> +    double _ground_frictionFactor;
> +    double _ground_rollingFriction;
> +    double _ground_loadCapacity;
> +    double _ground_loadResistance;
> +    double _ground_bumpiness;
> +    bool _ground_isSolid;
> +    double _global_x;
> +    double _global_y;
>  };
>  
>  }; // namespace yasim
> Index: YASim/Ground.cpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/Ground.cpp,v
> retrieving revision 1.1
> diff -u -p -r1.1 Ground.cpp
> --- YASim/Ground.cpp  17 Feb 2005 10:37:26 -0000      1.1
> +++ YASim/Ground.cpp  22 Dec 2006 21:11:13 -0000
> @@ -28,6 +28,19 @@ void Ground::getGroundPlane(const double
>      vel[2] = 0.0;
>  }
>  
> +void Ground::getGroundPlane(const double pos[3],
> +                              double plane[4], float vel[3],
> +                              int *type,
> +                              double *frictionFactor, 
> +                              double *rollingFriction,
> +                              double *loadCapacity,
> +                              double *loadResistance,
> +                              double *bumpiness,
> +                              bool *isSolid)
> +{
> +    getGroundPlane(pos,plane,vel);
> +}
> +
>  bool Ground::caughtWire(const double pos[4][3])
>  {
>      return false;
> Index: YASim/Ground.hpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/Ground.hpp,v
> retrieving revision 1.1
> diff -u -p -r1.1 Ground.hpp
> --- YASim/Ground.hpp  17 Feb 2005 10:37:26 -0000      1.1
> +++ YASim/Ground.hpp  22 Dec 2006 21:11:14 -0000
> @@ -11,6 +11,16 @@ public:
>      virtual void getGroundPlane(const double pos[3],
>                                  double plane[4], float vel[3]);
>  
> +    virtual void getGroundPlane(const double pos[3],
> +                              double plane[4], float vel[3],
> +                              int *type,
> +                              double *frictionFactor, 
> +                              double *rollingFriction,
> +                              double *loadCapacity,
> +                              double *loadResistance,
> +                              double *bumpiness,
> +                              bool *isSolid);
> +
>      virtual bool caughtWire(const double pos[4][3]);
>  
>      virtual bool getWire(double end[2][3], float vel[2][3]);
> Index: YASim/Model.cpp
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/Model.cpp,v
> retrieving revision 1.13
> diff -u -p -r1.13 Model.cpp
> --- YASim/Model.cpp   14 Sep 2006 18:18:33 -0000      1.13
> +++ YASim/Model.cpp   22 Dec 2006 21:11:15 -0000
> @@ -13,7 +13,12 @@
>  #include "Rotorpart.hpp"
>  #include "Glue.hpp"
>  #include "Ground.hpp"
> -
> +/*
> +#include <stdio.h>
> +#include <iostream>
> +#include <sstream>
> +#include <simgear/debug/logstream.hxx>
> +*/
>  #include "Model.hpp"
>  namespace yasim {
>  
> @@ -307,8 +312,26 @@ void Model::updateGround(State* s)
>          // Ask for the ground plane in the global coordinate system
>          double global_ground[4];
>          float global_vel[3];
> -        _ground_cb->getGroundPlane(pt, global_ground, global_vel);
> -        g->setGlobalGround(global_ground, global_vel);
> +        int type;
> +        double frictionFactor, rollingFriction, loadCapacity,
> +               loadResistance, bumpiness;
> +        bool isSolid;
> +        //_ground_cb->getGroundPlane(pt, global_ground, global_vel);
> +        _ground_cb->getGroundPlane(pt, global_ground, global_vel,
> +                              &type,&frictionFactor, &rollingFriction,
> +                              &loadCapacity, 
> &loadResistance,&bumpiness,&isSolid);
> +        static int h=0;
> +        /* 
> +        if (h++>100)
> +        {
> +            cout<<"t:"<<type<<"fF:"<<frictionFactor<<"rF:"<<rollingFriction
> +            <<"lC:"<<loadCapacity<<"lR"<<loadResistance<<"b:"<<bumpiness<<"  
>   \r";
> +            h=0;
> +        }
> +        */
> +        g->setGlobalGround(global_ground, global_vel, pt[0], pt[1],type,
> +            frictionFactor, rollingFriction, loadCapacity, loadResistance,
> +            bumpiness,isSolid);
>      }
>      for(i=0; i<_rotorgear.getRotors()->size(); i++) {
>          Rotor* r = (Rotor*)_rotorgear.getRotors()->get(i);
> @@ -480,23 +503,26 @@ void Model::newState(State* s)
>      for(i=0; i<_gears.size(); i++) {
>       Gear* g = (Gear*)_gears.get(i);
>  
> -     // Get the point of ground contact
> -        float pos[3], cmpr[3];
> -     g->getPosition(pos);
> -     g->getCompression(cmpr);
> -     Math::mul3(g->getCompressFraction(), cmpr, cmpr);
> -     Math::add3(cmpr, pos, pos);
> -
> -        // The plane transformed to local coordinates.
> -        double global_ground[4];
> -        g->getGlobalGround(global_ground);
> -        float ground[4];
> -        s->planeGlobalToLocal(global_ground, ground);
> -     float dist = ground[3] - Math::dot3(pos, ground);
> -
> -     // Find the lowest one
> -     if(dist < min)
> -         min = dist;
> +        if (!g->getIgnoreAtCrashDetection())
> +        {
> +         // Get the point of ground contact
> +            float pos[3], cmpr[3];
> +         g->getPosition(pos);
> +         g->getCompression(cmpr);
> +         Math::mul3(g->getCompressFraction(), cmpr, cmpr);
> +         Math::add3(cmpr, pos, pos);
> +
> +            // The plane transformed to local coordinates.
> +            double global_ground[4];
> +            g->getGlobalGround(global_ground);
> +            float ground[4];
> +            s->planeGlobalToLocal(global_ground, ground);
> +         float dist = ground[3] - Math::dot3(pos, ground);
> +
> +         // Find the lowest one
> +         if(dist < min)
> +             min = dist;
> +        }
>      }
>      _agl = min;
>      if(_agl < -1) // Allow for some integration slop
> Index: YASim/YASim.cxx
> ===================================================================
> RCS file: /var/cvs/FlightGear-0.9/source/src/FDM/YASim/YASim.cxx,v
> retrieving revision 1.37
> diff -u -p -r1.37 YASim.cxx
> --- YASim/YASim.cxx   9 Dec 2006 20:37:59 -0000       1.37
> +++ YASim/YASim.cxx   22 Dec 2006 21:11:17 -0000
> @@ -477,6 +477,7 @@ void YASim::copyFromYASim()
>       node->setFloatValue("compression-m", g->getCompressDist());
>          node->setFloatValue("caster-angle-deg", g->getCasterAngle() * 
> RAD2DEG);
>          node->setFloatValue("rollspeed-ms", g->getRollSpeed());
> +        node->setBoolValue("ground-is-solid", g->getGroundIsSolid()!=0);
>      }
>  
>      Hook* h = airplane->getHook();
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________ Flightgear-devel mailing list 
> Flightgear-devel@lists.sourceforge.net 
> https://lists.sourceforge.net/lists/listinfo/flightgear-devel


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Flightgear-devel mailing list
Flightgear-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/flightgear-devel

Reply via email to