[Bf-blender-cvs] [33268e4] mathutils_bvhtree: mathutils.bvhtree submodule functions for ray cast and find-nearest now support non-Vector tuples like the rest of mathutils.

Lukas Tönne noreply at git.blender.org
Mon Jan 5 10:48:23 CET 2015


Commit: 33268e43e7030c65f641dcc6097d27a93af4f55a
Author: Lukas Tönne
Date:   Mon Jan 5 10:46:49 2015 +0100
Branches: mathutils_bvhtree
https://developer.blender.org/rB33268e43e7030c65f641dcc6097d27a93af4f55a

mathutils.bvhtree submodule functions for ray cast and find-nearest now
support non-Vector tuples like the rest of mathutils.

Also the keywords have been removed for slight performance improvement.

===================================================================

M	source/blender/python/mathutils/mathutils_bvhtree.c

===================================================================

diff --git a/source/blender/python/mathutils/mathutils_bvhtree.c b/source/blender/python/mathutils/mathutils_bvhtree.c
index dd6de06..deda0b1 100644
--- a/source/blender/python/mathutils/mathutils_bvhtree.c
+++ b/source/blender/python/mathutils/mathutils_bvhtree.c
@@ -75,21 +75,6 @@ typedef struct {
 /* -------------------------------------------------------------------- */
 /* Utility helper functions */
 
-static bool parse_vector(PyObject *vec, float value[3])
-{
-	if (BaseMath_ReadCallback((VectorObject *)vec) == -1)
-		return false;
-	
-	value[0] = ((VectorObject *)vec)->vec[0];
-	value[1] = ((VectorObject *)vec)->vec[1];
-	if (((VectorObject *)vec)->size > 2)
-		value[2] = ((VectorObject *)vec)->vec[2];
-	else
-		value[2] = 0.0f;  /* if its a 2d vector then set the z to be zero */
-	
-	return true;
-}
-
 static int dm_tessface_to_poly_index(DerivedMesh *dm, int tessface_index)
 {
 	if (tessface_index != ORIGINDEX_NONE && tessface_index < dm->getNumTessFaces(dm)) {
@@ -131,7 +116,7 @@ static PyObject *bvhtree_nearest_to_py(const float co[3], const float no[3], int
 /* -------------------------------------------------------------------- */
 /* BVHTree */
 
-static int PyBVHTree__tp_init(PyBVHTree *self, PyObject *args, PyObject *kwargs)
+static int PyBVHTree__tp_init(PyBVHTree *UNUSED(self), PyObject *UNUSED(args), PyObject *UNUSED(kwargs))
 {
 	return 0;
 }
@@ -277,28 +262,25 @@ PyDoc_STRVAR(py_DerivedMeshBVHTree_ray_cast_doc,
 "   :return: Returns a tuple (:class:`Vector` location, :class:`Vector` normal, int index, float distance), index==-1 if no hit was found.\n"
 "   :rtype: :class:`tuple`\n"
 );
-static PyObject *py_DerivedMeshBVHTree_ray_cast(PyDerivedMeshBVHTree *self, PyObject *args, PyObject *kwargs)
+static PyObject *py_DerivedMeshBVHTree_ray_cast(PyDerivedMeshBVHTree *self, PyObject *args)
 {
+	const char *error_prefix = "ray_cast";
 	static const float ZERO[3] = {0.0f, 0.0f, 0.0f};
 	
 	BVHTreeFromMesh *meshdata = &self->meshdata;
 	Object *ob = self->ob;
-	const char *keywords[] = {"ray_start", "ray_end", NULL};
 	
 	PyObject *py_ray_start, *py_ray_end;
 	float ray_start[3], ray_end[3];
 	float ray_nor[3], ray_len;
 	
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *)"O!O!:ray_cast", (char **)keywords,
-	                                 &vector_Type, &py_ray_start,
-	                                 &vector_Type, &py_ray_end))
+	if (!PyArg_ParseTuple(args, (char *)"OO:ray_cast", &py_ray_start, &py_ray_end))
 	{
 		return NULL;
 	}
 	
-	if (!parse_vector(py_ray_start, ray_start))
-		return NULL;
-	if (!parse_vector(py_ray_end, ray_end))
+	if (mathutils_array_parse(ray_start, 2, 3, py_ray_start, error_prefix) == -1 ||
+	    mathutils_array_parse(ray_end, 2, 3, py_ray_end, error_prefix) == -1)
 		return NULL;
 	
 	sub_v3_v3v3(ray_nor, ray_end, ray_start);
@@ -336,27 +318,25 @@ PyDoc_STRVAR(py_DerivedMeshBVHTree_find_nearest_doc,
 "   :return: Returns a tuple (:class:`Vector` location, :class:`Vector` normal, int index, float distance_squared), index==-1 if no hit was found.\n"
 "   :rtype: :class:`tuple`\n"
 );
-static PyObject *py_DerivedMeshBVHTree_find_nearest(PyDerivedMeshBVHTree *self, PyObject *args, PyObject *kwargs)
+static PyObject *py_DerivedMeshBVHTree_find_nearest(PyDerivedMeshBVHTree *self, PyObject *args)
 {
+	const char *error_prefix = "find_nearest";
 	static const float ZERO[3] = {0.0f, 0.0f, 0.0f};
 	
 	BVHTreeFromMesh *meshdata = &self->meshdata;
 	Object *ob = self->ob;
-	const char *keywords[] = {"point", "max_dist", NULL};
 	
 	PyObject *py_point;
 	float point[3];
 	float max_dist = 1.844674352395373e+19f;
 	BVHTreeNearest nearest;
 	
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *)"O!|f:find_nearest", (char **)keywords,
-	                                 &vector_Type, &py_point,
-	                                 &max_dist))
+	if (!PyArg_ParseTuple(args, (char *)"O|f:find_nearest", &py_point, &max_dist))
 	{
 		return NULL;
 	}
 	
