[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31063] trunk/blender/source/blender/ blenkernel: bugfix [#23164] Copied Scene Nodes!

Campbell Barton ideasman42 at gmail.com
Thu Aug 5 12:50:38 CEST 2010


Revision: 31063
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31063
Author:   campbellbarton
Date:     2010-08-05 12:50:38 +0200 (Thu, 05 Aug 2010)

Log Message:
-----------
bugfix [#23164] Copied Scene Nodes!
copying a scene would still have nodes point back to the old scene which would crash (in some cases) or break rendering.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenkernel/intern/scene.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2010-08-05 08:39:25 UTC (rev 31062)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2010-08-05 10:50:38 UTC (rev 31063)
@@ -136,6 +136,7 @@
 void			ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
 void			ntreeFreeTree(struct bNodeTree *ntree);
 struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
+void			ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
 void			ntreeMakeLocal(struct bNodeTree *ntree);
 
 void			ntreeSocketUseFlags(struct bNodeTree *ntree);

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2010-08-05 08:39:25 UTC (rev 31062)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2010-08-05 10:50:38 UTC (rev 31063)
@@ -1064,6 +1064,7 @@
  *	- internal_select is only 1 when used for duplicating selected nodes (i.e. Shift-D duplicate operator)
  *	- this gets called when executing compositing updates (for threaded previews)
  *	- when the nodetree datablock needs to be copied (i.e. when users get copied)
+ *	- for scene duplication use ntreeSwapID() after so we dont have stale pointers.
  */
 bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
 {
@@ -1142,6 +1143,18 @@
 	return newtree;
 }
 
+/* use when duplicating scenes */
+void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
+{
+	bNode *node;
+	/* for scene duplication only */
+	for(node= ntree->nodes.first; node; node= node->next) {
+		if(node->id==id_from) {
+			node->id= id_to;
+		}
+	}
+}
+
 /* *************** preview *********** */
 /* if node->preview, then we assume the rect to exist */
 

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2010-08-05 08:39:25 UTC (rev 31062)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2010-08-05 10:50:38 UTC (rev 31063)
@@ -172,9 +172,12 @@
 		BLI_duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
 		BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
 		BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
-		
-		scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
-		
+
+		if(sce->nodetree) {
+			scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+			ntreeSwitchID(scen->nodetree, &sce->id, &scen->id);
+		}
+
 		obase= sce->base.first;
 		base= scen->base.first;
 		while(base) {





More information about the Bf-blender-cvs mailing list