Fix T68135: Do not return NULL/None when converting an object to a mesh.
authorBastien Montagne <montagne29@wanadoo.fr>
Fri, 2 Aug 2019 15:45:32 +0000 (17:45 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Fri, 2 Aug 2019 16:24:59 +0000 (18:24 +0200)
Does not make sense in the use-cases of that function, especially since
we don't know whether it is actually due to an error, or some glitch
(like an empty curve).

Think we always want to get a mesh when using either operator
conversion, or the `bpy.data.meshes.new_from_object` function.

Note that an assert was also added to ensure we do try to convert from a
valid 'geometry' object type.

source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/intern/mesh_convert.c

index 59812df246f917b5140afbe2a56e917e8fe31a66..924cfad37d66a8421acf6913eba6e949ba78e971 100644 (file)
@@ -224,7 +224,9 @@ struct Mesh *BKE_mesh_new_from_object(struct Depsgraph *depsgraph,
                                       struct Object *object,
                                       bool preserve_all_data_layers);
 
-/* This is a version of BKE_mesh_new_from_object() which stores mesh in the given main database. */
+/* This is a version of BKE_mesh_new_from_object() which stores mesh in the given main database.
+ * However, that function enforces object type to be a geometry one, and ensures a mesh is always
+ * generated, be it empty. */
 struct Mesh *BKE_mesh_new_from_object_to_bmain(struct Main *bmain,
                                                struct Depsgraph *depsgraph,
                                                struct Object *object,
index ae9cf874676f9a345b5e4e977de981ad5a926579..ee060a117dcf65f2a1baf9fae61b48913022835a 100644 (file)
@@ -1216,10 +1216,14 @@ Mesh *BKE_mesh_new_from_object_to_bmain(Main *bmain,
                                         Object *object,
                                         bool preserve_all_data_layers)
 {
+  BLI_assert(ELEM(object->type, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_MESH));
+
   Mesh *mesh = BKE_mesh_new_from_object(depsgraph, object, preserve_all_data_layers);
   if (mesh == NULL) {
-    /* Unable to convert the object to a mesh. */
-    return NULL;
+    /* Unable to convert the object to a mesh, return an empty one. */
+    Mesh *mesh_in_bmain = BKE_mesh_add(bmain, ((ID *)object->data)->name + 2);
+    id_us_min(&mesh_in_bmain->id);
+    return mesh_in_bmain;
   }
 
   /* Make sure mesh only points original datablocks, also increase users of materials and other