add angle wrapping functions: angle_wrap_rad(), angle_wrap_deg().
use with mathutils.
This commit is contained in:
		| @@ -185,6 +185,9 @@ void vec_apply_track(float vec[3], short axis); | |||||||
| float lens_to_angle(float lens); | float lens_to_angle(float lens); | ||||||
| float angle_to_lens(float angle); | float angle_to_lens(float angle); | ||||||
|  |  | ||||||
|  | float angle_wrap_rad(float angle); | ||||||
|  | float angle_wrap_deg(float angle); | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -1675,3 +1675,19 @@ float angle_to_lens(float angle) | |||||||
| { | { | ||||||
| 	return 16.0f / tanf(angle * 0.5f); | 	return 16.0f / tanf(angle * 0.5f); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* 'mod_inline(-3,4)= 1', 'fmod(-3,4)= -3' */ | ||||||
|  | static float mod_inline(float a, float b) | ||||||
|  | { | ||||||
|  | 	return a - (b * floorf(a / b)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float angle_wrap_rad(float angle) | ||||||
|  | { | ||||||
|  | 	return mod_inline(angle + (float)M_PI, (float)M_PI*2.0f) - (float)M_PI; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float angle_wrap_deg(float angle) | ||||||
|  | { | ||||||
|  | 	return mod_inline(angle + 180.0f, 360.0f) - 180.0f; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -226,8 +226,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* clamp angle between -360 and 360 in radians */ | 	angle= angle_wrap_rad(angle); | ||||||
| 	angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; |  | ||||||
|  |  | ||||||
| 	if(matSize != 2 && matSize != 3 && matSize != 4) { | 	if(matSize != 2 && matSize != 3 && matSize != 4) { | ||||||
| 		PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix"); | 		PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix"); | ||||||
|   | |||||||
| @@ -861,7 +861,7 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN | |||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; | 	angle= angle_wrap_rad(angle); | ||||||
|  |  | ||||||
| 	/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */ | 	/* 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) && | 	if(	EXPP_FloatsAreEqual(axis[0], 0.0f, 10) && | ||||||
| @@ -955,7 +955,7 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw | |||||||
| 	case 2: | 	case 2: | ||||||
| 		if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1) | 		if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1) | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 		angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; /* clamp because of precision issues */ | 		angle= angle_wrap_rad(angle); /* clamp because of precision issues */ | ||||||
| 		axis_angle_to_quat(quat, quat, angle); | 		axis_angle_to_quat(quat, quat, angle); | ||||||
| 		break; | 		break; | ||||||
| 	/* PyArg_ParseTuple assures no more then 2 */ | 	/* PyArg_ParseTuple assures no more then 2 */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user