-	if (!parse_vector(py_point, point))
+	if (mathutils_array_parse(point, 2, 3, py_point, error_prefix) == -1)
 		return NULL;
 	
 	nearest.index = -1;
@@ -377,8 +357,8 @@ static PyObject *py_DerivedMeshBVHTree_find_nearest(PyDerivedMeshBVHTree *self,
 }
 
 static PyMethodDef PyDerivedMeshBVHTree_methods[] = {
-	{"ray_cast", (PyCFunction)py_DerivedMeshBVHTree_ray_cast, METH_VARARGS | METH_KEYWORDS, py_DerivedMeshBVHTree_ray_cast_doc},
-	{"find_nearest", (PyCFunction)py_DerivedMeshBVHTree_find_nearest, METH_VARARGS | METH_KEYWORDS, py_DerivedMeshBVHTree_find_nearest_doc},
+	{"ray_cast", (PyCFunction)py_DerivedMeshBVHTree_ray_cast, METH_VARARGS, py_DerivedMeshBVHTree_ray_cast_doc},
+	{"find_nearest", (PyCFunction)py_DerivedMeshBVHTree_find_nearest, METH_VARARGS, py_DerivedMeshBVHTree_find_nearest_doc},
 	{NULL, NULL, 0, NULL}
 };
 
@@ -501,27 +481,24 @@ PyDoc_STRVAR(py_BMeshBVHTree_ray_cast_doc,
 "   :return: Returns a tuple (:class:`Vector` location, :class:`Vector` normal, int index, float distance), index==-1 if no hit was found.\n"
 "   :rtype: :class:`tuple`\n"
 );
