[Bf-blender-cvs] [fbae5a994c] id_override_static: Various minor fixes & tweaks.
Bastien Montagne
noreply at git.blender.org
Wed Feb 8 20:26:33 CET 2017
Commit: fbae5a994c6de61415c6931ed4868926923a4544
Author: Bastien Montagne
Date: Wed Feb 8 20:26:11 2017 +0100
Branches: id_override_static
https://developer.blender.org/rBfbae5a994c6de61415c6931ed4868926923a4544
Various minor fixes & tweaks.
===================================================================
M source/blender/blenkernel/BKE_library_override.h
M source/blender/blenkernel/intern/library_override.c
M source/blender/makesrna/intern/rna_access.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_library_override.h b/source/blender/blenkernel/BKE_library_override.h
index 41d5da6fdf..777c245d97 100644
--- a/source/blender/blenkernel/BKE_library_override.h
+++ b/source/blender/blenkernel/BKE_library_override.h
@@ -62,7 +62,7 @@ void BKE_override_operations_store_end(struct ID *local);
bool BKE_override_operations_create(struct ID *local, const bool no_skip);
-void BKE_override_update(struct ID *local, const bool do_init);
+void BKE_override_update(struct Main *bmain, struct ID *local, const bool do_init);
void BKE_main_override_update(struct Main *bmain, const bool do_init);
diff --git a/source/blender/blenkernel/intern/library_override.c b/source/blender/blenkernel/intern/library_override.c
index b236e78db2..2461681abd 100644
--- a/source/blender/blenkernel/intern/library_override.c
+++ b/source/blender/blenkernel/intern/library_override.c
@@ -32,7 +32,9 @@
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
+#include "DNA_object_types.h"
+#include "BKE_depsgraph.h"
#include "BKE_global.h" /* XXX Yuck! temp hack! */
#include "BKE_library.h"
#include "BKE_library_override.h"
@@ -48,7 +50,7 @@
#include "PIL_time.h"
#include "PIL_time_utildefines.h"
-#define OVERRIDE_AUTO_GAP 0.2 /* 200ms between auto-override checks. */
+#define OVERRIDE_AUTO_CHECK_DELAY 0.2 /* 200ms between auto-override checks. */
/** Initialize empty overriding of \a reference_id by \a local_id. */
IDOverride *BKE_override_init(struct ID *local_id, struct ID *reference_id)
@@ -356,7 +358,7 @@ bool BKE_override_operations_create(ID *local, const bool no_skip)
if (local->flag & LIB_AUTOOVERRIDE) {
/* This prevents running that (heavy) callback too often when editing data. */
const double currtime = PIL_check_seconds_timer();
- if (!no_skip && (currtime - local->override->last_auto_run) < OVERRIDE_AUTO_GAP) {
+ if (!no_skip && (currtime - local->override->last_auto_run) < OVERRIDE_AUTO_CHECK_DELAY) {
return ret;
}
local->override->last_auto_run = currtime;
@@ -377,7 +379,7 @@ bool BKE_override_operations_create(ID *local, const bool no_skip)
}
/** Update given override from its reference (re-applying overriden properties). */
-void BKE_override_update(ID *local, const bool do_init)
+void BKE_override_update(Main *bmain, ID *local, const bool do_init)
{
if (local->override == NULL) {
return;
@@ -385,7 +387,7 @@ void BKE_override_update(ID *local, const bool do_init)
/* Recursively do 'ancestors' overrides first, if any. */
if (local->override->reference->override && (local->override->reference->tag & LIB_TAG_OVERRIDE_OK) == 0) {
- BKE_override_update(local->override->reference, do_init);
+ BKE_override_update(bmain, local->override->reference, do_init);
}
/* We want to avoid having to remap here, however creating up-to-date override is much simpler if based
@@ -400,7 +402,7 @@ void BKE_override_update(ID *local, const bool do_init)
* also remain correct). */
ID *tmp_id;
- id_copy(G.main, local->override->reference, &tmp_id, false); /* XXX ...and worse of all, this won't work with scene! */
+ id_copy(bmain, local->override->reference, &tmp_id, false); /* XXX ...and worse of all, this won't work with scene! */
if (tmp_id == NULL) {
return;
@@ -417,7 +419,10 @@ void BKE_override_update(ID *local, const bool do_init)
BKE_id_swap(local, tmp_id);
/* Again, horribly innefficient in our case, we need something off-Main (aka moar generic nolib copy/free stuff)! */
- BKE_libblock_free_ex(G.main, tmp_id, true, false);
+ /* XXX And crashing in complex cases (e.g. because depsgraph uses same data...). */
+ BKE_libblock_free_ex(bmain, tmp_id, true, false);
+
+ DAG_id_tag_update_ex(bmain, local, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
local->tag |= LIB_TAG_OVERRIDE_OK;
}
@@ -436,8 +441,11 @@ void BKE_main_override_update(Main *bmain, const bool do_init)
for (id = lb->first; id; id = id->next) {
if (id->override != NULL && id->lib == NULL) {
- BKE_override_update(id, do_init);
+ BKE_override_update(bmain, id, do_init);
}
}
}
+
+ /* Full rebuild of DAG! */
+ DAG_relations_tag_update(bmain);
}
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index dae31b55fd..793aefc856 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -7163,7 +7163,10 @@ static bool rna_property_override_equals(
equals = false;
}
else if (rna_path) {
- extended_rna_path = BLI_sprintfN("%s[\"%s\"]", rna_path, propname_a); /* XXX TODO escape propname! */
+ const size_t esc_propname_a_len = strlen(propname_a) * 2;
+ char *esc_propname_a = alloca(sizeof(*esc_propname_a) * esc_propname_a_len);
+ BLI_strescape(esc_propname_a, propname_a, esc_propname_a_len);
+ extended_rna_path = BLI_sprintfN("%s[\"%s\"]", rna_path, esc_propname_a);
}
}
else { /* Based on index... */
@@ -7172,7 +7175,7 @@ static bool rna_property_override_equals(
}
}
- {
+ if (equals) {
bool eq = rna_property_override_equals_propptr(
&iter_a.ptr, &iter_b.ptr, mode,
override, extended_rna_path, r_override_changed, ignore_non_overridable, ignore_overridden);
More information about the Bf-blender-cvs
mailing list