Revision: 31256
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31256
Author:   lukastoenne
Date:     2010-08-11 18:08:54 +0200 (Wed, 11 Aug 2010)

Log Message:
-----------
Fixed saving and loading and lots of bugs. Added a few macros for making node 
execution functions as easy as possible.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_vertex_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_math.c
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_vertex_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_timestep.c
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_vector_compose.c
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_vector_decompose.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/SIM_util.h
    branches/particles-2010/source/blender/nodes/intern/node_tree_simulation.c

Added Paths:
-----------
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_add_particle.c
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_particle_data.c

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c     
2010-08-11 15:42:01 UTC (rev 31255)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c     
2010-08-11 16:08:54 UTC (rev 31256)
@@ -1744,25 +1744,27 @@
                if (sock->stype->type == SOCK_ANY) {
                        if (any_island > 0)
                                merge_socket_islands(islands, any_island, 
sock->island);
-                       else
-                               any_island = sock->island;
+                       any_island = sock->island;
                }
        }
        for (sock=node->outputs.first; sock; sock = sock->next) {
                if (sock->stype->type == SOCK_ANY) {
                        if (any_island > 0)
                                merge_socket_islands(islands, any_island, 
sock->island);
-                       else
-                               any_island = sock->island;
+                       any_island = sock->island;
                }
        }
 }
 
-static void ntreeFindSocketTypeIslands(bNodeTree *ntree, bNodeSocketIsland 
**r_islands, int *r_totsock)
+static int link_merge_type(bNodeLink *link)
 {
+       return (link->fromsock->stype->type == SOCK_ANY || 
link->tosock->stype->type == SOCK_ANY);
+}
+
+static void ntreeInitSocketIslands(bNodeTree *ntree, bNodeSocketIsland 
**r_islands, int *r_totsock)
+{
        bNode *node;
        bNodeSocket *sock;
-       bNodeLink *link;
        bNodeSocketIsland *islands, *cur;
        int totsock;
        
@@ -1790,17 +1792,6 @@
                }
        }
        
-       /* merge islands inside nodes */
-       for (node=ntree->nodes.first; node; node = node->next) {
-               node_merge_type_islands(node, islands);
-       }
-       /* merge islands by links */
-       for (link=ntree->links.first; link; link = link->next) {
-               if (link->fromsock && link->tosock)
-                       if (link->fromsock->stype->type == SOCK_ANY || 
link->tosock->stype->type == SOCK_ANY)
-                               merge_socket_islands(islands, 
link->fromsock->island, link->tosock->island);
-       }
-       
        *r_islands = islands;
        *r_totsock = totsock;
 }
@@ -1808,6 +1799,8 @@
 static void ntreeUpdateSocketTypes(bNodeTree *ntree)
 {
        bNodeTreeTypeInfo *tti;
+       bNode *node;
+       bNodeLink *link;
        bNodeSocketIsland *island_map, *island;
        int totsock;
        int i, number;
@@ -1818,7 +1811,19 @@
        if (!tti->preferredSocketType || !tti->compatibleSocketTypes)
                return;
        
-       ntreeFindSocketTypeIslands(ntree, &island_map, &totsock);
+//     ntreeFindSocketIslands(ntree, node_merge_type_islands, link_merge_type, 
&island_map, &totsock);
+       ntreeInitSocketIslands(ntree, &island_map, &totsock);
+       
+       /* merge islands inside nodes */
+       for (node=ntree->nodes.first; node; node = node->next) {
+               node_merge_type_islands(node, island_map);
+       }
+       /* merge islands by links */
+       for (link=ntree->links.first; link; link = link->next) {
+               if (link->fromsock && link->tosock)
+                       if (link_merge_type(link))
+                               merge_socket_islands(island_map, 
link->fromsock->island, link->tosock->island);
+       }
 
        number = -1;
        island = island_map;
@@ -1852,6 +1857,162 @@
        MEM_freeN(island_map);
 }
 
