[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35520] trunk/blender/source/blender: Fix for crashes due to links without fromnode pointers.

Lukas Toenne lukas.toenne at googlemail.com
Sun Mar 13 23:07:56 CET 2011


Revision: 35520
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35520
Author:   lukastoenne
Date:     2011-03-13 22:07:55 +0000 (Sun, 13 Mar 2011)
Log Message:
-----------
Fix for crashes due to links without fromnode pointers. This can happen with "unfinished" links created during the modal linking operator or when creating links from group tree inputs.

In addition don't store unfinished links in the nodetree->links list any more. This makes code a bit safer because all links in that list can be considered valid now. The temporary bNodeLinkDrag structs used by the modal linking operator are now also stored in a list in SpaceNode, so these links can be drawn too (this separation also allows different display of temporary links, e.g. currently they are drawn on top of all nodes).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/editors/space_node/node_draw.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/editors/space_node/node_intern.h
    trunk/blender/source/blender/makesdna/DNA_space_types.h

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2011-03-13 20:39:15 UTC (rev 35519)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2011-03-13 22:07:55 UTC (rev 35520)
@@ -2465,7 +2465,7 @@
 	if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) {
 		int retval= 1;
 		for(sock= node->inputs.first; sock; sock= sock->next) {
-			if(sock->link)
+			if(sock->link && sock->link->fromnode)
 				retval &= node_only_value(sock->link->fromnode);
 		}
 		return retval;
@@ -2623,7 +2623,7 @@
 	for(node= ntree->nodes.first; node; node= node->next) {
 		if((node->exec & NODE_FINISHED)==0) {
 			for(sock= node->inputs.first; sock; sock= sock->next)
-				if(sock->link)
+				if(sock->link && sock->link->fromnode)
 					sock->link->fromnode->exec &= ~NODE_FREEBUFS;
 		}
 	}

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c	2011-03-13 20:39:15 UTC (rev 35519)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c	2011-03-13 22:07:55 UTC (rev 35520)
@@ -991,6 +991,7 @@
 {
 	bNode *node;
 	bNodeLink *link;
+	bNodeLinkDrag *nldrag;
 	int a;
 	
 	if(ntree==NULL) return;		/* groups... */
@@ -1025,6 +1026,14 @@
 				node_draw_basis(C, ar, snode, ntree, node);
 		}
 	}	
+	
+	/* temporary links */
+	glEnable(GL_BLEND);
+	glEnable(GL_LINE_SMOOTH);
+	for(nldrag= snode->linkdrag.first; nldrag; nldrag= nldrag->next)
+		node_draw_link(&ar->v2d, snode, nldrag->link);
+	glDisable(GL_LINE_SMOOTH);
+	glDisable(GL_BLEND);
 }
 
 static void group_verify_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)

Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c	2011-03-13 20:39:15 UTC (rev 35519)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c	2011-03-13 22:07:55 UTC (rev 35520)
@@ -2028,15 +2028,6 @@
 
 /* *************************** add link op ******************** */
 
-/* temp data to pass on to modal */
-typedef struct NodeLinkDrag
-{
-	bNode *node;
-	bNodeSocket *sock;
-	bNodeLink *link;
-	int in_out;
-} NodeLinkDrag;
-
 static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeLink *link)
 {
 	bNodeLink *tlink;
@@ -2077,7 +2068,7 @@
 {
 	SpaceNode *snode= CTX_wm_space_node(C);
 	ARegion *ar= CTX_wm_region(C);
-	NodeLinkDrag *nldrag= op->customdata;
+	bNodeLinkDrag *nldrag= op->customdata;
 	bNode *tnode, *node;
 	bNodeSocket *tsock= NULL, *sock;
 	bNodeLink *link;
@@ -2100,11 +2091,15 @@
 						if( link->tosock!= tsock && (!tnode || (tnode!=node && link->tonode!=tnode)) ) {
 							link->tonode= tnode;
 							link->tosock= tsock;
+							if (link->prev==NULL && link->next==NULL)
+								BLI_addtail(&snode->edittree->links, link);
 							ntreeSolveOrder(snode->edittree);	/* for interactive red line warning */
 						}
 					}
 				}
 				else {
+					BLI_remlink(&snode->edittree->links, link);
+					link->prev = link->next = NULL;
 					link->tonode= NULL;
 					link->tosock= NULL;
 				}
@@ -2116,12 +2111,16 @@
 							if( link->fromsock!= tsock && (!tnode || (tnode!=node && link->fromnode!=tnode)) ) {
 								link->fromnode= tnode;
 								link->fromsock= tsock;
+								if (link->prev==NULL && link->next==NULL)
+									BLI_addtail(&snode->edittree->links, link);
 								ntreeSolveOrder(snode->edittree);	/* for interactive red line warning */
 							}
 						}
 					}
 				}
 				else {
+					BLI_remlink(&snode->edittree->links, link);
+					link->prev = link->next = NULL;
 					link->fromnode= NULL;
 					link->fromsock= NULL;
 				}
