Browse Source

quantize hpr to eliminate small values

David Rose 23 years ago
parent
commit
45941b3fff

+ 7 - 5
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);
 }
 
 ////////////////////////////////////////////////////////////////////

+ 1 - 0
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() {

+ 7 - 0
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;