[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57401] trunk/blender/source/blender/ blenkernel/intern: Supplementary fix for #35640, internal node group trees (inside material, lamp, world, texture and scene) still keep their original library pointer when appending, making them uneditable.

Lukas Toenne lukas.toenne at googlemail.com
Wed Jun 12 09:02:52 CEST 2013


Revision: 57401
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57401
Author:   lukastoenne
Date:     2013-06-12 07:02:52 +0000 (Wed, 12 Jun 2013)
Log Message:
-----------
Supplementary fix for #35640, internal node group trees (inside material, lamp, world, texture and scene) still keep their original library pointer when appending, making them uneditable. Clearing the
lib pointer now has been moved inside the id_clear_lib_data function, with an ugly switch statement to handle integrated node trees.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/lamp.c
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/material.c
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/blenkernel/intern/world.c

Modified: trunk/blender/source/blender/blenkernel/intern/lamp.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lamp.c	2013-06-12 06:51:02 UTC (rev 57400)
+++ trunk/blender/source/blender/blenkernel/intern/lamp.c	2013-06-12 07:02:52 UTC (rev 57401)
@@ -172,9 +172,6 @@
 	if (la->id.lib == NULL) return;
 	if (la->id.us == 1) {
 		id_clear_lib_data(bmain, &la->id);
-		/* nodetree uses same lib */
-		if (la->nodetree)
-			la->nodetree->id.lib = NULL;
 		return;
 	}
 	
@@ -189,9 +186,6 @@
 	
 	if (is_local && is_lib == FALSE) {
 		id_clear_lib_data(bmain, &la->id);
-		/* nodetree uses same lib */
-		if (la->nodetree)
-			la->nodetree->id.lib = NULL;
 	}
 	else if (is_local && is_lib) {
 		Lamp *la_new = BKE_lamp_copy(la);

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2013-06-12 06:51:02 UTC (rev 57400)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2013-06-12 07:02:52 UTC (rev 57401)
@@ -1428,11 +1428,26 @@
  * don't have other library users. */
 void id_clear_lib_data(Main *bmain, ID *id)
 {
+	bNodeTree *ntree = NULL;
+
 	BKE_id_lib_local_paths(bmain, id->lib, id);
 
 	id->lib = NULL;
 	id->flag = LIB_LOCAL;
 	new_id(which_libbase(bmain, GS(id->name)), id, NULL);
+
+	/* internal bNodeTree blocks inside ID types below
+	 * also stores id->lib, make sure this stays in sync.
+	 */
+	switch (GS(id->name)) {
+		case ID_SCE:	ntree = ((Scene *)id)->nodetree;		break;
+		case ID_MA:		ntree = ((Material *)id)->nodetree;		break;
+		case ID_LA:		ntree = ((Lamp *)id)->nodetree;			break;
+		case ID_WO:		ntree = ((World *)id)->nodetree;		break;
+		case ID_TE:		ntree = ((Tex *)id)->nodetree;			break;
+	}
+	if (ntree)
+		ntree->id.lib = NULL;
 }
 
 /* next to indirect usage in read/writefile also in editobject.c scene.c */

Modified: trunk/blender/source/blender/blenkernel/intern/material.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/material.c	2013-06-12 06:51:02 UTC (rev 57400)
+++ trunk/blender/source/blender/blenkernel/intern/material.c	2013-06-12 07:02:52 UTC (rev 57401)
@@ -308,9 +308,6 @@
 	if (ma->id.us == 1) {
 		id_clear_lib_data(bmain, &ma->id);
 		extern_local_material(ma);
-		/* nodetree uses same lib */
-		if (ma->nodetree)
-			ma->nodetree->id.lib = NULL;
 		return;
 	}
 
@@ -373,9 +370,6 @@
 	if (is_local && is_lib == FALSE) {
 		id_clear_lib_data(bmain, &ma->id);
 		extern_local_material(ma);
-		/* nodetree uses same lib */
-		if (ma->nodetree)
-			ma->nodetree->id.lib = NULL;
 	}
 	/* Both user and local, so copy. */
 	else if (is_local && is_lib) {

Modified: trunk/blender/source/blender/blenkernel/intern/texture.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/texture.c	2013-06-12 06:51:02 UTC (rev 57400)
+++ trunk/blender/source/blender/blenkernel/intern/texture.c	2013-06-12 07:02:52 UTC (rev 57401)
@@ -765,9 +765,6 @@
 	if (tex->id.us == 1) {
 		id_clear_lib_data(bmain, &tex->id);
 		extern_local_texture(tex);
-		/* nodetree uses same lib */
-		if (tex->nodetree)
-			tex->nodetree->id.lib = NULL;
 		return;
 	}
 	
@@ -827,9 +824,6 @@
 	if (is_local && is_lib == FALSE) {
 		id_clear_lib_data(bmain, &tex->id);
 		extern_local_texture(tex);
-		/* nodetree uses same lib */
-		if (tex->nodetree)
-			tex->nodetree->id.lib = NULL;
 	}
 	else if (is_local && is_lib) {
 		Tex *tex_new = BKE_texture_copy(tex);

Modified: trunk/blender/source/blender/blenkernel/intern/world.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/world.c	2013-06-12 06:51:02 UTC (rev 57400)
+++ trunk/blender/source/blender/blenkernel/intern/world.c	2013-06-12 07:02:52 UTC (rev 57401)
@@ -179,9 +179,6 @@
 	if (wrld->id.lib == NULL) return;
 	if (wrld->id.us == 1) {
 		id_clear_lib_data(bmain, &wrld->id);
-		/* nodetree uses same lib */
-		if (wrld->nodetree)
-			wrld->nodetree->id.lib = NULL;
 		return;
 	}
 	
@@ -194,9 +191,6 @@
 
 	if (is_local && is_lib == FALSE) {
 		id_clear_lib_data(bmain, &wrld->id);
-		/* nodetree uses same lib */
-		if (wrld->nodetree)
-			wrld->nodetree->id.lib = NULL;
 	}
 	else if (is_local && is_lib) {
 		World *wrld_new = BKE_world_copy(wrld);




More information about the Bf-blender-cvs mailing list