[Bf-blender-cvs] [6368343da9a] blender-v2.82-release: Fix T73129: sculpt mode slow on mesh with fake user

Brecht Van Lommel noreply at git.blender.org
Mon Jan 20 09:45:32 CET 2020


Commit: 6368343da9a0aed8511de37b91161ea47418909d
Author: Brecht Van Lommel
Date:   Sat Jan 18 17:25:59 2020 +0100
Branches: blender-v2.82-release
https://developer.blender.org/rB6368343da9a0aed8511de37b91161ea47418909d

Fix T73129: sculpt mode slow on mesh with fake user

We can't use the fast path when the mesh is used by mulitple objects and so
slower sculpting is expected then. But fake users should not affect this. This
also fixes the same type of error in a few other areas.

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

M	source/blender/blenkernel/BKE_library.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/collada/MeshImporter.cpp
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_undo.c

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

diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index c41cd50eba5..21dd5aaaf8f 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -184,6 +184,7 @@ void id_us_plus(struct ID *id);
 void id_us_min(struct ID *id);
 void id_fake_user_set(struct ID *id);
 void id_fake_user_clear(struct ID *id);
+int BKE_id_num_real_users(const struct ID *id);
 void BKE_id_clear_newpoin(struct ID *id);
 
 void BKE_id_make_local_generic(struct Main *bmain,
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index e051dc946cb..dabf44be42e 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -294,6 +294,11 @@ void id_fake_user_clear(ID *id)
   }
 }
 
+int BKE_id_num_real_users(const ID *id)
+{
+  return (id->flag & LIB_FAKEUSER) ? id->us - 1 : id->us;
+}
+
 void BKE_id_clear_newpoin(ID *id)
 {
   if (id->newid) {
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
index 64031e10d77..94791df7b6f 100644
--- a/source/blender/collada/MeshImporter.cpp
+++ b/source/blender/collada/MeshImporter.cpp
@@ -1014,12 +1014,12 @@ void MeshImporter::optimize_material_assignements()
        ++it) {
     Object *ob = (*it);
     Mesh *me = (Mesh *)ob->data;
-    if (me->id.us == 1) {
+    if (BKE_id_num_real_users(&me->id) == 1) {
       bc_copy_materials_to_data(ob, me);
       bc_remove_materials_from_object(ob, me);
       bc_remove_mark(ob);
     }
-    else if (me->id.us > 1) {
+    else if (BKE_id_num_real_users(&me->id) > 1) {
       bool can_move = true;
       std::vector<Object *> mesh_users = get_all_users_of(me);
       if (mesh_users.size() > 1) {
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 3b04e99b5b2..5350468d26c 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -29,6 +29,7 @@
 #include "BKE_constraint.h"
 #include "BKE_curve.h"
 #include "BKE_global.h"
+#include "BKE_library.h"
 #include "BKE_mball.h"
 #include "BKE_mesh.h"
 #include "BKE_movieclip.h"
@@ -1500,7 +1501,7 @@ static void OVERLAY_object_center(OVERLAY_ExtraCallBuffers *cb,
                                   OVERLAY_PrivateData *pd,
                                   ViewLayer *view_layer)
 {
-  const bool is_library = ob->id.us > 1 || ID_IS_LINKED(ob);
+  const bool is_library = BKE_id_num_real_users(&ob->id) > 1 || ID_IS_LINKED(ob);
 
   if (ob == OBACT(view_layer)) {
     DRW_buffer_add_entry(cb->center_active, ob->obmat[3]);
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 5286637afe2..24c1c53c25e 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -2344,7 +2344,7 @@ static int convert_exec(bContext *C, wmOperator *op)
 
       if (!keep_original) {
         /* other users */
-        if (cu->id.us > 1) {
+        if (BKE_id_num_real_users(&cu->id) > 1) {
           for (ob1 = bmain->objects.first; ob1; ob1 = ob1->id.next) {
             if (ob1->data == ob->data) {
               ob1->type = OB_CURVE;
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index a9334edd39b..c3056fff8c5 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -7562,7 +7562,8 @@ static void sculpt_flush_update_done(const bContext *C, Object *ob, SculptUpdate
   RegionView3D *rv3d = CTX_wm_region_view3d(C);
   SculptSession *ss = ob->sculpt;
   Mesh *mesh = ob->data;
-  bool need_tag = (mesh->id.us > 1); /* Always needed for linked duplicates. */
+  bool need_tag = (BKE_id_num_real_users(&mesh->id) >
+                   1); /* Always needed for linked duplicates. */
 
   if (rv3d) {
     rv3d->rflag &= ~RV3D_PAINTING;
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index 2e77c7cceeb..a069b231150 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -46,6 +46,7 @@
 #include "BKE_multires.h"
 #include "BKE_paint.h"
 #include "BKE_key.h"
+#include "BKE_library.h"
 #include "BKE_mesh.h"
 #include "BKE_scene.h"
 #include "BKE_subsurf.h"
@@ -632,7 +633,7 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, ListBase
       }
     }
 
-    tag_update |= ((Mesh *)ob->data)->id.us > 1 || !BKE_sculptsession_use_pbvh_draw(ob, v3d);
+    tag_update |= BKE_id_num_real_users(ob->data) > 1 || !BKE_sculptsession_use_pbvh_draw(ob, v3d);
 
     if (ss->shapekey_active || ss->deform_modifiers_active) {
       Mesh *mesh = ob->data;



More information about the Bf-blender-cvs mailing list