docs: def drag(self, NewPt):
          # //Mouse drag, calculate rotation (Point2fT Quat4fT)
          """ drag (Point2fT mouse_coord) -> new_quaternion_rotation_vec
          """
          X = 0
          Y = 1
          Z = 2
          W = 3
  
          self.m_EnVec = self._mapToSphere(NewPt)
  
          # //Compute the vector perpendicular to the begin and end vectors
          # Perp = Vector3fT()
          Perp = Vector3fCross(self.m_StVec, self.m_EnVec)
  
          NewRot = Quat4fT()
          # //Compute the length of the perpendicular vector
          if Vector3fLength(Perp) > Epsilon:        #    //if its non-zero
              # //We're ok, so return the perpendicular vector as the transform after all
              NewRot[X] = Perp[X]
              NewRot[Y] = Perp[Y]
              NewRot[Z] = Perp[Z]
              # //In the quaternion values, w is cosine(theta / 2), where theta is rotation angle
              NewRot[W] = Vector3fDot(self.m_StVec, self.m_EnVec)
          else:       #                            //if its zero
              # //The begin and end vectors coincide, so return a quaternion of zero matrix (no rotation)
              NewRot[X] = NewRot[Y] = NewRot[Z] = NewRot[W] = 0.0
  
          return NewRot