-static PyObject *py_BMeshBVHTree_ray_cast(PyBMeshBVHTree *self, PyObject *args, PyObject *kwargs)
+static PyObject *py_BMeshBVHTree_ray_cast(PyBMeshBVHTree *self, PyObject *args)
 {
+	const char *error_prefix = "ray_cast";
 	static const float ZERO[3] = {0.0f, 0.0f, 0.0f};
 	
 	BMBVHTree *bmdata = self->bmdata;
-	const char *keywords[] = {"ray_start", "ray_end", NULL};
 	
 	PyObject *py_ray_start, *py_ray_end;
 	float ray_start[3], ray_end[3];
 	float ray_nor[3], ray_len;
 	
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *)"O!O!:ray_cast", (char **)keywords,
-	                                 &vector_Type, &py_ray_start,
-	                                 &vector_Type, &py_ray_end))
+	if (!PyArg_ParseTuple(args, (char *)"OO:ray_cast", &py_ray_start, &py_ray_end))
 	{
 		return NULL;
 	}
 	
-	if (!parse_vector(py_ray_start, ray_start))
-		return NULL;
-	if (!parse_vector(py_ray_end, ray_end))
+	if (mathutils_array_parse(ray_start, 2, 3, py_ray_start, error_prefix) == -1 ||
+	    mathutils_array_parse(ray_end, 2, 3, py_ray_end, error_prefix) == -1)
 		return NULL;
 	
 	sub_v3_v3v3(ray_nor, ray_end, ray_start);
@@ -556,25 +533,23 @@ PyDoc_STRVAR(py_BMeshBVHTree_find_nearest_doc,
 "   :return: Returns a tuple (:class:`Vector` location, :class:`Vector` normal, int index, float distance_squared), index==-1 if no hit was found.\n"
 "   :rtype: :class:`tuple`\n"
 );
-static PyObject *py_BMeshBVHTree_find_nearest(PyBMeshBVHTree *self, PyObject *args, PyObject *kwargs)
+static PyObject *py_BMeshBVHTree_find_nearest(PyBMeshBVHTree *self, PyObject *args)
 {
+	const char *error_prefix = "find_nearest";
 	static const float ZERO[3] = {0.0f, 0.0f, 0.0f};
 	
 	BMBVHTree *bmdata = self->bmdata;
-	const char *keywords[] = {"point", "max_dist", NULL};
 	
 	PyObject *py_point;
 	float point[3];
 	float max_dist = 1.844674352395373e+19f;
 	
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *)"O!|f:find_nearest", (char **)keywords,
-	                                 &vector_Type, &py_point,
-	                                 &max_dist))
+	if (!PyArg_ParseTuple(args, (char *)"O|f:find_nearest", &py_point, &max_dist))
 	{
 		return NULL;
 	}
 	
-	if (!parse_vector(py_point, point))
+	if (mathutils_array_parse(point, 2, 3, py_point, error_prefix) == -1)
 		return NULL;
 	
 	/* may fail if the mesh has no faces, in that case the ray-cast misses */
@@ -591,8 +566,8 @@ static PyObject *py_BMeshBVHTree_find_nearest(PyBMeshBVHTree *self, PyObject *ar
 }
 
 static PyMethodDef PyBMeshBVHTree_methods[] = {
-	{"ray_cast", (PyCFunction)py_BMeshBVHTree_ray_cast, METH_VARARGS | METH_KEYWORDS, py_BMeshBVHTree_ray_cast_doc},
-	{"find_nearest", (PyCFunction)py_BMeshBVHTree_find_nearest, METH_VARARGS | METH_KEYWORDS, py_BMeshBVHTree_find_nearest_doc},
+	{"ray_cast", (PyCFunction)py_BMeshBVHTree_ray_cast, METH_VARARGS, py_BMeshBVHTree_ray_cast_doc},
+	{"find_nearest", (PyCFunction)py_BMeshBVHTree_find_nearest, METH_VARARGS, py_BMeshBVHTree_find_nearest_doc},
 	{NULL, NULL, 0, NULL}
 };




More information about the Bf-blender-cvs mailing list