[Bf-blender-cvs] [9dc5e1d] master: Make IDPreview handling code use new recursive libquery looper.
Bastien Montagne
noreply at git.blender.org
Thu Mar 24 16:10:51 CET 2016
Commit: 9dc5e1dbc2b62b69833b8452fafd31e83292a96b
Author: Bastien Montagne
Date: Thu Mar 24 16:10:05 2016 +0100
Branches: master
https://developer.blender.org/rB9dc5e1dbc2b62b69833b8452fafd31e83292a96b
Make IDPreview handling code use new recursive libquery looper.
===================================================================
M source/blender/windowmanager/intern/wm_operators.c
===================================================================
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index bbe6c76..b5ad027 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -63,7 +63,6 @@
#include "BLI_dial.h"
#include "BLI_dynstr.h" /*for WM_operator_pystring */
#include "BLI_linklist.h"
-#include "BLI_linklist_stack.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_utildefines.h"
@@ -4894,12 +4893,10 @@ static void WM_OT_dependency_relations(wmOperatorType *ot)
/* *************************** Mat/tex/etc. previews generation ************* */
-typedef struct PreviewsIDEnsureStack {
+typedef struct PreviewsIDEnsureData {
bContext *C;
Scene *scene;
-
- BLI_LINKSTACK_DECLARE(id_stack, ID *);
-} PreviewsIDEnsureStack;
+} PreviewsIDEnsureData;
static void previews_id_ensure(bContext *C, Scene *scene, ID *id)
{
@@ -4913,17 +4910,15 @@ static void previews_id_ensure(bContext *C, Scene *scene, ID *id)
}
}
-static int previews_id_ensure_callback(void *todo_v, ID *UNUSED(idself), ID **idptr, int UNUSED(cd_flag))
+static int previews_id_ensure_callback(void *userdata, ID *UNUSED(self_id), ID **idptr, int UNUSED(cd_flag))
{
- PreviewsIDEnsureStack *todo = todo_v;
+ PreviewsIDEnsureData *data = userdata;
ID *id = *idptr;
if (id && (id->tag & LIB_TAG_DOIT)) {
- if (ELEM(GS(id->name), ID_MA, ID_TE, ID_IM, ID_WO, ID_LA)) {
- previews_id_ensure(todo->C, todo->scene, id);
- }
- id->tag &= ~LIB_TAG_DOIT; /* Tag the ID as done in any case. */
- BLI_LINKSTACK_PUSH(todo->id_stack, id);
+ BLI_assert(ELEM(GS(id->name), ID_MA, ID_TE, ID_IM, ID_WO, ID_LA));
+ previews_id_ensure(data->C, data->scene, id);
+ id->tag &= ~LIB_TAG_DOIT;
}
return IDWALK_RET_NOP;
@@ -4933,35 +4928,33 @@ static int previews_ensure_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
ListBase *lb[] = {&bmain->mat, &bmain->tex, &bmain->image, &bmain->world, &bmain->lamp, NULL};
- PreviewsIDEnsureStack preview_id_stack;
+ PreviewsIDEnsureData preview_id_data;
Scene *scene;
ID *id;
int i;
/* We use LIB_TAG_DOIT to check whether we have already handled a given ID or not. */
- BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, true);
-
- BLI_LINKSTACK_INIT(preview_id_stack.id_stack);
+ BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
+ for (i = 0; lb[i]; i++) {
+ BKE_main_id_tag_listbase(lb[i], LIB_TAG_DOIT, true);
+ }
+ preview_id_data.C = C;
for (scene = bmain->scene.first; scene; scene = scene->id.next) {
- preview_id_stack.scene = scene;
- preview_id_stack.C = C;
+ preview_id_data.scene = scene;
id = (ID *)scene;
- do {
- /* This will loop over all IDs linked by current one, render icons for them if needed,
- * and add them to 'todo' preview_id_stack. */
- BKE_library_foreach_ID_link(id, previews_id_ensure_callback, &preview_id_stack, IDWALK_READONLY);
- } while ((id = BLI_LINKSTACK_POP(preview_id_stack.id_stack)));
+ BKE_library_foreach_ID_link(id, previews_id_ensure_callback, &preview_id_data, IDWALK_RECURSE);
}
- BLI_LINKSTACK_FREE(preview_id_stack.id_stack);
-
/* Check a last time for ID not used (fake users only, in theory), and
* do our best for those, using current scene... */
for (i = 0; lb[i]; i++) {
for (id = lb[i]->first; id; id = id->next) {
- previews_id_ensure(C, NULL, id);
+ if (id->tag & LIB_TAG_DOIT) {
+ previews_id_ensure(C, NULL, id);
+ id->tag &= ~LIB_TAG_DOIT;
+ }
}
}
More information about the Bf-blender-cvs
mailing list