[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37830] trunk/blender/source/blender/ python/generic/mathutils_geometry.c: more compact code for recent sphere/ line intersection functions.

Campbell Barton ideasman42 at gmail.com
Sun Jun 26 19:16:06 CEST 2011


Revision: 37830
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37830
Author:   campbellbarton
Date:     2011-06-26 17:16:06 +0000 (Sun, 26 Jun 2011)
Log Message:
-----------
more compact code for recent sphere/line intersection functions.

Modified Paths:
--------------
    trunk/blender/source/blender/python/generic/mathutils_geometry.c

Modified: trunk/blender/source/blender/python/generic/mathutils_geometry.c
===================================================================
--- trunk/blender/source/blender/python/generic/mathutils_geometry.c	2011-06-26 17:01:10 UTC (rev 37829)
+++ trunk/blender/source/blender/python/generic/mathutils_geometry.c	2011-06-26 17:16:06 UTC (rev 37830)
@@ -1,4 +1,4 @@
-/* 
+/*
  * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
@@ -573,11 +573,9 @@
 );
 static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObject* args)
 {
-	PyObject *ret;
 	VectorObject *line_a, *line_b, *sphere_co;
 	float sphere_radius;
 	int clip= TRUE;
-	float lambda;
 
 	float isect_a[3];
 	float isect_b[3];
@@ -602,45 +600,38 @@
 		PyErr_SetString(PyExc_RuntimeError, "geometry.intersect_line_sphere(...) can't use 2D Vectors");
 		return NULL;
 	}
+	else {
+		short use_a= TRUE;
+		short use_b= TRUE;
+		float lambda;
 
-	ret= PyTuple_New(2);
+		PyObject *ret= PyTuple_New(2);
 
-	switch(isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
-	case 1:
-		/* ret 1 */
-		if(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
-			PyTuple_SET_ITEM(ret, 0,  newVectorObject(isect_a, 3, Py_NEW, NULL));
+		switch(isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
+		case 1:
+			if(!(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
+			use_b= FALSE;
+			break;
+		case 2:
+			if(!(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
+			if(!(!clip || (((lambda= line_point_factor_v3(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_b= FALSE;
+			break;
+		default:
+			use_a= FALSE;
+			use_b= FALSE;
 		}
-		else {
-			PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None);
-		}
-		/* ret 2 */
-		PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None);
-		break;
-	case 2:
-		/* ret 1 */
-		if(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
-			PyTuple_SET_ITEM(ret, 0,  newVectorObject(isect_a, 3, Py_NEW, NULL));
-		}
-		else {
-			PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None);
-		}
-		/* ret 2 */
-		if(!clip || (((lambda= line_point_factor_v3(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
-			PyTuple_SET_ITEM(ret, 1,  newVectorObject(isect_b, 3, Py_NEW, NULL));
-		}
-		else {
-			PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None);
-		}
-		break;
-	default:
-		PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None);
-		PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None);
-	}
 
-	return ret;
+		if(use_a) { PyTuple_SET_ITEM(ret, 0,  newVectorObject(isect_a, 3, Py_NEW, NULL)); }
+		else      { PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None); }
+
+		if(use_b) { PyTuple_SET_ITEM(ret, 1,  newVectorObject(isect_b, 3, Py_NEW, NULL)); }
+		else      { PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None); }
+
+		return ret;
+	}
 }
 
+/* keep in sync with M_Geometry_intersect_line_sphere */
 PyDoc_STRVAR(M_Geometry_intersect_line_sphere_2d_doc,
 ".. function:: intersect_line_sphere_2d(line_a, line_b, sphere_co, sphere_radius, clip=True)\n"
 "\n"
@@ -660,11 +651,9 @@
 );
 static PyObject *M_Geometry_intersect_line_sphere_2d(PyObject *UNUSED(self), PyObject* args)
 {
-	PyObject *ret;
 	VectorObject *line_a, *line_b, *sphere_co;
 	float sphere_radius;
 	int clip= TRUE;
-	float lambda;
 
 	float isect_a[3];
 	float isect_b[3];
@@ -684,43 +673,35 @@
 	) {
 		return NULL;
 	}
+	else {
+		short use_a= TRUE;
+		short use_b= TRUE;
+		float lambda;
 
-	ret= PyTuple_New(2);
+		PyObject *ret= PyTuple_New(2);
 
-	switch(isect_line_sphere_v2(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
-	case 1:
-		/* ret 1 */
-		if(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
-			PyTuple_SET_ITEM(ret, 0,  newVectorObject(isect_a, 2, Py_NEW, NULL));
+		switch(isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
+		case 1:
+			if(!(!clip || (((lambda= line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
+			use_b= FALSE;
+			break;
+		case 2:
+			if(!(!clip || (((lambda= line_point_factor_v2(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_a= FALSE;
+			if(!(!clip || (((lambda= line_point_factor_v2(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f)))) use_b= FALSE;
+			break;
+		default:
+			use_a= FALSE;
+			use_b= FALSE;
 		}
-		else {
-			PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None);
-		}
-		/* ret 2 */
-		PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None);
-		break;
-	case 2:
-		/* ret 1 */
-		if(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
-			PyTuple_SET_ITEM(ret, 0,  newVectorObject(isect_a, 2, Py_NEW, NULL));
-		}
-		else {
-			PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None);
-		}
-		/* ret 2 */
-		if(!clip || (((lambda= line_point_factor_v3(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
-			PyTuple_SET_ITEM(ret, 1,  newVectorObject(isect_b, 2, Py_NEW, NULL));
-		}
-		else {
-			PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None);
-		}
-		break;
-	default:
-		PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None);
-		PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None);
-	}
 
-	return ret;
+		if(use_a) { PyTuple_SET_ITEM(ret, 0,  newVectorObject(isect_a, 2, Py_NEW, NULL)); }
+		else      { PyTuple_SET_ITEM(ret, 0,  Py_None); Py_INCREF(Py_None); }
+
+		if(use_b) { PyTuple_SET_ITEM(ret, 1,  newVectorObject(isect_b, 2, Py_NEW, NULL)); }
+		else      { PyTuple_SET_ITEM(ret, 1,  Py_None); Py_INCREF(Py_None); }
+
+		return ret;
+	}
 }
 
 PyDoc_STRVAR(M_Geometry_intersect_point_line_doc,




More information about the Bf-blender-cvs mailing list