[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50045] branches/soc-2011-tomato: svn merge ^/trunk/blender -r50039:50044
Campbell Barton
ideasman42 at gmail.com
Mon Aug 20 16:01:16 CEST 2012
Revision: 50045
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50045
Author: campbellbarton
Date: 2012-08-20 14:01:16 +0000 (Mon, 20 Aug 2012)
Log Message:
-----------
svn merge ^/trunk/blender -r50039:50044
Revision Links:
--------------
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50039
Modified Paths:
--------------
branches/soc-2011-tomato/source/blender/blenkernel/BKE_node.h
branches/soc-2011-tomato/source/blender/blenkernel/intern/node.c
branches/soc-2011-tomato/source/blender/editors/space_node/node_edit.c
Property Changed:
----------------
branches/soc-2011-tomato/
branches/soc-2011-tomato/source/blender/editors/interface/interface.c
branches/soc-2011-tomato/source/blender/editors/space_outliner/
Property changes on: branches/soc-2011-tomato
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/vgroup_modifiers:38694-39989
/trunk/blender:36831-50039
+ /branches/ge_harmony:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/vgroup_modifiers:38694-39989
/trunk/blender:36831-50044
Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_node.h 2012-08-20 13:59:19 UTC (rev 50044)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_node.h 2012-08-20 14:01:16 UTC (rev 50045)
@@ -388,6 +388,7 @@
/* Node Clipboard */
void BKE_node_clipboard_init(struct bNodeTree *ntree);
void BKE_node_clipboard_clear(void);
+int BKE_node_clipboard_validate(void);
void BKE_node_clipboard_add_node(struct bNode *node);
void BKE_node_clipboard_add_link(struct bNodeLink *link);
const struct ListBase *BKE_node_clipboard_get_nodes(void);
Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/node.c 2012-08-20 13:59:19 UTC (rev 50044)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/node.c 2012-08-20 14:01:16 UTC (rev 50045)
@@ -1425,13 +1425,37 @@
/* ************** Node Clipboard *********** */
+#define USE_NODE_CB_VALIDATE
+
+#ifdef USE_NODE_CB_VALIDATE
+/**
+ * This data structure is to validate the node on creation,
+ * otherwise we may reference missing data.
+ *
+ * Currently its only used for ID's, but nodes may one day
+ * referene other pointers which need validation.
+ */
+typedef struct bNodeClipboardExtraInfo {
+ struct bNodeClipboardExtraInfo *next, *prev;
+ ID *id;
+ char id_name[MAX_ID_NAME];
+ char library_name[FILE_MAX];
+} bNodeClipboardExtraInfo;
+#endif /* USE_NODE_CB_VALIDATE */
+
+
typedef struct bNodeClipboard {
ListBase nodes;
+
+#ifdef USE_NODE_CB_VALIDATE
+ ListBase nodes_extra_info;
+#endif
+
ListBase links;
int type;
} bNodeClipboard;
-bNodeClipboard node_clipboard;
+bNodeClipboard node_clipboard = {{0}};
void BKE_node_clipboard_init(struct bNodeTree *ntree)
{
@@ -1454,11 +1478,83 @@
nodeFreeNode(NULL, node);
}
node_clipboard.nodes.first = node_clipboard.nodes.last = NULL;
+
+#ifdef USE_NODE_CB_VALIDATE
+ BLI_freelistN(&node_clipboard.nodes_extra_info);
+#endif
}
+/* return FALSE when one or more ID's are lost */
+int BKE_node_clipboard_validate(void)
+{
+ int ok = TRUE;
+
+#ifdef USE_NODE_CB_VALIDATE
+ bNodeClipboardExtraInfo *node_info;
+ bNode *node;
+
+
+ /* lists must be aligned */
+ BLI_assert(BLI_countlist(&node_clipboard.nodes) ==
+ BLI_countlist(&node_clipboard.nodes_extra_info));
+
+ for (node = node_clipboard.nodes.first, node_info = node_clipboard.nodes_extra_info.first;
+ node;
+ node = node->next, node_info = node_info->next)
+ {
+ /* validate the node against the stored node info */
+
+ /* re-assign each loop since we may clear,
+ * open a new file where the ID is valid, and paste again */
+ node->id = node_info->id;
+
+ /* currently only validate the ID */
+ if (node->id) {
+ ListBase *lb = which_libbase(G.main, GS(node_info->id_name));
+ BLI_assert(lb != NULL);
+
+ if (BLI_findindex(lb, node_info->id) == -1) {
+ /* may assign NULL */
+ node->id = BLI_findstring(lb, node_info->id_name + 2, offsetof(ID, name) + 2);
+
+ if (node->id == NULL) {
+ ok = FALSE;
+ }
+ }
+ }
+ }
+#endif /* USE_NODE_CB_VALIDATE */
+
+ return ok;
+}
+
void BKE_node_clipboard_add_node(bNode *node)
{
+#ifdef USE_NODE_CB_VALIDATE
+ /* add extra info */
+ bNodeClipboardExtraInfo *node_info = MEM_mallocN(sizeof(bNodeClipboardExtraInfo), STRINGIFY(bNodeClipboardExtraInfo));
+
+ node_info->id = node->id;
+ if (node->id) {
+ BLI_strncpy(node_info->id_name, node->id->name, sizeof(node_info->id_name));
+ if (node->id->lib) {
+ BLI_strncpy(node_info->library_name, node->id->lib->filepath, sizeof(node_info->library_name));
+ }
+ else {
+ node_info->library_name[0] = '\0';
+ }
+ }
+ else {
+ node_info->id_name[0] = '\0';
+ node_info->library_name[0] = '\0';
+ }
+ BLI_addtail(&node_clipboard.nodes_extra_info, node_info);
+ /* end extra info */
+#endif /* USE_NODE_CB_VALIDATE */
+
+ /* add node */
BLI_addtail(&node_clipboard.nodes, node);
+
}
void BKE_node_clipboard_add_link(bNodeLink *link)
Property changes on: branches/soc-2011-tomato/source/blender/editors/interface/interface.c
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/ge_candy/source/blender/editors/interface/interface.c:45070-46163
/branches/ge_harmony/source/blender/editors/interface/interface.c:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber/source/blender/editors/interface/interface.c:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/vgroup_modifiers/source/blender/editors/interface/interface.c:38694-39989
/trunk/blender/source/blender/editors/interface/interface.c:36831-50039
+ /branches/ge_candy/source/blender/editors/interface/interface.c:45070-46163
/branches/ge_harmony/source/blender/editors/interface/interface.c:42255,42279-42282,42286,42302,42338,42349,42616,42620,42698-42699,42739,42753,42773-42774,42832,44568,44597-44598,44793-44794
/branches/soc-2011-cucumber/source/blender/editors/interface/interface.c:37517,38166-38167,38177,38179-38180,38187,38242,38384,38387,38403-38404,38407,38968,38970,38973,39045,40845,42997-42998,43439
/branches/vgroup_modifiers/source/blender/editors/interface/interface.c:38694-39989
/trunk/blender/source/blender/editors/interface/interface.c:36831-50044
Modified: branches/soc-2011-tomato/source/blender/editors/space_node/node_edit.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_node/node_edit.c 2012-08-20 13:59:19 UTC (rev 50044)
+++ branches/soc-2011-tomato/source/blender/editors/space_node/node_edit.c 2012-08-20 14:01:16 UTC (rev 50045)
@@ -2018,47 +2018,69 @@
SpaceNode *snode = CTX_wm_space_node(C);
bNodeTree *ntree = snode->edittree;
bNode *gnode = node_tree_get_editgroup(snode->nodetree);
- float gnode_x = 0.0f, gnode_y = 0.0f;
+ float gnode_center[2];
+ const ListBase *clipboard_nodes_lb;
+ const ListBase *clipboard_links_lb;
bNode *node;
bNodeLink *link;
int num_nodes;
- float centerx, centery;
+ float center[2];
+ int is_clipboard_valid;
+ /* validate pointers in the clipboard */
+ is_clipboard_valid = BKE_node_clipboard_validate();
+ clipboard_nodes_lb = BKE_node_clipboard_get_nodes();
+ clipboard_links_lb = BKE_node_clipboard_get_links();
+
+ if (clipboard_nodes_lb->first == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Clipboard is empty");
+ return OPERATOR_CANCELLED;
+ }
+
if (BKE_node_clipboard_get_type() != ntree->type) {
BKE_report(op->reports, RPT_ERROR, "Clipboard nodes are an incompatible type");
return OPERATOR_CANCELLED;
}
+ /* only warn */
+ if (is_clipboard_valid == FALSE) {
+ BKE_report(op->reports, RPT_WARNING, "Some nodes references could not be restored, will be left empty");
+ }
+
ED_preview_kill_jobs(C);
/* deselect old nodes */
node_deselect_all(snode);
/* get group node offset */
- if (gnode)
- nodeToView(gnode, 0.0f, 0.0f, &gnode_x, &gnode_y);
+ if (gnode) {
+ nodeToView(gnode, 0.0f, 0.0f, &gnode_center[0], &gnode_center[1]);
+ }
+ else {
+ zero_v2(gnode_center);
+ }
/* calculate "barycenter" for placing on mouse cursor */
- num_nodes = 0;
- centerx = centery = 0.0f;
- for (node = BKE_node_clipboard_get_nodes()->first; node; node = node->next) {
- ++num_nodes;
- centerx += 0.5f * (node->totr.xmin + node->totr.xmax);
- centery += 0.5f * (node->totr.ymin + node->totr.ymax);
+ zero_v2(center);
+ for (node = clipboard_nodes_lb->first, num_nodes = 0; node; node = node->next, num_nodes++) {
+ center[0] += 0.5f * (node->totr.xmin + node->totr.xmax);
+ center[1] += 0.5f * (node->totr.ymin + node->totr.ymax);
}
- centerx /= num_nodes;
- centery /= num_nodes;
+ mul_v2_fl(center, 1.0 / num_nodes);
/* copy nodes from clipboard */
- for (node = BKE_node_clipboard_get_nodes()->first; node; node = node->next) {
+ for (node = clipboard_nodes_lb->first; node; node = node->next) {
bNode *new_node = nodeCopyNode(ntree, node);
+ /* needed since nodeCopyNode() doesn't increase ID's */
+ id_us_plus(node->id);
+
/* pasted nodes are selected */
node_select(new_node);
}
/* reparent copied nodes */
- for (node = BKE_node_clipboard_get_nodes()->first; node; node = node->next) {
+ for (node = clipboard_nodes_lb->first; node; node = node->next) {
bNode *new_node = node->new_node;
if (new_node->parent)
new_node->parent = new_node->parent->new_node;
@@ -2066,12 +2088,12 @@
/* place nodes around the mouse cursor. child nodes locations are relative to parent */
if (!new_node->parent) {
- new_node->locx += snode->cursor[0] - centerx - gnode_x;
- new_node->locy += snode->cursor[1] - centery - gnode_y;
+ new_node->locx += snode->cursor[0] - center[0] - gnode_center[0];
+ new_node->locy += snode->cursor[1] - center[1] - gnode_center[1];
}
}
- for (link = BKE_node_clipboard_get_links()->first; link; link = link->next) {
+ for (link = clipboard_links_lb->first; link; link = link->next) {
nodeAddLink(ntree, link->fromnode->new_node, link->fromsock->new_sock,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list