2009-06-17 20:33:34 +00:00
/*
2009-06-23 00:09:26 +00:00
* $ Id $
2009-06-17 20:33:34 +00:00
*
* * * * * * BEGIN GPL LICENSE BLOCK * * * * *
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2009-06-17 20:33:34 +00:00
*
* The Original Code is Copyright ( C ) 2001 - 2002 by NaN Holding BV .
* All rights reserved .
*
*
* Contributor ( s ) : Joseph Gilbert
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
2010-04-11 12:05:27 +00:00
# include "mathutils.h"
2009-06-17 20:33:34 +00:00
2009-11-10 20:43:45 +00:00
# include "BLI_math.h"
2009-06-17 20:33:34 +00:00
# include "BKE_utildefines.h"
2010-04-25 23:33:09 +00:00
# define QUAT_SIZE 4
2009-06-17 20:33:34 +00:00
//-----------------------------METHODS------------------------------
2010-04-25 03:34:16 +00:00
/* note: BaseMath_ReadCallback must be called beforehand */
static PyObject * Quaternion_ToTupleExt ( QuaternionObject * self , int ndigits )
{
PyObject * ret ;
int i ;
2010-04-25 23:33:09 +00:00
ret = PyTuple_New ( QUAT_SIZE ) ;
2010-04-25 03:34:16 +00:00
if ( ndigits > = 0 ) {
2010-04-25 23:33:09 +00:00
for ( i = 0 ; i < QUAT_SIZE ; i + + ) {
2010-04-25 03:34:16 +00:00
PyTuple_SET_ITEM ( ret , i , PyFloat_FromDouble ( double_round ( ( double ) self - > quat [ i ] , ndigits ) ) ) ;
}
}
else {
2010-04-25 23:33:09 +00:00
for ( i = 0 ; i < QUAT_SIZE ; i + + ) {
2010-04-25 03:34:16 +00:00
PyTuple_SET_ITEM ( ret , i , PyFloat_FromDouble ( self - > quat [ i ] ) ) ;
}
}
return ret ;
}
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_ToEuler_doc [ ] =
2010-02-20 19:49:04 +00:00
" .. method:: to_euler(order, euler_compat) \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" \n "
" Return Euler representation of the quaternion. \n "
" \n "
2010-02-20 19:49:04 +00:00
" :arg order: Optional rotation order argument in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']. \n "
" :type order: string \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves. \n "
2010-01-27 21:33:39 +00:00
" :type euler_compat: :class:`Euler` \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" :return: Euler representation of the quaternion. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Euler` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_ToEuler ( QuaternionObject * self , PyObject * args )
2009-06-17 20:33:34 +00:00
{
2010-12-07 01:38:42 +00:00
float tquat [ 4 ] ;
2009-06-17 20:33:34 +00:00
float eul [ 3 ] ;
2010-02-20 19:49:04 +00:00
char * order_str = NULL ;
2010-04-25 23:33:09 +00:00
short order = EULER_ORDER_XYZ ;
2009-06-17 20:33:34 +00:00
EulerObject * eul_compat = NULL ;
2010-02-20 19:49:04 +00:00
if ( ! PyArg_ParseTuple ( args , " |sO!:to_euler " , & order_str , & euler_Type , & eul_compat ) )
2009-06-17 20:33:34 +00:00
return NULL ;
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2010-02-20 19:49:04 +00:00
if ( order_str ) {
order = euler_order_from_string ( order_str , " Matrix.to_euler() " ) ;
2010-04-25 23:33:09 +00:00
if ( order = = - 1 )
2010-02-20 19:49:04 +00:00
return NULL ;
}
2010-12-07 01:38:42 +00:00
normalize_qt_qt ( tquat , self - > quat ) ;
2010-02-20 19:49:04 +00:00
2009-06-17 20:33:34 +00:00
if ( eul_compat ) {
2009-07-09 15:40:04 +00:00
float mat [ 3 ] [ 3 ] ;
2009-06-17 20:33:34 +00:00
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( eul_compat ) )
return NULL ;
2010-12-07 01:38:42 +00:00
quat_to_mat3 ( mat , tquat ) ;
2009-07-09 15:40:04 +00:00
2010-04-25 23:33:09 +00:00
if ( order = = EULER_ORDER_XYZ ) mat3_to_compatible_eul ( eul , eul_compat - > eul , mat ) ;
else mat3_to_compatible_eulO ( eul , eul_compat - > eul , order , mat ) ;
2009-06-17 20:33:34 +00:00
}
else {
2010-12-07 01:38:42 +00:00
if ( order = = EULER_ORDER_XYZ ) quat_to_eul ( eul , tquat ) ;
else quat_to_eulO ( eul , order , tquat ) ;
2009-06-17 20:33:34 +00:00
}
2010-02-20 19:49:04 +00:00
return newEulerObject ( eul , order , Py_NEW , NULL ) ;
2009-06-17 20:33:34 +00:00
}
//----------------------------Quaternion.toMatrix()------------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_ToMatrix_doc [ ] =
2010-08-16 12:14:09 +00:00
" .. method:: to_matrix() \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" \n "
" Return a matrix representation of the quaternion. \n "
" \n "
" :return: A 3x3 rotation matrix representation of the quaternion. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Matrix` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_ToMatrix ( QuaternionObject * self )
2009-06-17 20:33:34 +00:00
{
2009-06-25 20:47:41 +00:00
float mat [ 9 ] ; /* all values are set */
2009-06-17 20:33:34 +00:00
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-11-10 20:43:45 +00:00
quat_to_mat3 ( ( float ( * ) [ 3 ] ) mat , self - > quat ) ;
2009-06-30 00:42:17 +00:00
return newMatrixObject ( mat , 3 , 3 , Py_NEW , NULL ) ;
2009-06-17 20:33:34 +00:00
}
//----------------------------Quaternion.cross(other)------------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Cross_doc [ ] =
" .. method:: cross(other) \n "
" \n "
" Return the cross product of this quaternion and another. \n "
" \n "
" :arg other: The other quaternion to perform the cross product with. \n "
2010-01-27 21:33:39 +00:00
" :type other: :class:`Quaternion` \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" :return: The cross product. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2010-11-23 16:45:17 +00:00
static PyObject * Quaternion_Cross ( QuaternionObject * self , QuaternionObject * value )
2009-06-17 20:33:34 +00:00
{
2010-04-25 23:33:09 +00:00
float quat [ QUAT_SIZE ] ;
2009-06-17 20:33:34 +00:00
if ( ! QuaternionObject_Check ( value ) ) {
2010-11-23 16:45:17 +00:00
PyErr_Format ( PyExc_TypeError , " quat.cross(value): expected a quaternion argument, not %.200s " , Py_TYPE ( value ) - > tp_name ) ;
2009-06-17 20:33:34 +00:00
return NULL ;
}
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) | | ! BaseMath_ReadCallback ( value ) )
return NULL ;
2009-11-10 20:43:45 +00:00
mul_qt_qtqt ( quat , self - > quat , value - > quat ) ;
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( self ) ) ;
2009-06-17 20:33:34 +00:00
}
//----------------------------Quaternion.dot(other)------------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Dot_doc [ ] =
" .. method:: dot(other) \n "
" \n "
" Return the dot product of this quaternion and another. \n "
" \n "
" :arg other: The other quaternion to perform the dot product with. \n "
2010-01-27 21:33:39 +00:00
" :type other: :class:`Quaternion` \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" :return: The dot product. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_Dot ( QuaternionObject * self , QuaternionObject * value )
2009-06-17 20:33:34 +00:00
{
if ( ! QuaternionObject_Check ( value ) ) {
2010-11-23 16:45:17 +00:00
PyErr_Format ( PyExc_TypeError , " quat.dot(value): expected a quaternion argument, not %.200s " , Py_TYPE ( value ) - > tp_name ) ;
2009-06-17 20:33:34 +00:00
return NULL ;
}
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) | | ! BaseMath_ReadCallback ( value ) )
return NULL ;
2009-11-10 20:43:45 +00:00
return PyFloat_FromDouble ( dot_qtqt ( self - > quat , value - > quat ) ) ;
2009-06-17 20:33:34 +00:00
}
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Difference_doc [ ] =
" .. function:: difference(other) \n "
" \n "
" Returns a quaternion representing the rotational difference. \n "
" \n "
" :arg other: second quaternion. \n "
2010-01-27 21:33:39 +00:00
" :type other: :class:`Quaternion` \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" :return: the rotational difference between the two quat rotations. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static PyObject * Quaternion_Difference ( QuaternionObject * self , QuaternionObject * value )
{
2010-07-26 00:11:14 +00:00
float quat [ QUAT_SIZE ] ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
if ( ! QuaternionObject_Check ( value ) ) {
2010-11-23 16:45:17 +00:00
PyErr_Format ( PyExc_TypeError , " quat.difference(value): expected a quaternion argument, not %.200s " , Py_TYPE ( value ) - > tp_name ) ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
return NULL ;
}
if ( ! BaseMath_ReadCallback ( self ) | | ! BaseMath_ReadCallback ( value ) )
return NULL ;
2010-07-26 00:11:14 +00:00
rotation_between_quats_to_quat ( quat , self - > quat , value - > quat ) ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( self ) ) ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
}
static char Quaternion_Slerp_doc [ ] =
" .. function:: slerp(other, factor) \n "
" \n "
" Returns the interpolation of two quaternions. \n "
" \n "
" :arg other: value to interpolate with. \n "
2010-01-27 21:33:39 +00:00
" :type other: :class:`Quaternion` \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" :arg factor: The interpolation value in [0.0, 1.0]. \n "
" :type factor: float \n "
" :return: The interpolated rotation. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static PyObject * Quaternion_Slerp ( QuaternionObject * self , PyObject * args )
{
QuaternionObject * value ;
2010-04-25 23:33:09 +00:00
float quat [ QUAT_SIZE ] , fac ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2010-02-20 19:49:04 +00:00
if ( ! PyArg_ParseTuple ( args , " O!f:slerp " , & quaternion_Type , & value , & fac ) ) {
PyErr_SetString ( PyExc_TypeError , " quat.slerp(): expected Quaternion types and float " ) ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
return NULL ;
}
if ( ! BaseMath_ReadCallback ( self ) | | ! BaseMath_ReadCallback ( value ) )
return NULL ;
if ( fac > 1.0f | | fac < 0.0f ) {
2010-02-20 19:49:04 +00:00
PyErr_SetString ( PyExc_AttributeError , " quat.slerp(): interpolation factor must be between 0.0 and 1.0 " ) ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
return NULL ;
}
interp_qt_qtqt ( quat , self - > quat , value - > quat , fac ) ;
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( self ) ) ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
}
2009-06-17 20:33:34 +00:00
//----------------------------Quaternion.normalize()----------------
//normalize the axis of rotation of [theta,vector]
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Normalize_doc [ ] =
" .. function:: normalize() \n "
" \n "
" Normalize the quaternion. \n "
" \n "
" :return: an instance of itself. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_Normalize ( QuaternionObject * self )
2009-06-17 20:33:34 +00:00
{
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-11-10 20:43:45 +00:00
normalize_qt ( self - > quat ) ;
2009-06-25 10:11:37 +00:00
2010-10-20 12:11:09 +00:00
( void ) BaseMath_WriteCallback ( self ) ;
2009-06-17 20:33:34 +00:00
Py_INCREF ( self ) ;
return ( PyObject * ) self ;
}
//----------------------------Quaternion.inverse()------------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Inverse_doc [ ] =
" .. function:: inverse() \n "
" \n "
" Set the quaternion to its inverse. \n "
" \n "
" :return: an instance of itself. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_Inverse ( QuaternionObject * self )
2009-06-17 20:33:34 +00:00
{
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-06-17 20:33:34 +00:00
2009-11-10 20:43:45 +00:00
invert_qt ( self - > quat ) ;
2009-06-17 20:33:34 +00:00
2010-10-20 12:11:09 +00:00
( void ) BaseMath_WriteCallback ( self ) ;
2009-06-17 20:33:34 +00:00
Py_INCREF ( self ) ;
return ( PyObject * ) self ;
}
//----------------------------Quaternion.identity()-----------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Identity_doc [ ] =
" .. function:: identity() \n "
" \n "
" Set the quaternion to an identity quaternion. \n "
" \n "
" :return: an instance of itself. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_Identity ( QuaternionObject * self )
2009-06-17 20:33:34 +00:00
{
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-11-10 20:43:45 +00:00
unit_qt ( self - > quat ) ;
2009-06-17 20:33:34 +00:00
2010-10-20 12:11:09 +00:00
( void ) BaseMath_WriteCallback ( self ) ;
2009-06-17 20:33:34 +00:00
Py_INCREF ( self ) ;
return ( PyObject * ) self ;
}
//----------------------------Quaternion.negate()-------------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Negate_doc [ ] =
" .. function:: negate() \n "
" \n "
" Set the quaternion to its negative. \n "
" \n "
" :return: an instance of itself. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_Negate ( QuaternionObject * self )
2009-06-17 20:33:34 +00:00
{
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-11-10 20:43:45 +00:00
mul_qt_fl ( self - > quat , - 1.0f ) ;
2009-06-25 10:11:37 +00:00
2010-10-20 12:11:09 +00:00
( void ) BaseMath_WriteCallback ( self ) ;
2009-06-17 20:33:34 +00:00
Py_INCREF ( self ) ;
return ( PyObject * ) self ;
}
//----------------------------Quaternion.conjugate()----------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_Conjugate_doc [ ] =
" .. function:: conjugate() \n "
" \n "
" Set the quaternion to its conjugate (negate x, y, z). \n "
" \n "
" :return: an instance of itself. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n " ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2009-06-20 02:44:57 +00:00
static PyObject * Quaternion_Conjugate ( QuaternionObject * self )
2009-06-17 20:33:34 +00:00
{
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-11-10 20:43:45 +00:00
conjugate_qt ( self - > quat ) ;
2009-06-25 10:11:37 +00:00
2010-10-20 12:11:09 +00:00
( void ) BaseMath_WriteCallback ( self ) ;
2009-06-17 20:33:34 +00:00
Py_INCREF ( self ) ;
return ( PyObject * ) self ;
}
//----------------------------Quaternion.copy()----------------
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
static char Quaternion_copy_doc [ ] =
" .. function:: copy() \n "
" \n "
" Returns a copy of this quaternion. \n "
" \n "
" :return: A copy of the quaternion. \n "
2010-01-27 21:33:39 +00:00
" :rtype: :class:`Quaternion` \n "
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
" \n "
" .. note:: use this to get a copy of a wrapped quaternion with no reference to the original data. \n " ;
2010-10-13 23:25:08 +00:00
static PyObject * Quaternion_copy ( QuaternionObject * self )
2009-06-17 20:33:34 +00:00
{
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-06-17 20:33:34 +00:00
2009-06-30 00:42:17 +00:00
return newQuaternionObject ( self - > quat , Py_NEW , Py_TYPE ( self ) ) ;
2009-06-17 20:33:34 +00:00
}
//----------------------------print object (internal)--------------
//print the object to screen
static PyObject * Quaternion_repr ( QuaternionObject * self )
{
2010-04-25 03:34:16 +00:00
PyObject * ret , * tuple ;
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2010-04-25 03:34:16 +00:00
tuple = Quaternion_ToTupleExt ( self , - 1 ) ;
2010-04-19 22:02:53 +00:00
2010-04-25 19:27:59 +00:00
ret = PyUnicode_FromFormat ( " Quaternion(%R) " , tuple ) ;
2010-04-19 22:02:53 +00:00
2010-04-25 03:34:16 +00:00
Py_DECREF ( tuple ) ;
2010-04-19 22:02:53 +00:00
return ret ;
2009-06-17 20:33:34 +00:00
}
2010-04-25 03:34:16 +00:00
2009-06-17 20:33:34 +00:00
//------------------------tp_richcmpr
//returns -1 execption, 0 false, 1 true
static PyObject * Quaternion_richcmpr ( PyObject * objectA , PyObject * objectB , int comparison_type )
{
QuaternionObject * quatA = NULL , * quatB = NULL ;
int result = 0 ;
2009-06-25 10:11:37 +00:00
if ( QuaternionObject_Check ( objectA ) ) {
quatA = ( QuaternionObject * ) objectA ;
if ( ! BaseMath_ReadCallback ( quatA ) )
return NULL ;
}
if ( QuaternionObject_Check ( objectB ) ) {
quatB = ( QuaternionObject * ) objectB ;
if ( ! BaseMath_ReadCallback ( quatB ) )
return NULL ;
}
if ( ! quatA | | ! quatB ) {
2009-06-17 20:33:34 +00:00
if ( comparison_type = = Py_NE ) {
Py_RETURN_TRUE ;
} else {
Py_RETURN_FALSE ;
}
}
switch ( comparison_type ) {
case Py_EQ :
2010-04-25 23:33:09 +00:00
result = EXPP_VectorsAreEqual ( quatA - > quat , quatB - > quat , QUAT_SIZE , 1 ) ;
2009-06-17 20:33:34 +00:00
break ;
case Py_NE :
2010-04-25 23:33:09 +00:00
result = EXPP_VectorsAreEqual ( quatA - > quat , quatB - > quat , QUAT_SIZE , 1 ) ;
2009-06-17 20:33:34 +00:00
if ( result = = 0 ) {
result = 1 ;
} else {
result = 0 ;
}
break ;
default :
printf ( " The result of the comparison could not be evaluated " ) ;
break ;
}
if ( result = = 1 ) {
Py_RETURN_TRUE ;
} else {
Py_RETURN_FALSE ;
}
}
2009-06-30 00:42:17 +00:00
2009-06-17 20:33:34 +00:00
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
2010-10-13 23:25:08 +00:00
static int Quaternion_len ( QuaternionObject * UNUSED ( self ) )
2009-06-17 20:33:34 +00:00
{
2010-04-25 23:33:09 +00:00
return QUAT_SIZE ;
2009-06-17 20:33:34 +00:00
}
//----------------------------object[]---------------------------
//sequence accessor (get)
static PyObject * Quaternion_item ( QuaternionObject * self , int i )
{
2010-04-25 23:33:09 +00:00
if ( i < 0 ) i = QUAT_SIZE - i ;
2009-06-25 10:11:37 +00:00
2010-04-25 23:33:09 +00:00
if ( i < 0 | | i > = QUAT_SIZE ) {
2010-11-23 16:45:17 +00:00
PyErr_SetString ( PyExc_IndexError , " quaternion[attribute]: array index out of range " ) ;
2009-06-17 20:33:34 +00:00
return NULL ;
}
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadIndexCallback ( self , i ) )
return NULL ;
2009-06-17 20:33:34 +00:00
return PyFloat_FromDouble ( self - > quat [ i ] ) ;
}
//----------------------------object[]-------------------------
//sequence accessor (set)
static int Quaternion_ass_item ( QuaternionObject * self , int i , PyObject * ob )
{
2009-06-25 10:11:37 +00:00
float scalar = ( float ) PyFloat_AsDouble ( ob ) ;
if ( scalar = = - 1.0f & & PyErr_Occurred ( ) ) { /* parsed item not a number */
2010-11-23 16:45:17 +00:00
PyErr_SetString ( PyExc_TypeError , " quaternion[index] = x: index argument not a number " ) ;
2009-06-17 20:33:34 +00:00
return - 1 ;
}
2010-04-25 23:33:09 +00:00
if ( i < 0 ) i = QUAT_SIZE - i ;
2009-06-25 10:11:37 +00:00
2010-04-25 23:33:09 +00:00
if ( i < 0 | | i > = QUAT_SIZE ) {
2010-11-23 16:45:17 +00:00
PyErr_SetString ( PyExc_IndexError , " quaternion[attribute] = x: array assignment index out of range " ) ;
2009-06-17 20:33:34 +00:00
return - 1 ;
}
2009-06-25 10:11:37 +00:00
self - > quat [ i ] = scalar ;
if ( ! BaseMath_WriteIndexCallback ( self , i ) )
return - 1 ;
2009-06-17 20:33:34 +00:00
return 0 ;
}
//----------------------------object[z:y]------------------------
//sequence slice (get)
static PyObject * Quaternion_slice ( QuaternionObject * self , int begin , int end )
{
2010-12-24 03:51:34 +00:00
PyObject * tuple ;
2009-06-17 20:33:34 +00:00
int count ;
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2010-04-25 23:33:09 +00:00
CLAMP ( begin , 0 , QUAT_SIZE ) ;
if ( end < 0 ) end = ( QUAT_SIZE + 1 ) + end ;
CLAMP ( end , 0 , QUAT_SIZE ) ;
2010-12-24 03:51:34 +00:00
begin = MIN2 ( begin , end ) ;
2009-06-17 20:33:34 +00:00
2010-12-24 03:51:34 +00:00
tuple = PyTuple_New ( end - begin ) ;
for ( count = begin ; count < end ; count + + ) {
PyTuple_SET_ITEM ( tuple , count - begin , PyFloat_FromDouble ( self - > quat [ count ] ) ) ;
2009-06-17 20:33:34 +00:00
}
2010-12-24 03:51:34 +00:00
return tuple ;
2009-06-17 20:33:34 +00:00
}
//----------------------------object[z:y]------------------------
//sequence slice (set)
2009-06-25 10:11:37 +00:00
static int Quaternion_ass_slice ( QuaternionObject * self , int begin , int end , PyObject * seq )
2009-06-17 20:33:34 +00:00
{
2010-04-25 23:33:09 +00:00
int i , size ;
float quat [ QUAT_SIZE ] ;
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return - 1 ;
2009-06-17 20:33:34 +00:00
2010-04-25 23:33:09 +00:00
CLAMP ( begin , 0 , QUAT_SIZE ) ;
if ( end < 0 ) end = ( QUAT_SIZE + 1 ) + end ;
CLAMP ( end , 0 , QUAT_SIZE ) ;
2009-06-17 20:33:34 +00:00
begin = MIN2 ( begin , end ) ;
2010-04-25 23:33:09 +00:00
if ( ( size = mathutils_array_parse ( quat , 0 , QUAT_SIZE , seq , " mathutils.Quaternion[begin:end] = [] " ) ) = = - 1 )
return - 1 ;
2009-06-17 20:33:34 +00:00
if ( size ! = ( end - begin ) ) {
2010-04-25 23:33:09 +00:00
PyErr_SetString ( PyExc_TypeError , " quaternion[begin:end] = []: size mismatch in slice assignment " ) ;
2009-06-17 20:33:34 +00:00
return - 1 ;
}
2010-04-25 23:33:09 +00:00
/* parsed well - now set in vector */
for ( i = 0 ; i < size ; i + + )
self - > quat [ begin + i ] = quat [ i ] ;
2010-10-20 12:11:09 +00:00
( void ) BaseMath_WriteCallback ( self ) ;
2010-04-25 23:33:09 +00:00
return 0 ;
}
static PyObject * Quaternion_subscript ( QuaternionObject * self , PyObject * item )
{
if ( PyIndex_Check ( item ) ) {
Py_ssize_t i ;
i = PyNumber_AsSsize_t ( item , PyExc_IndexError ) ;
if ( i = = - 1 & & PyErr_Occurred ( ) )
return NULL ;
if ( i < 0 )
i + = QUAT_SIZE ;
return Quaternion_item ( self , i ) ;
} else if ( PySlice_Check ( item ) ) {
Py_ssize_t start , stop , step , slicelength ;
if ( PySlice_GetIndicesEx ( ( PySliceObject * ) item , QUAT_SIZE , & start , & stop , & step , & slicelength ) < 0 )
return NULL ;
if ( slicelength < = 0 ) {
return PyList_New ( 0 ) ;
}
else if ( step = = 1 ) {
return Quaternion_slice ( self , start , stop ) ;
2009-06-17 20:33:34 +00:00
}
2010-04-25 23:33:09 +00:00
else {
PyErr_SetString ( PyExc_TypeError , " slice steps not supported with quaternions " ) ;
return NULL ;
}
}
else {
2010-11-28 06:03:30 +00:00
PyErr_Format ( PyExc_TypeError , " quaternion indices must be integers, not %.200s " , Py_TYPE ( item ) - > tp_name ) ;
2010-04-25 23:33:09 +00:00
return NULL ;
}
}
2009-06-17 20:33:34 +00:00
2009-06-25 10:11:37 +00:00
2010-04-25 23:33:09 +00:00
static int Quaternion_ass_subscript ( QuaternionObject * self , PyObject * item , PyObject * value )
{
if ( PyIndex_Check ( item ) ) {
Py_ssize_t i = PyNumber_AsSsize_t ( item , PyExc_IndexError ) ;
if ( i = = - 1 & & PyErr_Occurred ( ) )
2009-06-17 20:33:34 +00:00
return - 1 ;
2010-04-25 23:33:09 +00:00
if ( i < 0 )
i + = QUAT_SIZE ;
return Quaternion_ass_item ( self , i , value ) ;
2009-06-17 20:33:34 +00:00
}
2010-04-25 23:33:09 +00:00
else if ( PySlice_Check ( item ) ) {
Py_ssize_t start , stop , step , slicelength ;
2009-06-25 10:11:37 +00:00
2010-04-25 23:33:09 +00:00
if ( PySlice_GetIndicesEx ( ( PySliceObject * ) item , QUAT_SIZE , & start , & stop , & step , & slicelength ) < 0 )
return - 1 ;
if ( step = = 1 )
return Quaternion_ass_slice ( self , start , stop , value ) ;
else {
PyErr_SetString ( PyExc_TypeError , " slice steps not supported with quaternion " ) ;
return - 1 ;
}
}
else {
2010-11-28 06:03:30 +00:00
PyErr_Format ( PyExc_TypeError , " quaternion indices must be integers, not %.200s " , Py_TYPE ( item ) - > tp_name ) ;
2010-04-25 23:33:09 +00:00
return - 1 ;
}
2009-06-17 20:33:34 +00:00
}
2010-04-25 23:33:09 +00:00
2009-06-17 20:33:34 +00:00
//------------------------NUMERIC PROTOCOLS----------------------
//------------------------obj + obj------------------------------
//addition
static PyObject * Quaternion_add ( PyObject * q1 , PyObject * q2 )
{
2010-04-25 23:33:09 +00:00
float quat [ QUAT_SIZE ] ;
2009-06-17 20:33:34 +00:00
QuaternionObject * quat1 = NULL , * quat2 = NULL ;
2009-06-18 23:12:29 +00:00
if ( ! QuaternionObject_Check ( q1 ) | | ! QuaternionObject_Check ( q2 ) ) {
2010-11-23 16:45:17 +00:00
PyErr_SetString ( PyExc_AttributeError , " Quaternion addition: arguments not valid for this operation " ) ;
2009-06-17 20:33:34 +00:00
return NULL ;
}
2009-06-18 23:12:29 +00:00
quat1 = ( QuaternionObject * ) q1 ;
quat2 = ( QuaternionObject * ) q2 ;
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( quat1 ) | | ! BaseMath_ReadCallback ( quat2 ) )
return NULL ;
2009-06-17 20:33:34 +00:00
2009-11-10 20:43:45 +00:00
add_qt_qtqt ( quat , quat1 - > quat , quat2 - > quat , 1.0f ) ;
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( q1 ) ) ;
2009-06-17 20:33:34 +00:00
}
//------------------------obj - obj------------------------------
//subtraction
static PyObject * Quaternion_sub ( PyObject * q1 , PyObject * q2 )
{
int x ;
2010-04-25 23:33:09 +00:00
float quat [ QUAT_SIZE ] ;
2009-06-17 20:33:34 +00:00
QuaternionObject * quat1 = NULL , * quat2 = NULL ;
2009-06-18 23:12:29 +00:00
if ( ! QuaternionObject_Check ( q1 ) | | ! QuaternionObject_Check ( q2 ) ) {
2010-11-23 16:45:17 +00:00
PyErr_SetString ( PyExc_AttributeError , " Quaternion addition: arguments not valid for this operation " ) ;
2009-06-17 20:33:34 +00:00
return NULL ;
}
2009-06-18 23:12:29 +00:00
quat1 = ( QuaternionObject * ) q1 ;
quat2 = ( QuaternionObject * ) q2 ;
2009-06-25 10:11:37 +00:00
if ( ! BaseMath_ReadCallback ( quat1 ) | | ! BaseMath_ReadCallback ( quat2 ) )
return NULL ;
2010-04-25 23:33:09 +00:00
for ( x = 0 ; x < QUAT_SIZE ; x + + ) {
2009-06-17 20:33:34 +00:00
quat [ x ] = quat1 - > quat [ x ] - quat2 - > quat [ x ] ;
}
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( q1 ) ) ;
2009-06-17 20:33:34 +00:00
}
//------------------------obj * obj------------------------------
//mulplication
static PyObject * Quaternion_mul ( PyObject * q1 , PyObject * q2 )
{
2010-04-25 23:33:09 +00:00
float quat [ QUAT_SIZE ] , scalar ;
2009-06-17 20:33:34 +00:00
QuaternionObject * quat1 = NULL , * quat2 = NULL ;
2009-06-25 10:11:37 +00:00
if ( QuaternionObject_Check ( q1 ) ) {
quat1 = ( QuaternionObject * ) q1 ;
if ( ! BaseMath_ReadCallback ( quat1 ) )
return NULL ;
}
if ( QuaternionObject_Check ( q2 ) ) {
quat2 = ( QuaternionObject * ) q2 ;
if ( ! BaseMath_ReadCallback ( quat2 ) )
return NULL ;
}
2009-06-17 20:33:34 +00:00
2010-08-02 00:08:01 +00:00
if ( quat1 & & quat2 ) { /* QUAT*QUAT (cross product) */
mul_qt_qtqt ( quat , quat1 - > quat , quat2 - > quat ) ;
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( q1 ) ) ;
2009-06-18 23:12:29 +00:00
}
/* the only case this can happen (for a supported type is "FLOAT*QUAT" ) */
if ( ! QuaternionObject_Check ( q1 ) ) {
scalar = PyFloat_AsDouble ( q1 ) ;
if ( ( scalar = = - 1.0 & & PyErr_Occurred ( ) ) = = 0 ) { /* FLOAT*QUAT */
2009-06-25 10:11:37 +00:00
QUATCOPY ( quat , quat2 - > quat ) ;
2009-11-10 20:43:45 +00:00
mul_qt_fl ( quat , scalar ) ;
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( q2 ) ) ;
2009-06-17 20:33:34 +00:00
}
2009-06-18 23:12:29 +00:00
PyErr_SetString ( PyExc_TypeError , " Quaternion multiplication: val * quat, val is not an acceptable type " ) ;
return NULL ;
}
else { /* QUAT*SOMETHING */
if ( VectorObject_Check ( q2 ) ) { /* QUAT*VEC */
2010-11-12 01:38:18 +00:00
PyErr_SetString ( PyExc_TypeError , " Quaternion multiplication: Only 'vector * quaternion' is supported, not the reverse " ) ;
return NULL ;
2009-06-18 23:12:29 +00:00
}
scalar = PyFloat_AsDouble ( q2 ) ;
if ( ( scalar = = - 1.0 & & PyErr_Occurred ( ) ) = = 0 ) { /* QUAT*FLOAT */
2009-06-25 10:11:37 +00:00
QUATCOPY ( quat , quat1 - > quat ) ;
2009-11-10 20:43:45 +00:00
mul_qt_fl ( quat , scalar ) ;
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , Py_TYPE ( q1 ) ) ;
2009-06-17 20:33:34 +00:00
}
}
2009-06-18 23:12:29 +00:00
2010-11-23 16:45:17 +00:00
PyErr_SetString ( PyExc_TypeError , " Quaternion multiplication: arguments not acceptable for this operation " ) ;
2009-06-17 20:33:34 +00:00
return NULL ;
}
//-----------------PROTOCOL DECLARATIONS--------------------------
static PySequenceMethods Quaternion_SeqMethods = {
2010-05-16 10:09:07 +00:00
( lenfunc ) Quaternion_len , /* sq_length */
( binaryfunc ) NULL , /* sq_concat */
( ssizeargfunc ) NULL , /* sq_repeat */
( ssizeargfunc ) Quaternion_item , /* sq_item */
( ssizessizeargfunc ) NULL , /* sq_slice, deprecated */
( ssizeobjargproc ) Quaternion_ass_item , /* sq_ass_item */
( ssizessizeobjargproc ) NULL , /* sq_ass_slice, deprecated */
( objobjproc ) NULL , /* sq_contains */
( binaryfunc ) NULL , /* sq_inplace_concat */
( ssizeargfunc ) NULL , /* sq_inplace_repeat */
2010-04-25 23:33:09 +00:00
} ;
static PyMappingMethods Quaternion_AsMapping = {
( lenfunc ) Quaternion_len ,
( binaryfunc ) Quaternion_subscript ,
( objobjargproc ) Quaternion_ass_subscript
2009-06-17 20:33:34 +00:00
} ;
2009-06-28 13:27:06 +00:00
static PyNumberMethods Quaternion_NumMethods = {
2010-04-25 23:33:09 +00:00
( binaryfunc ) Quaternion_add , /*nb_add*/
( binaryfunc ) Quaternion_sub , /*nb_subtract*/
( binaryfunc ) Quaternion_mul , /*nb_multiply*/
0 , /*nb_remainder*/
0 , /*nb_divmod*/
0 , /*nb_power*/
( unaryfunc ) 0 , /*nb_negative*/
( unaryfunc ) 0 , /*tp_positive*/
( unaryfunc ) 0 , /*tp_absolute*/
( inquiry ) 0 , /*tp_bool*/
( unaryfunc ) 0 , /*nb_invert*/
0 , /*nb_lshift*/
( binaryfunc ) 0 , /*nb_rshift*/
0 , /*nb_and*/
0 , /*nb_xor*/
0 , /*nb_or*/
0 , /*nb_int*/
0 , /*nb_reserved*/
0 , /*nb_float*/
0 , /* nb_inplace_add */
0 , /* nb_inplace_subtract */
0 , /* nb_inplace_multiply */
0 , /* nb_inplace_remainder */
0 , /* nb_inplace_power */
0 , /* nb_inplace_lshift */
0 , /* nb_inplace_rshift */
0 , /* nb_inplace_and */
0 , /* nb_inplace_xor */
0 , /* nb_inplace_or */
0 , /* nb_floor_divide */
0 , /* nb_true_divide */
0 , /* nb_inplace_floor_divide */
0 , /* nb_inplace_true_divide */
0 , /* nb_index */
2009-06-28 13:27:06 +00:00
} ;
2009-06-17 20:33:34 +00:00
static PyObject * Quaternion_getAxis ( QuaternionObject * self , void * type )
{
2009-06-25 10:11:37 +00:00
return Quaternion_item ( self , GET_INT_FROM_POINTER ( type ) ) ;
2009-06-17 20:33:34 +00:00
}
static int Quaternion_setAxis ( QuaternionObject * self , PyObject * value , void * type )
{
2009-06-25 10:11:37 +00:00
return Quaternion_ass_item ( self , GET_INT_FROM_POINTER ( type ) , value ) ;
2009-06-17 20:33:34 +00:00
}
2010-10-13 23:25:08 +00:00
static PyObject * Quaternion_getMagnitude ( QuaternionObject * self , void * UNUSED ( closure ) )
2009-06-17 20:33:34 +00:00
{
2010-07-25 02:56:39 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2009-11-10 20:43:45 +00:00
return PyFloat_FromDouble ( sqrt ( dot_qtqt ( self - > quat , self - > quat ) ) ) ;
2009-06-17 20:33:34 +00:00
}
2010-10-13 23:25:08 +00:00
static PyObject * Quaternion_getAngle ( QuaternionObject * self , void * UNUSED ( closure ) )
2009-06-17 20:33:34 +00:00
{
2010-12-07 01:38:42 +00:00
float tquat [ 4 ] ;
2010-07-25 02:56:39 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2010-12-07 01:38:42 +00:00
normalize_qt_qt ( tquat , self - > quat ) ;
return PyFloat_FromDouble ( 2.0 * ( saacos ( tquat [ 0 ] ) ) ) ;
2009-06-17 20:33:34 +00:00
}
2010-10-13 23:25:08 +00:00
static int Quaternion_setAngle ( QuaternionObject * self , PyObject * value , void * UNUSED ( closure ) )
2009-06-17 20:33:34 +00:00
{
2010-12-07 01:38:42 +00:00
float tquat [ 4 ] ;
float len ;
2010-07-25 02:56:39 +00:00
float axis [ 3 ] ;
float angle ;
2010-04-25 23:33:09 +00:00
2010-07-25 02:56:39 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return - 1 ;
2010-12-07 01:38:42 +00:00
len = normalize_qt_qt ( tquat , self - > quat ) ;
quat_to_axis_angle ( axis , & angle , tquat ) ;
2010-07-25 02:56:39 +00:00
angle = PyFloat_AsDouble ( value ) ;
if ( angle = = - 1.0f & & PyErr_Occurred ( ) ) { /* parsed item not a number */
PyErr_SetString ( PyExc_TypeError , " quaternion.angle = value: float expected " ) ;
return - 1 ;
}
2010-04-25 23:33:09 +00:00
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
2010-07-25 02:56:39 +00:00
if ( EXPP_FloatsAreEqual ( axis [ 0 ] , 0.0f , 10 ) & &
EXPP_FloatsAreEqual ( axis [ 1 ] , 0.0f , 10 ) & &
EXPP_FloatsAreEqual ( axis [ 2 ] , 0.0f , 10 )
) {
axis [ 0 ] = 1.0f ;
2009-06-17 20:33:34 +00:00
}
2010-07-25 02:56:39 +00:00
axis_angle_to_quat ( self - > quat , axis , angle ) ;
2010-12-07 01:38:42 +00:00
mul_qt_fl ( self - > quat , len ) ;
2010-07-25 02:56:39 +00:00
if ( ! BaseMath_WriteCallback ( self ) )
return - 1 ;
return 0 ;
}
2010-10-13 23:25:08 +00:00
static PyObject * Quaternion_getAxisVec ( QuaternionObject * self , void * UNUSED ( closure ) )
2010-07-25 02:56:39 +00:00
{
2010-12-07 01:38:42 +00:00
float tquat [ 4 ] ;
2010-07-25 02:56:39 +00:00
float axis [ 3 ] ;
float angle ;
if ( ! BaseMath_ReadCallback ( self ) )
return NULL ;
2010-12-07 01:38:42 +00:00
normalize_qt_qt ( tquat , self - > quat ) ;
quat_to_axis_angle ( axis , & angle , tquat ) ;
2010-07-25 02:56:39 +00:00
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
if ( EXPP_FloatsAreEqual ( axis [ 0 ] , 0.0f , 10 ) & &
EXPP_FloatsAreEqual ( axis [ 1 ] , 0.0f , 10 ) & &
EXPP_FloatsAreEqual ( axis [ 2 ] , 0.0f , 10 )
) {
axis [ 0 ] = 1.0f ;
}
return ( PyObject * ) newVectorObject ( axis , 3 , Py_NEW , NULL ) ;
}
2010-10-13 23:25:08 +00:00
static int Quaternion_setAxisVec ( QuaternionObject * self , PyObject * value , void * UNUSED ( closure ) )
2010-07-25 02:56:39 +00:00
{
2010-12-07 01:38:42 +00:00
float tquat [ 4 ] ;
float len ;
2010-07-25 02:56:39 +00:00
float axis [ 3 ] ;
float angle ;
VectorObject * vec ;
2010-12-07 01:38:42 +00:00
2010-07-25 02:56:39 +00:00
if ( ! BaseMath_ReadCallback ( self ) )
return - 1 ;
2010-12-07 01:38:42 +00:00
len = normalize_qt_qt ( tquat , self - > quat ) ;
quat_to_axis_angle ( axis , & angle , tquat ) ;
2010-07-25 02:56:39 +00:00
if ( ! VectorObject_Check ( value ) ) {
PyErr_SetString ( PyExc_TypeError , " quaternion.axis = value: expected a 3D Vector " ) ;
return - 1 ;
}
vec = ( VectorObject * ) value ;
if ( ! BaseMath_ReadCallback ( vec ) )
return - 1 ;
axis_angle_to_quat ( self - > quat , vec - > vec , angle ) ;
2010-12-07 01:38:42 +00:00
mul_qt_fl ( self - > quat , len ) ;
2010-07-25 02:56:39 +00:00
if ( ! BaseMath_WriteCallback ( self ) )
return - 1 ;
return 0 ;
2009-06-17 20:33:34 +00:00
}
2010-04-11 14:22:27 +00:00
//----------------------------------mathutils.Quaternion() --------------
2010-11-28 06:03:30 +00:00
static PyObject * Quaternion_new ( PyTypeObject * type , PyObject * args , PyObject * kwds )
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
{
2010-04-25 19:27:59 +00:00
PyObject * seq = NULL ;
2010-04-26 21:25:14 +00:00
float angle = 0.0f ;
2010-04-25 23:33:09 +00:00
float quat [ QUAT_SIZE ] = { 0.0f , 0.0f , 0.0f , 0.0f } ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2010-10-13 23:25:08 +00:00
if ( kwds & & PyDict_Size ( kwds ) ) {
PyErr_SetString ( PyExc_TypeError , " mathutils.Quaternion(): takes no keyword args " ) ;
return NULL ;
}
2010-04-25 19:27:59 +00:00
if ( ! PyArg_ParseTuple ( args , " |Of:mathutils.Quaternion " , & seq , & angle ) )
return NULL ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
2010-04-25 19:27:59 +00:00
switch ( PyTuple_GET_SIZE ( args ) ) {
case 0 :
break ;
case 1 :
2010-04-25 23:33:09 +00:00
if ( mathutils_array_parse ( quat , QUAT_SIZE , QUAT_SIZE , seq , " mathutils.Quaternion() " ) = = - 1 )
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
return NULL ;
2010-04-25 19:27:59 +00:00
break ;
case 2 :
if ( mathutils_array_parse ( quat , 3 , 3 , seq , " mathutils.Quaternion() " ) = = - 1 )
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
return NULL ;
2010-04-26 21:25:14 +00:00
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
axis_angle_to_quat ( quat , quat , angle ) ;
2010-04-25 19:27:59 +00:00
break ;
/* PyArg_ParseTuple assures no more then 2 */
}
2010-11-28 06:03:30 +00:00
return newQuaternionObject ( quat , Py_NEW , type ) ;
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00
}
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Quaternion_methods [ ] = {
{ " identity " , ( PyCFunction ) Quaternion_Identity , METH_NOARGS , Quaternion_Identity_doc } ,
{ " negate " , ( PyCFunction ) Quaternion_Negate , METH_NOARGS , Quaternion_Negate_doc } ,
{ " conjugate " , ( PyCFunction ) Quaternion_Conjugate , METH_NOARGS , Quaternion_Conjugate_doc } ,
{ " inverse " , ( PyCFunction ) Quaternion_Inverse , METH_NOARGS , Quaternion_Inverse_doc } ,
{ " normalize " , ( PyCFunction ) Quaternion_Normalize , METH_NOARGS , Quaternion_Normalize_doc } ,
{ " to_euler " , ( PyCFunction ) Quaternion_ToEuler , METH_VARARGS , Quaternion_ToEuler_doc } ,
{ " to_matrix " , ( PyCFunction ) Quaternion_ToMatrix , METH_NOARGS , Quaternion_ToMatrix_doc } ,
{ " cross " , ( PyCFunction ) Quaternion_Cross , METH_O , Quaternion_Cross_doc } ,
{ " dot " , ( PyCFunction ) Quaternion_Dot , METH_O , Quaternion_Dot_doc } ,
{ " difference " , ( PyCFunction ) Quaternion_Difference , METH_O , Quaternion_Difference_doc } ,
{ " slerp " , ( PyCFunction ) Quaternion_Slerp , METH_VARARGS , Quaternion_Slerp_doc } ,
{ " __copy__ " , ( PyCFunction ) Quaternion_copy , METH_NOARGS , Quaternion_copy_doc } ,
{ " copy " , ( PyCFunction ) Quaternion_copy , METH_NOARGS , Quaternion_copy_doc } ,
{ NULL , NULL , 0 , NULL }
} ;
2009-06-17 20:33:34 +00:00
/*****************************************************************************/
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Quaternion_getseters [ ] = {
2010-12-03 17:05:21 +00:00
{ ( char * ) " w " , ( getter ) Quaternion_getAxis , ( setter ) Quaternion_setAxis , ( char * ) " Quaternion W value. \n \n :type: float " , ( void * ) 0 } ,
{ ( char * ) " x " , ( getter ) Quaternion_getAxis , ( setter ) Quaternion_setAxis , ( char * ) " Quaternion X axis. \n \n :type: float " , ( void * ) 1 } ,
{ ( char * ) " y " , ( getter ) Quaternion_getAxis , ( setter ) Quaternion_setAxis , ( char * ) " Quaternion Y axis. \n \n :type: float " , ( void * ) 2 } ,
{ ( char * ) " z " , ( getter ) Quaternion_getAxis , ( setter ) Quaternion_setAxis , ( char * ) " Quaternion Z axis. \n \n :type: float " , ( void * ) 3 } ,
{ ( char * ) " magnitude " , ( getter ) Quaternion_getMagnitude , ( setter ) NULL , ( char * ) " Size of the quaternion (readonly). \n \n :type: float " , NULL } ,
{ ( char * ) " angle " , ( getter ) Quaternion_getAngle , ( setter ) Quaternion_setAngle , ( char * ) " angle of the quaternion. \n \n :type: float " , NULL } ,
{ ( char * ) " axis " , ( getter ) Quaternion_getAxisVec , ( setter ) Quaternion_setAxisVec , ( char * ) " quaternion axis as a vector. \n \n :type: :class:`Vector` " , NULL } ,
{ ( char * ) " is_wrapped " , ( getter ) BaseMathObject_getWrapped , ( setter ) NULL , ( char * ) BaseMathObject_Wrapped_doc , NULL } ,
{ ( char * ) " owner " , ( getter ) BaseMathObject_getOwner , ( setter ) NULL , ( char * ) BaseMathObject_Owner_doc , NULL } ,
2009-06-17 20:33:34 +00:00
{ NULL , NULL , NULL , NULL , NULL } /* Sentinel */
} ;
//------------------PY_OBECT DEFINITION--------------------------
2010-01-31 21:52:26 +00:00
static char quaternion_doc [ ] =
2010-02-28 13:45:08 +00:00
" This object gives access to Quaternions in Blender. " ;
2010-01-27 21:33:39 +00:00
2009-06-17 20:33:34 +00:00
PyTypeObject quaternion_Type = {
PyVarObject_HEAD_INIT ( NULL , 0 )
2010-11-28 06:03:30 +00:00
" mathutils.Quaternion " , //tp_name
2009-06-17 20:33:34 +00:00
sizeof ( QuaternionObject ) , //tp_basicsize
0 , //tp_itemsize
2009-06-25 10:11:37 +00:00
( destructor ) BaseMathObject_dealloc , //tp_dealloc
2009-06-17 20:33:34 +00:00
0 , //tp_print
0 , //tp_getattr
0 , //tp_setattr
0 , //tp_compare
2010-04-25 23:33:09 +00:00
( reprfunc ) Quaternion_repr , //tp_repr
& Quaternion_NumMethods , //tp_as_number
& Quaternion_SeqMethods , //tp_as_sequence
& Quaternion_AsMapping , //tp_as_mapping
2009-06-17 20:33:34 +00:00
0 , //tp_hash
0 , //tp_call
0 , //tp_str
0 , //tp_getattro
0 , //tp_setattro
0 , //tp_as_buffer
2009-06-30 00:42:17 +00:00
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE , //tp_flags
2010-01-27 21:33:39 +00:00
quaternion_doc , //tp_doc
2009-06-17 20:33:34 +00:00
0 , //tp_traverse
0 , //tp_clear
( richcmpfunc ) Quaternion_richcmpr , //tp_richcompare
0 , //tp_weaklistoffset
0 , //tp_iter
0 , //tp_iternext
Quaternion_methods , //tp_methods
0 , //tp_members
Quaternion_getseters , //tp_getset
0 , //tp_base
0 , //tp_dict
0 , //tp_descr_get
0 , //tp_descr_set
0 , //tp_dictoffset
0 , //tp_init
0 , //tp_alloc
2009-06-20 02:44:57 +00:00
Quaternion_new , //tp_new
2009-06-17 20:33:34 +00:00
0 , //tp_free
0 , //tp_is_gc
0 , //tp_bases
0 , //tp_mro
0 , //tp_cache
0 , //tp_subclasses
0 , //tp_weaklist
0 //tp_del
} ;
//------------------------newQuaternionObject (internal)-------------
//creates a new quaternion object
/*pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
( i . e . it was allocated elsewhere by MEM_mallocN ( ) )
pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
( i . e . it must be created here with PyMEM_malloc ( ) ) */
2009-06-30 00:42:17 +00:00
PyObject * newQuaternionObject ( float * quat , int type , PyTypeObject * base_type )
2009-06-17 20:33:34 +00:00
{
QuaternionObject * self ;
2009-07-09 15:40:04 +00:00
if ( base_type ) self = ( QuaternionObject * ) base_type - > tp_alloc ( base_type , 0 ) ;
2009-06-30 00:42:17 +00:00
else self = PyObject_NEW ( QuaternionObject , & quaternion_Type ) ;
2009-06-25 10:11:37 +00:00
/* init callbacks as NULL */
self - > cb_user = NULL ;
self - > cb_type = self - > cb_subtype = 0 ;
2009-06-17 20:33:34 +00:00
if ( type = = Py_WRAP ) {
2009-06-25 10:11:37 +00:00
self - > quat = quat ;
2009-06-17 20:33:34 +00:00
self - > wrapped = Py_WRAP ;
} else if ( type = = Py_NEW ) {
2010-04-25 23:33:09 +00:00
self - > quat = PyMem_Malloc ( QUAT_SIZE * sizeof ( float ) ) ;
2009-06-17 20:33:34 +00:00
if ( ! quat ) { //new empty
2009-11-10 20:43:45 +00:00
unit_qt ( self - > quat ) ;
2009-06-17 20:33:34 +00:00
} else {
2009-06-25 10:11:37 +00:00
QUATCOPY ( self - > quat , quat ) ;
2009-06-17 20:33:34 +00:00
}
self - > wrapped = Py_NEW ;
} else { //bad type
return NULL ;
}
return ( PyObject * ) self ;
}
2009-06-25 10:11:37 +00:00
PyObject * newQuaternionObject_cb ( PyObject * cb_user , int cb_type , int cb_subtype )
{
2009-06-30 00:42:17 +00:00
QuaternionObject * self = ( QuaternionObject * ) newQuaternionObject ( NULL , Py_NEW , NULL ) ;
2009-06-25 10:11:37 +00:00
if ( self ) {
Py_INCREF ( cb_user ) ;
self - > cb_user = cb_user ;
self - > cb_type = ( unsigned char ) cb_type ;
self - > cb_subtype = ( unsigned char ) cb_subtype ;
}
return ( PyObject * ) self ;
}
Mathutils refactor & include in sphinx generated docs, (TODO, include getset'ers in docs)
- Mathutils.MidpointVecs --> vector.lerp(other, fac)
- Mathutils.AngleBetweenVecs --> vector.angle(other)
- Mathutils.ProjectVecs --> vector.project(other)
- Mathutils.DifferenceQuats --> quat.difference(other)
- Mathutils.Slerp --> quat.slerp(other, fac)
- Mathutils.Rand: removed, use pythons random module
- Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- Matrix.scalePart --> Matrix.scale_part
- Matrix.translationPart --> Matrix.translation_part
- Matrix.rotationPart --> Matrix.rotation_part
- toMatrix --> to_matrix
- toEuler --> to_euler
- toQuat --> to_quat
- Vector.toTrackQuat --> Vector.to_track_quat
2010-01-25 09:44:04 +00:00