[Bf-blender-cvs] [15079b0b439] blender2.8: Fix crash & performance regression w/ base lookup

Campbell Barton noreply at git.blender.org
Thu Jun 29 04:28:12 CEST 2017


Commit: 15079b0b439ac814600d33cca88c37a8df259f00
Author: Campbell Barton
Date:   Thu Jun 29 12:04:43 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB15079b0b439ac814600d33cca88c37a8df259f00

Fix crash & performance regression w/ base lookup

Was doing O(n^2) list lookups with blender-render drawing & transform.
Also missing NULL checks would crash.

Use Object.base_flag (already used by new draw manager in places)
to avoid list lookup.

Note, transform still performs inefficient lookups,
but only for selected parents (like 2.7x), not all parents.

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

M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/transform/transform_conversions.c

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

diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 9bdc6cb59f3..459af31b921 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -917,8 +917,11 @@ static void outliner_item_activate(
 
 				for (gob = gr->gobject.first; gob; gob = gob->next) {
 					Base *base = BKE_scene_layer_base_find(sl, gob->ob);
-					if ((base->flag & BASE_SELECTED) == 0) {
-						ED_object_base_select(base, BA_SELECT);
+					/* Object may not be in this scene */
+					if (base != NULL) {
+						if ((base->flag & BASE_SELECTED) == 0) {
+							ED_object_base_select(base, BA_SELECT);
+						}
 					}
 				}
 			}
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index f41602f7899..8b1f44557e4 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -9195,8 +9195,7 @@ afterdraw:
 
 		/* help lines and so */
 		if (ob != scene->obedit && ob->parent) {
-			Base *base_parent = BKE_scene_layer_base_find(sl, ob->parent);
-			if ((base_parent->flag & BASE_VISIBLED) != 0) {
+			if ((ob->parent->base_flag & BASE_VISIBLED) != 0) {
 				setlinestyle(3);
 				immBegin(GWN_PRIM_LINES, 2);
 				immVertex3fv(pos, ob->obmat[3]);
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 243788c20b3..2b25581e2b3 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -5467,8 +5467,8 @@ static void set_trans_object_base_flags(TransInfo *t)
 
 			/* if parent selected, deselect */
 			while (parsel) {
-				Base *parbase = BKE_scene_layer_base_find(sl, parsel);
-				if (parbase->flag & BASE_SELECTED) {
+				if (parsel->base_flag & BASE_SELECTED) {
+					Base *parbase = BKE_scene_layer_base_find(sl, parsel);
 					if (parbase) { /* in rare cases this can fail */
 						if (TESTBASELIB_BGMODE_NEW(parbase)) {
 							break;




More information about the Bf-blender-cvs mailing list