2
0
David Rose 23 жил өмнө
parent
commit
bd3d94ccec

+ 94 - 37
panda/src/linmath/lquaternion_src.I

@@ -17,7 +17,7 @@
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::Default Constructor
+//     Function: LQuaternion::Default Constructor
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -26,7 +26,7 @@ FLOATNAME(LQuaternion)() {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::Copy Constructor
+//     Function: LQuaternion::Copy Constructor
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -37,7 +37,7 @@ FLOATNAME(LQuaternion)(const FLOATNAME(LQuaternion) &c) :
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::Constructor
+//     Function: LQuaternion::Constructor
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -47,7 +47,7 @@ FLOATNAME(LQuaternion)(FLOATTYPE r, FLOATTYPE i, FLOATTYPE j, FLOATTYPE k) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::multiply
+//     Function: LQuaternion::multiply
 //       Access: protected
 //       Access: protected
 //  Description: actual multiply call (non virtual)
 //  Description: actual multiply call (non virtual)
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -62,7 +62,7 @@ multiply(const FLOATNAME(LQuaternion)& rhs) const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::Multiply Operator
+//     Function: LQuaternion::Multiply Operator
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -72,7 +72,7 @@ operator *(const FLOATNAME(LQuaternion)& c) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::Multiply Assignment Operator
+//     Function: LQuaternion::Multiply Assignment Operator
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -83,7 +83,7 @@ operator *=(const FLOATNAME(LQuaternion)& c) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::Multiply Operator
+//     Function: LQuaternion::Multiply Operator
 //       Access: public
 //       Access: public
 //  Description: Quat * Matrix = matrix
 //  Description: Quat * Matrix = matrix
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -95,7 +95,7 @@ operator *(const FLOATNAME(LMatrix3) &m) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::Multiply Operator
+//     Function: LQuaternion::Multiply Operator
 //       Access: public
 //       Access: public
 //  Description: Quat * Matrix = matrix
 //  Description: Quat * Matrix = matrix
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -114,7 +114,7 @@ operator *(const FLOATNAME(LMatrix4) &m) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::almost_equal
+//     Function: LQuaternion::almost_equal
 //       Access: public
 //       Access: public
 //  Description: Returns true if two quaternions are memberwise equal
 //  Description: Returns true if two quaternions are memberwise equal
 //               within a specified tolerance.
 //               within a specified tolerance.
@@ -128,7 +128,7 @@ almost_equal(const FLOATNAME(LQuaternion)& c, FLOATTYPE threshold) const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::almost_equal
+//     Function: LQuaternion::almost_equal
 //       Access: public
 //       Access: public
 //  Description: Returns true if two quaternions are memberwise equal
 //  Description: Returns true if two quaternions are memberwise equal
 //               within a default tolerance based on the numeric type.
 //               within a default tolerance based on the numeric type.
@@ -139,7 +139,7 @@ almost_equal(const FLOATNAME(LQuaternion)& c) const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::output
+//     Function: LQuaternion::output
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -152,7 +152,17 @@ output(ostream& os) const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::get_r
+//     Function: LQuaternion::set_from_matrix
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+INLINE_LINMATH void FLOATNAME(LQuaternion)::
+set_from_matrix(const FLOATNAME(LMatrix4) &m) {
+  set_from_matrix(m.get_upper_3());
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: LQuaternion::get_r
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -162,7 +172,7 @@ get_r() const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::get_i
+//     Function: LQuaternion::get_i
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -172,7 +182,7 @@ get_i() const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::get_j
+//     Function: LQuaternion::get_j
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -182,7 +192,7 @@ get_j() const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::get_k
+//     Function: LQuaternion::get_k
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -192,7 +202,7 @@ get_k() const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::set_r
+//     Function: LQuaternion::set_r
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -202,7 +212,7 @@ set_r(FLOATTYPE r) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::set_i
+//     Function: LQuaternion::set_i
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -212,7 +222,7 @@ set_i(FLOATTYPE i) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::set_j
+//     Function: LQuaternion::set_j
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -222,7 +232,7 @@ set_j(FLOATTYPE j) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::set_k
+//     Function: LQuaternion::set_k
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -232,7 +242,7 @@ set_k(FLOATTYPE k) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::normalize
+//     Function: LQuaternion::normalize
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -251,13 +261,71 @@ normalize() {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: set_from_matrix
-//       Access: public
-//  Description:
+//     Function: LQuaternion::invert_from
+//       Access: Public
+//  Description: Computes the inverse of the other quat, and stores
+//               the result in this quat.  This is a fully general
+//               operation and makes no assumptions about the type of
+//               transform represented by the quat.
+//
+//               The other quat must be a different object than this
+//               quat.  However, if you need to invert a quat in
+//               place, see invert_in_place.
+//
+//               The return value is true if the quat was
+//               successfully inverted, false if there was a
+//               singularity.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-INLINE_LINMATH void FLOATNAME(LQuaternion)::
-set_from_matrix(const FLOATNAME(LMatrix4) &m) {
-  set_from_matrix(m.get_upper_3());
+INLINE_LINMATH bool FLOATNAME(LQuaternion)::
+invert_from(const FLOATNAME(LQuaternion) &other) {
+  FLOATTYPE norm = 1.0f / (other.dot(other));
+  set(other[0] * norm,
+      -other[1] * norm,
+      -other[2] * norm,
+      -other[3] * norm);
+
+  return true;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: LQuaternion::invert_in_place
+//       Access: Public
+//  Description: Inverts the current quat.  Returns true if the
+//               inverse is successful, false if the quat was
+//               singular.
+////////////////////////////////////////////////////////////////////
+INLINE_LINMATH bool FLOATNAME(LQuaternion)::
+invert_in_place() {
+  FLOATTYPE norm = 1.0f / ((*this).dot(*this));
+  set((*this)[0] * norm,
+      -(*this)[1] * norm,
+      -(*this)[2] * norm,
+      -(*this)[3] * norm);
+
+  return true;
+}
+
+
+////////////////////////////////////////////////////////////////////
+//     Function: LQuaternion::ident_quat
+//       Access: Public, Static
+//  Description: Returns an identity quaternion.
+////////////////////////////////////////////////////////////////////
+INLINE_LINMATH const FLOATNAME(LQuaternion) &FLOATNAME(LQuaternion)::
+ident_quat() {
+  return _ident_quat;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: invert
+//  Description: Inverts the given quat and returns it.
+////////////////////////////////////////////////////////////////////
+INLINE_LINMATH FLOATNAME(LQuaternion)
+invert(const FLOATNAME(LQuaternion) &a) {
+  FLOATNAME(LQuaternion) result;
+  bool nonsingular = result.invert_from(a);
+  nassertr(nonsingular, FLOATNAME(LQuaternion)::ident_quat());
+  return result;
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -293,14 +361,3 @@ INLINE_LINMATH FLOATNAME(LMatrix4) operator *(const FLOATNAME(LMatrix4) &m,
 
 
   return q_matrix;
   return q_matrix;
 }
 }
-
-
-////////////////////////////////////////////////////////////////////
-//     Function: LQuaternion::ident_quat
-//       Access: Public, Static
-//  Description: Returns an identity quaternion.
-////////////////////////////////////////////////////////////////////
-INLINE_LINMATH const FLOATNAME(LQuaternion) &FLOATNAME(LQuaternion)::
-ident_quat() {
-  return _ident_quat;
-}

+ 6 - 6
panda/src/linmath/lquaternion_src.cxx

@@ -22,7 +22,7 @@ const FLOATNAME(LQuaternion) FLOATNAME(LQuaternion)::_ident_quat =
   FLOATNAME(LQuaternion)(1.0f, 0.0f, 0.0f, 0.0f);
   FLOATNAME(LQuaternion)(1.0f, 0.0f, 0.0f, 0.0f);
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: FLOATNAME(LQuaternion)::pure_imaginary_quat
+//     Function: LQuaternion::pure_imaginary_quat
 //       Access: public
 //       Access: public
 //  Description:
 //  Description:
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -32,7 +32,7 @@ pure_imaginary(const FLOATNAME(LVector3) &v) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: extract_to_matrix (LMatrix3)
+//     Function: LQuaternion::extract_to_matrix (LMatrix3)
 //       Access: Public
 //       Access: Public
 //  Description: Based on the quat lib from VRPN.
 //  Description: Based on the quat lib from VRPN.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -53,7 +53,7 @@ extract_to_matrix(FLOATNAME(LMatrix3) &m) const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: extract_to_matrix (LMatrix4)
+//     Function: LQuaternion::extract_to_matrix (LMatrix4)
 //       Access: Public
 //       Access: Public
 //  Description: Based on the quat lib from VRPN.
 //  Description: Based on the quat lib from VRPN.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -75,7 +75,7 @@ extract_to_matrix(FLOATNAME(LMatrix4) &m) const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: set_hpr
+//     Function: LQuaternion::set_hpr
 //       Access: public
 //       Access: public
 //  Description: Sets the quaternion as the unit quaternion that
 //  Description: Sets the quaternion as the unit quaternion that
 //               is equivalent to these Euler angles.
 //               is equivalent to these Euler angles.
@@ -105,7 +105,7 @@ set_hpr(const FLOATNAME(LVecBase3) &hpr) {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: get_hpr
+//     Function: LQuaternion::get_hpr
 //       Access: public
 //       Access: public
 //  Description: Extracts the equivalent Euler angles from the unit
 //  Description: Extracts the equivalent Euler angles from the unit
 //               quaternion.
 //               quaternion.
@@ -156,7 +156,7 @@ get_hpr() const {
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
-//     Function: set_from_matrix
+//     Function: LQuaternion::set_from_matrix
 //       Access: public
 //       Access: public
 //  Description: Sets the quaternion according to the rotation
 //  Description: Sets the quaternion according to the rotation
 //               represented by the matrix.  Originally we tried an
 //               represented by the matrix.  Originally we tried an

+ 5 - 0
panda/src/linmath/lquaternion_src.h

@@ -63,6 +63,9 @@ PUBLISHED:
 
 
   INLINE_LINMATH bool normalize();
   INLINE_LINMATH bool normalize();
 
 
+  INLINE_LINMATH bool invert_from(const FLOATNAME(LQuaternion) &other);
+  INLINE_LINMATH bool invert_in_place();
+
   INLINE_LINMATH static const FLOATNAME(LQuaternion) &ident_quat();
   INLINE_LINMATH static const FLOATNAME(LQuaternion) &ident_quat();
 
 
 private:
 private:
@@ -83,6 +86,8 @@ INLINE_LINMATH ostream& operator<<(ostream& os, const FLOATNAME(LQuaternion)& q)
   return os;
   return os;
 }
 }
 
 
+INLINE_LINMATH FLOATNAME(LQuaternion) invert(const FLOATNAME(LQuaternion) &a);
+
 BEGIN_PUBLISH
 BEGIN_PUBLISH
 INLINE_LINMATH FLOATNAME(LMatrix3)
 INLINE_LINMATH FLOATNAME(LMatrix3)
 operator * (const FLOATNAME(LMatrix3) &m, const FLOATNAME(LQuaternion) &q);
 operator * (const FLOATNAME(LMatrix3) &m, const FLOATNAME(LQuaternion) &q);