From 035daa2e2d4be8209ef6afa2613bccd57c7cbe17 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 27 Jan 2010 15:29:21 +0000 Subject: [PATCH] py api - utility function for vectors. quat = vec.difference(other) also pedantic change with enum names. --- source/blender/makesrna/intern/rna_object.c | 12 ++++---- source/blender/python/generic/vector.c | 33 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index a1109e01d50..ff94b2eddbd 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -1378,12 +1378,12 @@ static void rna_def_object(BlenderRNA *brna) {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem track_items[] = { - {OB_POSX, "POSX", 0, "+X", ""}, - {OB_POSY, "POSY", 0, "+Y", ""}, - {OB_POSZ, "POSZ", 0, "+Z", ""}, - {OB_NEGX, "NEGX", 0, "-X", ""}, - {OB_NEGY, "NEGY", 0, "-Y", ""}, - {OB_NEGZ, "NEGZ", 0, "-Z", ""}, + {OB_POSX, "POS_X", 0, "+X", ""}, + {OB_POSY, "POS_Y", 0, "+Y", ""}, + {OB_POSZ, "POS_Z", 0, "+Z", ""}, + {OB_NEGX, "NEG_X", 0, "-X", ""}, + {OB_NEGY, "NEG_Y", 0, "-Y", ""}, + {OB_NEGZ, "NEG_Z", 0, "-Z", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem up_items[] = { diff --git a/source/blender/python/generic/vector.c b/source/blender/python/generic/vector.c index 558e4aac9c9..aa5b518ffab 100644 --- a/source/blender/python/generic/vector.c +++ b/source/blender/python/generic/vector.c @@ -560,6 +560,38 @@ static PyObject *Vector_Angle(VectorObject * self, VectorObject * value) #endif } +static char Vector_Difference_doc[] = +".. function:: difference(other)\n" +"\n" +" Returns a quaternion representing the rotational difference between this vector and another.\n" +"\n" +" :arg other: second vector.\n" +" :type other: Vector\n" +" :return: the rotational difference between the two vectors.\n" +" :rtype: Quaternion\n"; + +static PyObject *Vector_Difference( VectorObject * self, VectorObject * value ) +{ + float quat[4]; + + if (!VectorObject_Check(value)) { + PyErr_SetString( PyExc_TypeError, "vec.difference(value): expected a vector argument" ); + return NULL; + } + + if(self->size < 3 || value->size < 3) { + PyErr_SetString(PyExc_AttributeError, "vec.difference(value): expects both vectors to be size 3 or 4\n"); + return NULL; + } + + if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value)) + return NULL; + + rotation_between_vecs_to_quat(quat, self->vec, value->vec); + + return newQuaternionObject(quat, Py_NEW, NULL); +} + static char Vector_Project_doc[] = ".. function:: project(other)\n" "\n" @@ -2076,6 +2108,7 @@ static struct PyMethodDef Vector_methods[] = { {"cross", ( PyCFunction ) Vector_Cross, METH_O, Vector_Cross_doc}, {"dot", ( PyCFunction ) Vector_Dot, METH_O, Vector_Dot_doc}, {"angle", ( PyCFunction ) Vector_Angle, METH_O, Vector_Angle_doc}, + {"difference", ( PyCFunction ) Vector_Difference, METH_O, Vector_Difference_doc}, {"project", ( PyCFunction ) Vector_Project, METH_O, Vector_Project_doc}, {"lerp", ( PyCFunction ) Vector_Lerp, METH_VARARGS, Vector_Lerp_doc}, {"copy", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},