diff --git a/panda/src/tform/driveInterface.I b/panda/src/tform/driveInterface.I index 3393578712..790c7b44cd 100644 --- a/panda/src/tform/driveInterface.I +++ b/panda/src/tform/driveInterface.I @@ -356,27 +356,29 @@ get_r() const { //////////////////////////////////////////////////////////////////// INLINE void DriveInterface:: set_hpr(const LVecBase3f &hpr) { - _hpr = hpr; + set_hpr(hpr[0], hpr[1], hpr[2]); } INLINE void DriveInterface:: set_hpr(float h, float p, float r) { - _hpr.set(h, p, r); + set_h(h); + set_p(p); + set_r(r); } INLINE void DriveInterface:: set_h(float h) { - _hpr[0] = h; + _hpr[0] = _hpr_quantize * floor(h / _hpr_quantize + 0.5f); } INLINE void DriveInterface:: set_p(float p) { - _hpr[1] = p; + _hpr[1] = _hpr_quantize * floor(p / _hpr_quantize + 0.5f); } INLINE void DriveInterface:: set_r(float r) { - _hpr[2] = r; + _hpr[2] = _hpr_quantize * floor(r / _hpr_quantize + 0.5f); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/tform/driveInterface.cxx b/panda/src/tform/driveInterface.cxx index e52e41ccfc..b4cac21913 100644 --- a/panda/src/tform/driveInterface.cxx +++ b/panda/src/tform/driveInterface.cxx @@ -31,6 +31,7 @@ #include "dataGraphTraverser.h" TypeHandle DriveInterface::_type_handle; +const float DriveInterface::_hpr_quantize = 0.001; DriveInterface::KeyHeld:: KeyHeld() { diff --git a/panda/src/tform/driveInterface.h b/panda/src/tform/driveInterface.h index 95fc5557bf..ee80f20dd3 100644 --- a/panda/src/tform/driveInterface.h +++ b/panda/src/tform/driveInterface.h @@ -171,6 +171,13 @@ private: PT(EventStoreTransform) _transform; PT(EventStoreVec3) _velocity; + // This is the smallest meaningful value we can set on the hpr via + // the public set_hpr() interface. It's intended to filter out + // small meaningless perturbations of hpr that may get introduced + // due to numerical inaccuracy as we compute relative orientations + // in the show. + static const float _hpr_quantize; + public: static TypeHandle get_class_type() { return _type_handle;