[Bf-blender-cvs] [3141870] master: Outliner: postpone rebuilding the tree

Campbell Barton noreply at git.blender.org
Mon May 11 03:10:06 CEST 2015


Commit: 3141870c9657e7396a3f4b360b9ed2b8ee193122
Author: Campbell Barton
Date:   Mon May 11 11:06:35 2015 +1000
Branches: master
https://developer.blender.org/rB3141870c9657e7396a3f4b360b9ed2b8ee193122

Outliner: postpone rebuilding the tree

On existing Blender could rebuild tree many times (on freeing each ID).
Use a flag instead of immediately rebuilding.

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

M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/space_outliner/outliner_edit.c
M	source/blender/editors/space_outliner/outliner_tree.c
M	source/blender/makesdna/DNA_space_types.h

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

diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 4efb61a..a4dd226 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6051,7 +6051,7 @@ static void lib_link_screen(FileData *fd, Main *main)
 							}
 							if (so->treehash) {
 								/* rebuild hash table, because it depends on ids too */
-								BKE_outliner_treehash_rebuild_from_treestore(so->treehash, so->treestore);
+								so->storeflag |= SO_TREESTORE_REBUILD;
 							}
 						}
 					}
@@ -6405,7 +6405,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
 						}
 						if (so->treehash) {
 							/* rebuild hash table, because it depends on ids too */
-							BKE_outliner_treehash_rebuild_from_treestore(so->treehash, so->treestore);
+							so->storeflag |= SO_TREESTORE_REBUILD;
 						}
 					}
 				}
diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index 058b8c4..523584e 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -1984,7 +1984,8 @@ void ED_outliner_id_unref(SpaceOops *so, const ID *id)
 		}
 		if (so->treehash && changed) {
 			/* rebuild hash table, because it depends on ids too */
-			BKE_outliner_treehash_rebuild_from_treestore(so->treehash, so->treestore);
+			/* postpone a full rebuild because this can be called many times on-free */
+			so->storeflag |= SO_TREESTORE_REBUILD;
 		}
 	}
 }
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index ad37d72..728a750 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -1580,6 +1580,11 @@ void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
 	else
 		soops->search_flags &= ~SO_SEARCH_RECURSIVE;
 
+	if (soops->storeflag & SO_TREESTORE_REBUILD) {
+		soops->storeflag &= ~SO_TREESTORE_REBUILD;
+		BKE_outliner_treehash_rebuild_from_treestore(soops->treehash, soops->treestore);
+	}
+
 	if (soops->tree.first && (soops->storeflag & SO_TREESTORE_REDRAW))
 		return;
 
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index d6785da..9c02362 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -290,10 +290,13 @@ typedef enum eSpaceOutliner_Mode {
 
 /* SpaceOops->storeflag */
 typedef enum eSpaceOutliner_StoreFlag {
-	/* rebuild tree */
+	/* cleanup tree */
 	SO_TREESTORE_CLEANUP    = (1 << 0),
 	/* if set, it allows redraws. gets set for some allqueue events */
 	SO_TREESTORE_REDRAW     = (1 << 1),
+	/* rebuild the tree, similar to cleanup,
+	 * but defer a call to BKE_outliner_treehash_rebuild_from_treestore instead */
+	SO_TREESTORE_REBUILD    = (1 << 2),
 } eSpaceOutliner_StoreFlag;
 
 /* outliner search flags (SpaceOops->search_flags) */




More information about the Bf-blender-cvs mailing list