@@ -2148,10 +2147,14 @@
 				if (link->tonode && link->tosock) {
 					link->fromsock = nodeGroupExposeSocket(snode->edittree, link->tosock, SOCK_IN);
 					link->fromnode = NULL;
+					if (link->prev==NULL && link->next==NULL)
+						BLI_addtail(&snode->edittree->links, link);
 				}
 				else if (link->fromnode && link->fromsock) {
 					link->tosock = nodeGroupExposeSocket(snode->edittree, link->fromsock, SOCK_OUT);
 					link->tonode = NULL;
+					if (link->prev==NULL && link->next==NULL)
+						BLI_addtail(&snode->edittree->links, link);
 				}
 			}
 			else
@@ -2161,8 +2164,8 @@
 			node_tree_verify_groups(snode->nodetree);
 			snode_notify(C, snode);
 			
-			MEM_freeN(op->customdata);
-			op->customdata= NULL;
+			BLI_remlink(&snode->linkdrag, nldrag);
+			MEM_freeN(nldrag);
 			
 			return OPERATOR_FINISHED;
 	}
@@ -2171,7 +2174,7 @@
 }
 
 /* return 1 when socket clicked */
-static int node_link_init(SpaceNode *snode, NodeLinkDrag *nldrag)
+static int node_link_init(SpaceNode *snode, bNodeLinkDrag *nldrag)
 {
 	bNodeLink *link;
 
@@ -2223,8 +2226,9 @@
 {
 	SpaceNode *snode= CTX_wm_space_node(C);
 	ARegion *ar= CTX_wm_region(C);
-	NodeLinkDrag *nldrag= MEM_callocN(sizeof(NodeLinkDrag), "drag link op customdata");
+	bNodeLinkDrag *nldrag= MEM_callocN(sizeof(bNodeLinkDrag), "drag link op customdata");
 	
+	
 	UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, 
 							 &snode->mx, &snode->my);
 
@@ -2236,10 +2240,21 @@
 		op->customdata= nldrag;
 		
 		/* we make a temporal link */
-		if(nldrag->in_out==SOCK_OUT)
-			nldrag->link= nodeAddLink(snode->edittree, nldrag->node, nldrag->sock, NULL, NULL);
-		else
-			nldrag->link= nodeAddLink(snode->edittree, NULL, NULL, nldrag->node, nldrag->sock);
+		if(nldrag->in_out==SOCK_OUT) {
+			nldrag->link= MEM_callocN(sizeof(bNodeLink), "link");
+			nldrag->link->fromnode= nldrag->node;
+			nldrag->link->fromsock= nldrag->sock;
+			nldrag->link->tonode= NULL;
+			nldrag->link->tosock= NULL;
+		}
+		else {
+			nldrag->link= MEM_callocN(sizeof(bNodeLink), "link");
+			nldrag->link->fromnode= NULL;
+			nldrag->link->fromsock= NULL;
+			nldrag->link->tonode= nldrag->node;
+			nldrag->link->tosock= nldrag->sock;
+		}
+		BLI_addtail(&snode->linkdrag, nldrag);
 		
 		/* add modal handler */
 		WM_event_add_modal_handler(C, op);

Modified: trunk/blender/source/blender/editors/space_node/node_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_intern.h	2011-03-13 20:39:15 UTC (rev 35519)
+++ trunk/blender/source/blender/editors/space_node/node_intern.h	2011-03-13 22:07:55 UTC (rev 35520)
@@ -40,7 +40,21 @@
 struct View2D;
 struct bContext;
 struct wmWindowManager;
+struct bNode;
+struct bNodeSocket;
+struct bNodeLink;
 
+/* temp data to pass on to modal */
+typedef struct bNodeLinkDrag
+{
+	struct bNodeLinkDrag *next, *prev;
+	
+	struct bNode *node;
+	struct bNodeSocket *sock;
+	struct bNodeLink *link;
+	int in_out;
+} bNodeLinkDrag;
+
 /* space_node.c */
 ARegion *node_has_buttons_region(ScrArea *sa);
 

Modified: trunk/blender/source/blender/makesdna/DNA_space_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_space_types.h	2011-03-13 20:39:15 UTC (rev 35519)
+++ trunk/blender/source/blender/makesdna/DNA_space_types.h	2011-03-13 22:07:55 UTC (rev 35520)
@@ -406,6 +406,7 @@
 	int treetype;		/* treetype: as same nodetree->type */
 	short texfrom;		/* texfrom object, world or brush */
 	short recalc;		/* currently on 0/1, for auto compo */
+	ListBase linkdrag;	/* temporary data for modal linking operator */
 	
 	struct bGPdata *gpd;		/* grease-pencil data */
 } SpaceNode;




More information about the Bf-blender-cvs mailing list