diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-08-06 00:40:26 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-08-06 00:40:26 +0400 |
commit | e592f757e87dd6610fcf3d1ddda95b8e666fe48b (patch) | |
tree | 0a72cf1f14f3d8ad5ba116fee0d2ec716f7830a2 /source/blender | |
parent | 685592f9d9021e3745c99fb29e33db8434aec335 (diff) |
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.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 19 | ||||
-rw-r--r-- | source/blender/editors/space_node/drawnode.c | 4 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_draw.c | 4 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_relationships.c | 21 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.h | 2 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 13 |
8 files changed, 43 insertions, 23 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 00bdbbf4537..55d9e700efc 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -359,6 +359,7 @@ void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node); 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); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 565e2de79f8..4090b6fe93b 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -592,9 +592,25 @@ void nodeFromView(bNode *node, float x, float y, float *rx, float *ry) } } +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 @@ void nodeDetachNode(struct bNode *node) 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; diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 9f6d6d0170f..de882bd3635 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -996,9 +996,7 @@ static void node_draw_frame(const bContext *C, ARegion *ar, SpaceNode *snode, bN 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; diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index c46c73cadb2..ed52a14ec98 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -681,9 +681,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN 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; diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 85ad590f772..0af04856522 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -762,7 +762,7 @@ static void edit_node_properties_get(wmOperator *op, bNodeTree *ntree, bNode **r /* ************************** 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; diff --git a/source/blender/editors/space_node/node_relationships.c b/source/blender/editors/space_node/node_relationships.c index 5c59555a0ed..d82118facd1 100644 --- a/source/blender/editors/space_node/node_relationships.c +++ b/source/blender/editors/space_node/node_relationships.c @@ -1147,17 +1147,26 @@ static int node_attach_exec(bContext *C, wmOperator *UNUSED(op)) 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); + } } } } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 3ab5bf7bbfb..1585fb1ad6b 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -666,7 +666,7 @@ int initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, struc 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); diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 43de0f2b35f..8e73fb8b8cb 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -923,7 +923,7 @@ void recalcData(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) { float v1[3], v2[3], v3[3]; unsigned char col[3], col2[3]; @@ -1017,15 +1017,10 @@ int initTransInfo(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event) 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 */ |