[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49584] trunk/blender/source/blender: fix for crash when moving frames about in the node space, was possible to move a node into its own child frame ( causing recursive parent loop).
Campbell Barton
ideasman42 at gmail.com
Sun Aug 5 22:40:26 CEST 2012
Revision: 49584
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49584
Author: campbellbarton
Date: 2012-08-05 20:40:26 +0000 (Sun, 05 Aug 2012)
Log Message:
-----------
fix for crash when moving frames about in the node space, was possible to move a node into its own child frame (causing recursive parent loop).
also some minor code cleanup.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_node.h
trunk/blender/source/blender/blenkernel/intern/node.c
trunk/blender/source/blender/editors/space_node/drawnode.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_relationships.c
trunk/blender/source/blender/editors/transform/transform.h
trunk/blender/source/blender/editors/transform/transform_generics.c
Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h 2012-08-05 20:40:26 UTC (rev 49584)
@@ -359,6 +359,7 @@
void nodeToView(struct bNode *node, float x, float y, float *rx, float *ry);
void nodeFromView(struct bNode *node, float x, float y, float *rx, float *ry);
+int nodeAttachNodeCheck(struct bNode *node, struct bNode *parent);
void nodeAttachNode(struct bNode *node, struct bNode *parent);
void nodeDetachNode(struct bNode *node);
Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/blenkernel/intern/node.c 2012-08-05 20:40:26 UTC (rev 49584)
@@ -592,9 +592,25 @@
}
}
+int nodeAttachNodeCheck(bNode *node, bNode *parent)
+{
+ bNode *parent_recurse;
+ for (parent_recurse = node; parent_recurse; parent_recurse = parent_recurse->parent) {
+ if (parent_recurse == parent) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
void nodeAttachNode(bNode *node, bNode *parent)
{
float locx, locy;
+
+ BLI_assert(parent->type == NODE_FRAME);
+ BLI_assert(nodeAttachNodeCheck(parent, node) == FALSE);
+
nodeToView(node, 0.0f, 0.0f, &locx, &locy);
node->parent = parent;
@@ -607,6 +623,9 @@
float locx, locy;
if (node->parent) {
+
+ BLI_assert(node->parent->type == NODE_FRAME);
+
/* transform to view space */
nodeToView(node, 0.0f, 0.0f, &locx, &locy);
node->locx = locx;
Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c 2012-08-05 20:40:26 UTC (rev 49584)
@@ -996,9 +996,7 @@
float alpha;
/* skip if out of view */
- if (node->totr.xmax < ar->v2d.cur.xmin || node->totr.xmin > ar->v2d.cur.xmax ||
- node->totr.ymax < ar->v2d.cur.ymin || node->totr.ymin > ar->v2d.cur.ymax) {
-
+ if (BLI_rctf_isect(&node->totr, &ar->v2d.cur, NULL) == FALSE) {
uiEndBlock(C, node->block);
node->block = NULL;
return;
Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c 2012-08-05 20:40:26 UTC (rev 49584)
@@ -681,9 +681,7 @@
nodeShaderSynchronizeID(node, 0);
/* skip if out of view */
- if (node->totr.xmax < ar->v2d.cur.xmin || node->totr.xmin > ar->v2d.cur.xmax ||
- node->totr.ymax < ar->v2d.cur.ymin || node->totr.ymin > ar->v2d.cur.ymax)
- {
+ if (BLI_rctf_isect(&node->totr, &ar->v2d.cur, NULL) == FALSE) {
uiEndBlock(C, node->block);
node->block = NULL;
return;
Modified: trunk/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_edit.c 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/editors/space_node/node_edit.c 2012-08-05 20:40:26 UTC (rev 49584)
@@ -762,7 +762,7 @@
/* ************************** Node generic ************** */
/* is rct in visible part of node? */
-static bNode *visible_node(SpaceNode *snode, rctf *rct)
+static bNode *visible_node(SpaceNode *snode, const rctf *rct)
{
bNode *node;
Modified: trunk/blender/source/blender/editors/space_node/node_relationships.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_relationships.c 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/editors/space_node/node_relationships.c 2012-08-05 20:40:26 UTC (rev 49584)
@@ -1147,17 +1147,26 @@
for (node = ntree->nodes.last; node; node = node->prev) {
if (node->flag & NODE_SELECT) {
if (node->parent == NULL) {
- /* attach all unparented nodes */
- nodeAttachNode(node, frame);
+ /* disallow moving a parent into its child */
+ if (nodeAttachNodeCheck(frame, node) == FALSE) {
+ /* attach all unparented nodes */
+ nodeAttachNode(node, frame);
+ }
}
else {
/* attach nodes which share parent with the frame */
- for (parent = frame->parent; parent; parent = parent->parent)
- if (parent == node->parent)
+ for (parent = frame->parent; parent; parent = parent->parent) {
+ if (parent == node->parent) {
break;
+ }
+ }
+
if (parent) {
- nodeDetachNode(node);
- nodeAttachNode(node, frame);
+ /* disallow moving a parent into its child */
+ if (nodeAttachNodeCheck(frame, node) == FALSE) {
+ nodeDetachNode(node);
+ nodeAttachNode(node, frame);
+ }
}
}
}
Modified: trunk/blender/source/blender/editors/transform/transform.h
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.h 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/editors/transform/transform.h 2012-08-05 20:40:26 UTC (rev 49584)
@@ -666,7 +666,7 @@
void postTrans (struct bContext *C, TransInfo *t);
void resetTransRestrictions(TransInfo *t);
-void drawLine(TransInfo *t, float *center, float *dir, char axis, short options);
+void drawLine(TransInfo *t, const float center[3], const float dir[3], char axis, short options);
void drawNonPropEdge(const struct bContext *C, TransInfo *t);
Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c 2012-08-05 20:16:14 UTC (rev 49583)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c 2012-08-05 20:40:26 UTC (rev 49584)
@@ -923,7 +923,7 @@
}
}
-void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
+void drawLine(TransInfo *t, const float center[3], const float dir[3], char axis, short options)
{
float v1[3], v2[3], v3[3];
unsigned char col[3], col2[3];
@@ -1017,15 +1017,10 @@
t->total = 0;
t->val = 0.0f;
-
- t->vec[0] =
- t->vec[1] =
- t->vec[2] = 0.0f;
- t->center[0] =
- t->center[1] =
- t->center[2] = 0.0f;
-
+ zero_v3(t->vec);
+ zero_v3(t->center);
+
unit_m3(t->mat);
/* if there's an event, we're modal */
More information about the Bf-blender-cvs
mailing list