[Bf-blender-cvs] [d3d6cd2e097] master: PyAPI: drop Vector requirement for tessellate_polygon

Campbell Barton noreply at git.blender.org
Wed Oct 9 08:30:32 CEST 2019


Commit: d3d6cd2e0971eb6293359f1a5c723af6cbb69a96
Author: Campbell Barton
Date:   Wed Oct 9 17:26:39 2019 +1100
Branches: master
https://developer.blender.org/rBd3d6cd2e0971eb6293359f1a5c723af6cbb69a96

PyAPI: drop Vector requirement for tessellate_polygon

Use mathutils_array_parse which converts any sequence of numbers.

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

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

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

diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index f02fdf1fb80..9a519abd49f 100644
--- a/source/blender/python/mathutils/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -1201,8 +1201,8 @@ static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject
 PyDoc_STRVAR(M_Geometry_tessellate_polygon_doc,
              ".. function:: tessellate_polygon(veclist_list)\n"
              "\n"
-             "   Takes a list of polylines (each point a vector) and returns the point indices "
-             "for a polyline filled with triangles.\n"
+             "   Takes a list of polylines (each point a pair or triplet of numbers) and returns "
+             "the point indices for a polyline filled with triangles.\n"
              "\n"
              "   :arg veclist_list: list of polylines\n"
              "   :rtype: list\n");
@@ -1211,14 +1211,15 @@ static PyObject *M_Geometry_tessellate_polygon(PyObject *UNUSED(self), PyObject
 {
   PyObject *tri_list; /*return this list of tri's */
   PyObject *polyLine, *polyVec;
-  int i, len_polylines, len_polypoints, ls_error = 0;
+  int i, len_polylines, len_polypoints;
+  bool list_parse_error = false;
   bool is_2d = true;
 
   /* Display #ListBase. */
   ListBase dispbase = {NULL, NULL};
   DispList *dl;
   float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
-  int index, *dl_face, totpoints = 0;
+  int totpoints = 0;
 
   if (!PySequence_Check(polyLineSeq)) {
     PyErr_SetString(PyExc_TypeError, "expected a sequence of poly lines");
@@ -1239,15 +1240,6 @@ static PyObject *M_Geometry_tessellate_polygon(PyObject *UNUSED(self), PyObject
 
     len_polypoints = PySequence_Size(polyLine);
     if (len_polypoints > 0) { /* don't bother adding edges as polylines */
-#  if 0
-      if (EXPP_check_sequence_consistency(polyLine, &vector_Type) != 1) {
-        freedisplist(&dispbase);
-        Py_DECREF(polyLine);
-        PyErr_SetString(PyExc_TypeError,
-                        "A point in one of the polylines is not a mathutils.Vector type");
-        return NULL;
-      }
-#  endif
       dl = MEM_callocN(sizeof(DispList), "poly disp");
       BLI_addtail(&dispbase, dl);
       dl->type = DL_INDEX3;
@@ -1255,44 +1247,33 @@ static PyObject *M_Geometry_tessellate_polygon(PyObject *UNUSED(self), PyObject
       dl->type = DL_POLY;
       dl->parts = 1; /* no faces, 1 edge loop */
       dl->col = 0;   /* no material */
-      dl->verts = fp = MEM_callocN(sizeof(float) * 3 * len_polypoints, "dl verts");
-      dl->index = MEM_callocN(sizeof(int) * 3 * len_polypoints, "dl index");
+      dl->verts = fp = MEM_mallocN(sizeof(float[3]) * len_polypoints, "dl verts");
+      dl->index = MEM_callocN(sizeof(int[3]) * len_polypoints, "dl index");
 
-      for (index = 0; index < len_polypoints; index++, fp += 3) {
+      for (int index = 0; index < len_polypoints; index++, fp += 3) {
         polyVec = PySequence_GetItem(polyLine, index);
-        if (VectorObject_Check(polyVec)) {
-
-          if (BaseMath_ReadCallback((VectorObject *)polyVec) == -1) {
-            ls_error = 1;
-          }
+        const int polyVec_len = mathutils_array_parse(
+            fp, 2, 3 | MU_ARRAY_SPILL, polyVec, "tessellate_polygon: parse coord");
+        Py_DECREF(polyVec);
 
-          fp[0] = ((VectorObject *)polyVec)->vec[0];
-          fp[1] = ((VectorObject *)polyVec)->vec[1];
-          if (((VectorObject *)polyVec)->size > 2) {
-            fp[2] = ((VectorObject *)polyVec)->vec[2];
-            is_2d = false;
-          }
-          else {
-            /* if its a 2d vector then set the z to be zero */
-            fp[2] = 0.0f;
-          }
+        if (UNLIKELY(polyVec_len == -1)) {
+          list_parse_error = true;
         }
-        else {
-          ls_error = 1;
+        else if (polyVec_len == 2) {
+          fp[2] = 0.0f;
+        }
+        else if (polyVec_len == 3) {
+          is_2d = false;
         }
 
         totpoints++;
-        Py_DECREF(polyVec);
       }
     }
     Py_DECREF(polyLine);
   }
 
-  if (ls_error) {
+  if (list_parse_error) {
     BKE_displist_free(&dispbase); /* possible some dl was allocated */
-    PyErr_SetString(PyExc_TypeError,
-                    "A point in one of the polylines "
-                    "is not a mathutils.Vector type");
     return NULL;
   }
   else if (totpoints) {
@@ -1310,12 +1291,10 @@ static PyObject *M_Geometry_tessellate_polygon(PyObject *UNUSED(self), PyObject
       return NULL;
     }
 
-    index = 0;
-    dl_face = dl->index;
-    while (index < dl->parts) {
+    int *dl_face = dl->index;
+    for (int index = 0; index < dl->parts; index++) {
       PyList_SET_ITEM(tri_list, index, PyC_Tuple_Pack_I32(dl_face[0], dl_face[1], dl_face[2]));
       dl_face += 3;
-      index++;
     }
     BKE_displist_free(&dispbase);
   }



More information about the Bf-blender-cvs mailing list