svn merge ^/trunk/blender -r49478:49498
authorCampbell Barton <ideasman42@gmail.com>
Thu, 2 Aug 2012 11:29:32 +0000 (11:29 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 2 Aug 2012 11:29:32 +0000 (11:29 +0000)
1  2 
release/scripts/startup/bl_ui/space_node.py
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/node.c
source/blender/editors/space_node/node_intern.h

index 419309068be8cdf034d4e128b5da20d98e233985,adcf5a9e9dfe0bdd4d348f3ceefa590ca611747d..cad642045e90b600fa2d18b445317429bd1b33f0
@@@ -94,6 -94,10 +94,10 @@@ class NODE_HT_header(Header)
          if toolsettings.snap_node_element != 'INCREMENT':
              row.prop(toolsettings, "snap_target", text="")
  
+         row = layout.row(align=True)
+         row.operator("node.clipboard_copy", text="", icon='COPYDOWN')
+         row.operator("node.clipboard_paste", text="", icon='PASTEDOWN')
          layout.template_running_jobs()
  
  
@@@ -185,18 -189,6 +189,18 @@@ class NODE_MT_node(Menu)
          layout.operator("node.read_fullsamplelayers")
  
  
 +class NODE_PT_display_properties(Panel):
 +    bl_space_type = 'NODE_EDITOR'
 +    bl_region_type = 'UI'
 +    bl_label = "Display Properties"
 +
 +    def draw(self, context):
 +        layout = self.layout
 +        space = context.space_data
 +
 +        layout.template_colormanaged_view_settings(space, "view_settings", True)
 +
 +
  # Node Backdrop options
  class NODE_PT_properties(Panel):
      bl_space_type = 'NODE_EDITOR'
index 173d428c3eb2b0eb802b3f865da8972c098eb67b,00bdbbf453777ae0568fa24191bc003d5acf9247..0b9aa7e4f644c218e00644bceb98182531555cc0
@@@ -384,6 -384,13 +384,13 @@@ void            nodeFreePreview(struct 
  int             nodeSocketIsHidden(struct bNodeSocket *sock);
  void            nodeSocketSetType(struct bNodeSocket *sock, int type);
  
+ /* Node Clipboard */
+ void nodeClipboardClear(void);
+ void nodeClipboardAddNode(struct bNode *node);
+ void nodeClipboardAddLink(struct bNodeLink *link);
+ const struct ListBase *nodeClipboardGetNodes(void);
+ const struct ListBase *nodeClipboardGetLinks(void);
  /* ************** NODE TYPE ACCESS *************** */
  
  struct bNodeTemplate nodeMakeTemplate(struct bNode *node);
@@@ -661,7 -668,6 +668,7 @@@ void            ntreeGPUMaterialNodes(s
  #define CMP_NODE_KEYINGSCREEN         269
  #define CMP_NODE_KEYING                       270
  #define CMP_NODE_TRACKPOS             271
 +#define CMP_NODE_INPAINT                272
  
  #define CMP_NODE_GLARE                301
  #define CMP_NODE_TONEMAP      302
index e40796d0ea08b05f60180be687536b7823f6e3f7,565e2de79f8a8ef1242d99df4a8ad8c41aaef23f..afe0b9ec81f0f75c6297f5a80dfc60625456a3dd
@@@ -347,9 -347,12 +347,12 @@@ bNode *nodeCopyNode(struct bNodeTree *n
        bNodeSocket *sock, *oldsock;
  
        *nnode = *node;
-       nodeUniqueName(ntree, nnode);
-       
-       BLI_addtail(&ntree->nodes, nnode);
+       /* can be called for nodes outside a node tree (e.g. clipboard) */
+       if (ntree) {
+               nodeUniqueName(ntree, nnode);
+               BLI_addtail(&ntree->nodes, nnode);
+       }
  
        BLI_duplicatelist(&nnode->inputs, &node->inputs);
        oldsock = node->inputs.first;
        nnode->new_node = NULL;
        nnode->preview = NULL;
        
-       ntree->update |= NTREE_UPDATE_NODES;
+       if (ntree)
+               ntree->update |= NTREE_UPDATE_NODES;
        
        return nnode;
  }
@@@ -417,7 -421,7 +421,7 @@@ bNodeLink *nodeAddLink(bNodeTree *ntree
                                from = -1;  /* OK but flip */
                }
        }
-       else {
+       else if (ntree) {
                /* check tree sockets */
                for (sock = ntree->inputs.first; sock; sock = sock->next)
                        if (sock == fromsock)
                                to = -1;  /* OK but flip */
                }
        }
-       else {
+       else if (ntree) {
                /* check tree sockets */
                for (sock = ntree->outputs.first; sock; sock = sock->next)
                        if (sock == tosock)
        
        if (from >= 0 && to >= 0) {
                link = MEM_callocN(sizeof(bNodeLink), "link");
-               BLI_addtail(&ntree->links, link);
+               if (ntree)
+                       BLI_addtail(&ntree->links, link);
                link->fromnode = fromnode;
                link->fromsock = fromsock;
                link->tonode = tonode;
        }
        else if (from <= 0 && to <= 0) {
                link = MEM_callocN(sizeof(bNodeLink), "link");
-               BLI_addtail(&ntree->links, link);
+               if (ntree)
+                       BLI_addtail(&ntree->links, link);
                link->fromnode = tonode;
                link->fromsock = tosock;
                link->tonode = fromnode;
                link->tosock = fromsock;
        }
        
-       ntree->update |= NTREE_UPDATE_LINKS;
+       if (ntree)
+               ntree->update |= NTREE_UPDATE_LINKS;
        
        return link;
  }
  
  void nodeRemLink(bNodeTree *ntree, bNodeLink *link)
  {
-       BLI_remlink(&ntree->links, link);
+       /* can be called for links outside a node tree (e.g. clipboard) */
+       if (ntree)
+               BLI_remlink(&ntree->links, link);
        if (link->tosock)
                link->tosock->link = NULL;
        MEM_freeN(link);
        
-       ntree->update |= NTREE_UPDATE_LINKS;
+       if (ntree)
+               ntree->update |= NTREE_UPDATE_LINKS;
  }
  
  void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
@@@ -885,20 -896,24 +896,24 @@@ static void node_unlink_attached(bNodeT
  
  void nodeFreeNode(bNodeTree *ntree, bNode *node)
  {
-       bNodeTreeType *treetype = ntreeGetType(ntree->type);
        bNodeSocket *sock, *nextsock;
        
-       /* remove all references to this node */
-       nodeUnlinkNode(ntree, node);
-       node_unlink_attached(ntree, node);
-       
-       BLI_remlink(&ntree->nodes, node);
+       /* can be called for nodes outside a node tree (e.g. clipboard) */
+       if (ntree) {
+               bNodeTreeType *treetype = ntreeGetType(ntree->type);
+               /* remove all references to this node */
+               nodeUnlinkNode(ntree, node);
+               node_unlink_attached(ntree, node);
+               BLI_remlink(&ntree->nodes, node);
+               if (treetype->free_node_cache)
+                       treetype->free_node_cache(ntree, node);
+       }
        
        /* since it is called while free database, node->id is undefined */
        
-       if (treetype->free_node_cache)
-               treetype->free_node_cache(ntree, node);
-       
        if (node->typeinfo && node->typeinfo->freestoragefunc)
                node->typeinfo->freestoragefunc(node);
        
  
        MEM_freeN(node);
        
-       ntree->update |= NTREE_UPDATE_NODES;
+       if (ntree)
+               ntree->update |= NTREE_UPDATE_NODES;
  }
  
  /* do not free ntree itself here, BKE_libblock_free calls this function too */
@@@ -1388,6 -1404,53 +1404,53 @@@ void nodeSocketSetType(bNodeSocket *soc
        node_socket_free_default_value(old_type, old_default_value);
  }
  
+ /* ************** Node Clipboard *********** */
+ typedef struct bNodeClipboard {
+       ListBase nodes;
+       ListBase links;
+ } bNodeClipboard;
+ bNodeClipboard node_clipboard;
+ void nodeClipboardClear(void)
+ {
+       bNode *node, *node_next;
+       bNodeLink *link, *link_next;
+       
+       for (link = node_clipboard.links.first; link; link=link_next) {
+               link_next = link->next;
+               nodeRemLink(NULL, link);
+       }
+       node_clipboard.links.first = node_clipboard.links.last = NULL;
+       
+       for (node = node_clipboard.nodes.first; node; node=node_next) {
+               node_next = node->next;
+               nodeFreeNode(NULL, node);
+       }
+       node_clipboard.nodes.first = node_clipboard.nodes.last = NULL;
+ }
+ void nodeClipboardAddNode(bNode *node)
+ {
+       BLI_addtail(&node_clipboard.nodes, node);
+ }
+ void nodeClipboardAddLink(bNodeLink *link)
+ {
+       BLI_addtail(&node_clipboard.links, link);
+ }
+ const ListBase *nodeClipboardGetNodes(void)
+ {
+       return &node_clipboard.nodes;
+ }
+ const ListBase *nodeClipboardGetLinks(void)
+ {
+       return &node_clipboard.links;
+ }
  /* ************** dependency stuff *********** */
  
  /* node is guaranteed to be not checked before */
@@@ -1897,7 -1960,6 +1960,7 @@@ static void registerCompositNodes(bNode
        register_node_type_cmp_bilateralblur(ttype);
        register_node_type_cmp_vecblur(ttype);
        register_node_type_cmp_dilateerode(ttype);
 +      register_node_type_cmp_inpaint(ttype);
        register_node_type_cmp_defocus(ttype);
        
        register_node_type_cmp_valtorgb(ttype);
@@@ -2086,6 -2148,10 +2149,10 @@@ static void free_typeinfos(ListBase *li
  
  void init_nodesystem(void) 
  {
+       /* init clipboard */
+       node_clipboard.nodes.first = node_clipboard.nodes.last = NULL;
+       node_clipboard.links.first = node_clipboard.links.last = NULL;
+       
        registerCompositNodes(ntreeGetType(NTREE_COMPOSIT));
        registerShaderNodes(ntreeGetType(NTREE_SHADER));
        registerTextureNodes(ntreeGetType(NTREE_TEXTURE));
index 1d83215c1f992c701fb9c92ed1f5a0c512e359d0,7077229fae1c0957672797b51c7569add604a87b..8a85e833537909397b0354a9beb2188e697078bd
@@@ -119,7 -119,7 +119,7 @@@ void node_draw_link(View2D *v2d, SpaceN
  void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
  int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol);
  // void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
 -void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage);
 +void draw_nodespace_back_pix(const struct bContext *C, ARegion *ar, SpaceNode *snode);
  
  
  /* node_add.c */
@@@ -200,6 -200,10 +200,10 @@@ void NODE_OT_output_file_add_socket(str
  void NODE_OT_output_file_remove_active_socket(struct wmOperatorType *ot);
  void NODE_OT_output_file_move_active_socket(struct wmOperatorType *ot);
  
+ /* Note: clipboard_cut is a simple macro of copy + delete */
+ void NODE_OT_clipboard_copy(struct wmOperatorType *ot);
+ void NODE_OT_clipboard_paste(struct wmOperatorType *ot);
  extern const char *node_context_dir[];
  
  // XXXXXX