[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