diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2016-11-21 17:19:34 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2016-11-21 17:25:33 +0300 |
commit | b97c567c1df1e5c38833c4af8a95962e0ece4c61 (patch) | |
tree | 2697e82ca93f70f702c4b1b1f98c6322703539d6 /source | |
parent | 2a78635dea1a8e8e54f5350c9856ecc69f2b1751 (diff) |
Fix two very bad issues in new ID.make_local RNA function.
I) `clear_proxy` parameter was not assigned to parm in RNA define code,
so 'pyfunc optional' flag was set to `new_id` parameter of `user_remap`
func - super ugly!
II) `clear_proxy` parameter itself, when set to False, would allow to
leave .blend file in invalid state (more than one proxy of same object),
this should never, ever be allowed in RNA API imho. Left the PAI
untouched for now, just disabled any effect from this parameter (hence
always clearing proxy when copying).
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/makesrna/intern/rna_ID.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index 5174c957834..b5015c3fbde 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -348,13 +348,21 @@ static void rna_ID_user_remap(ID *id, Main *bmain, ID *new_id) } } -static struct ID *rna_ID_make_local(struct ID *self, Main *bmain, int clear_proxy) +static struct ID *rna_ID_make_local(struct ID *self, Main *bmain, int UNUSED(clear_proxy)) { + /* XXX This is *very, very bad*, since it may leave Main in invalid state (two objects, one local and one linked, + * proxies of same reference linked object). + * This can be allowed in C code (with extensive warning and documentation), + * but is totally fully forbidden in our RNA API! + * So disabling for now. */ +#if 0 /* Special case, as we can't rely on id_make_local(); it clears proxies. */ if (!clear_proxy && GS(self->name) == ID_OB) { BKE_object_make_local_ex(bmain, (Object *)self, false, clear_proxy); } - else { + else +#endif + { id_make_local(bmain, self, false, false); } @@ -1018,9 +1026,7 @@ static void rna_def_ID(BlenderRNA *brna) RNA_def_function_ui_description(func, "Make this datablock local, return local one " "(may be a copy of the original, in case it is also indirectly used)"); RNA_def_function_flag(func, FUNC_USE_MAIN); - RNA_def_boolean(func, "clear_proxy", true, "", - "Whether to clear proxies (the default behavior); can cause proxies to be duplicated" - " when still referred to from another library"); + parm = RNA_def_boolean(func, "clear_proxy", true, "", "DO NOT USE! - has no effect at all"); RNA_def_property_flag(parm, PROP_PYFUNC_OPTIONAL); parm = RNA_def_pointer(func, "id", "ID", "", "This ID, or the new ID if it was copied"); RNA_def_function_return(func, parm); |