+typedef struct bNodeLinkSortList {
+       struct bNodeLinkSortList *next, *prev;
+       struct bNodeLink *link;
+} bNodeLinkSortList;
+
+static int ntreeSortLinkFromnode(void *a, void *b)
+{
+       bNode *afrom = ((bNodeLinkSortList*)a)->link->fromnode;
+       bNode *ato = ((bNodeLinkSortList*)a)->link->tonode;
+       bNode *bfrom = ((bNodeLinkSortList*)b)->link->fromnode;
+       bNode *bto = ((bNodeLinkSortList*)b)->link->tonode;
+       
+       if (afrom && bfrom && ato && bto) {
+               return (afrom->level < bfrom->level || ato->level < bto->level);
+       }
+       else
+               return 0;
+}
+
+static void ntreeNodeResolveContexts(bNode *node)
+{
+       bNodeSocket *sock;
+       bNodeDataContext resctx;
+       
+       resctx.type = NDC_UNDEFINED;
+       resctx.source = NULL;
+       for (sock=node->inputs.first; sock; sock=sock->next) {
+               if (sock->stype->contexttype == NDC_UNDEFINED) {
+                       if (resctx.type == NDC_UNDEFINED) {
+                               if (sock->context.type != NDC_UNDEFINED)
+                                       resctx = sock->context;
+                       }
+                       else if (ELEM(sock->context.type, NDC_UNDEFINED, 
NDC_SINGLETON)==0) {
+                               if (resctx.type == NDC_SINGLETON) {
+                                       resctx = sock->context;
+                               }
+                               else {
+                                       if (resctx.type != sock->context.type 
|| resctx.source != sock->context.source) {
+                                               resctx.type = NDC_UNDEFINED;
+                                               resctx.source = NULL;
+                                       }
+                               }
+                       }
+               }
+       }
+       
+       if (resctx.type == NDC_UNDEFINED) {
+               for (sock=node->inputs.first; sock; sock=sock->next) {
+                       if (sock->stype->contexttype == NDC_UNDEFINED) {
+                               if (ELEM(sock->context.type, NDC_UNDEFINED, 
NDC_SINGLETON)==0) {
+                                       resctx.type = NDC_UNDEFINED;
+                                       resctx.source = NULL;
+                               }
+                       }
+               }
+       }
+       for (sock=node->outputs.first; sock; sock=sock->next) {
+               if (sock->stype->contexttype == NDC_UNDEFINED) {
+                       sock->context = resctx;
+               }
+       }
+}
+
+static void ntreeUpdateSocketContexts(bNodeTree *ntree)
+{
+       bNode *node;
+       bNodeSocket *sock;
+       bNodeLink *link;
+       ListBase sortlist;
+       bNodeLinkSortList *item;
+       
+       /* initialise contexts */
+       for (node=ntree->nodes.first; node; node=node->next) {
+               for (sock=node->inputs.first; sock; sock=sock->next) {
+                       if (sock->stype->contexttype == NDC_UNDEFINED) {
+                               if (sock->link) {
+                                       sock->context.type = NDC_UNDEFINED;
+                                       sock->context.source = NULL;
+                               }
+                               else {
+                                       /* default socket data context is 
singleton */
+                                       sock->context.type = NDC_SINGLETON;
+                                       sock->context.source = NULL;
+                               }
+                       }
+               }
+               
+               ntreeNodeResolveContexts(node);
+       }
+       
+       sortlist.first = sortlist.last = NULL;
+       for (link=ntree->links.first; link; link=link->next) {
+               item = MEM_callocN(sizeof(bNodeLinkSortList), 
"bNodeLinkSortList");
+               item->link = link;
+               BLI_addtail(&sortlist, item);
+       }
+       
+       BLI_sortlist(&sortlist, ntreeSortLinkFromnode);
+       
+       for (item=sortlist.first; item; item = item->next) {
+               link = item->link;
+               if (link->fromnode && link->tonode) {
+                       if (link->tosock->stype->contexttype == NDC_UNDEFINED) {
+                               link->tosock->context = link->fromsock->context;
+                               ntreeNodeResolveContexts(link->tonode);
+                       }
+               }
+       }
+       
+       {
+               printf("------------------\n");
+               for (node=ntree->nodes.first; node; node = node->next) {
+                       printf("Node %s:\n", node->name);
+                       printf("\tInputs:\n");
+                       for (sock=node->inputs.first; sock; sock = sock->next) {
+                               printf("\t\t%s, context ", sock->name);
+                               switch (sock->context.type) {
+                               case NDC_UNDEFINED:     printf("undefined"); 
break;
+                               case NDC_SINGLETON:     printf("singleton"); 
break;
+                               case NDC_NODE:          printf("node"); break;
+                               case NDC_PARTICLE:      printf("particle"); 
break;
+                               case NDC_VERTEX:        printf("vertex"); break;
+                               case NDC_EDGE:          printf("edge"); break;
+                               case NDC_FACE:          printf("face"); break;
+                               }
+                               printf(" [%p]\n", sock->context.source);
+                       }
+                       printf("\tOutputs:\n");
+                       for (sock=node->outputs.first; sock; sock = sock->next) 
{
+                               printf("\t\t%s, context ", sock->name);
+                               switch (sock->context.type) {
+                               case NDC_UNDEFINED:     printf("undefined"); 
break;
+                               case NDC_SINGLETON:     printf("singleton"); 
break;
+                               case NDC_NODE:          printf("node"); break;
+                               case NDC_PARTICLE:      printf("particle"); 
break;
+                               case NDC_VERTEX:        printf("vertex"); break;
+                               case NDC_EDGE:          printf("edge"); break;
+                               case NDC_FACE:          printf("face"); break;
+                               }
+                               printf(" [%p]\n", sock->context.source);
+                       }
+               }
+               #if 0
+               printf("Sorted Link List:\n");
+               for (item=sortlist.first; item; item = item->next) {
+                       if (item->link->fromnode && item->link->tonode) {
+                               printf("\tfrom '%s:%s' to '%s:%s'\n", 
item->link->fromnode->name, item->link->fromsock->name, 
item->link->tonode->name, item->link->tosock->name);
+                       }
+               }
+               #endif
+               printf("------------------ \n");
+       }
+
+       BLI_freelistN(&sortlist);
+}
+
 static void ntreeUpdateLinks(bNodeTree *ntree)
 {
        bNodeTreeTypeInfo *tti = ntreeGetTypeInfo(ntree->type);
@@ -1866,6 +2027,33 @@
                        }
                        else {
                                valid = 
tti->compatibleSocketTypes(link->fromsock->type, link->tosock->type);
+                               
+                               if (valid) {
+                                       int fromtype= 
link->fromsock->context.type;
+                                       int totype= link->tosock->context.type;
+                                       if (totype == NDC_UNDEFINED && fromtype 
!= NDC_UNDEFINED)
+                                               valid = 0;
+                                       else if (ELEM(fromtype, NDC_UNDEFINED, 
NDC_SINGLETON)==0) {
+                                               if (totype == NDC_SINGLETON)
+                                                       valid =0;
+                                               else if (fromtype != totype || 
link->fromsock->context.source != link->tosock->context.source)
+                                                       valid = 0;
+                                       }
+                                       #if 0
+                                       if ((fromtype==NDC_UNDEFINED && 
totype==NDC_UNDEFINED) ||
+                                           ((fromtype!=NDC_UNDEFINED && 
totype!=NDC_UNDEFINED) &&
+                                            (fromtype==NDC_SINGLETON ||
+                                             (totype!=NDC_SINGLETON && 
fromtype==totype &&
+                                              link->fromsock->context.source 
== link->tosock->context.source
+                                             )
+                                            )
+                                           )
+                                          ) {
+                                       }
+                                       else
+                                               valid = 0;
+                                       #endif
+                               }
                        }
                        
                        if (valid)
@@ -1885,6 +2073,7 @@
        ntreeSolveOrder(ntree);
        ntreeUpdateListSockets(ntree);
        ntreeUpdateSocketTypes(ntree);
+       ntreeUpdateSocketContexts(ntree);
        ntreeUpdateLinks(ntree);
 }
 

Added: 
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_add_particle.c
===================================================================
--- 
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_add_particle.c
                            (rev 0)
+++ 
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_add_particle.c
    2010-08-11 16:08:54 UTC (rev 31256)
@@ -0,0 +1,74 @@
+/**
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version. 
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+* 
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+* 
+* The Original Code is Copyright (C) 2006 Blender Foundation.
+* All rights reserved.
+* 
+* The Original Code is: all of this file.
+* 
+* Contributor(s): none yet.
+* 
+* ***** END GPL LICENSE BLOCK *****
+
+*/
+
+#if 0
+#include "../SIM_util.h"
+
+#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "RNA_access.h"
+
+/* **************** Get mesh vertex data ******************** */
+
+static bNodeSocketType inputs[]= { 
+       { -1, 0, "" }
+};
+
+static bNodeSocketType outputs[]= { 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to