Revision: 30535
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30535
Author:   lukastoenne
Date:     2010-07-20 14:35:56 +0200 (Tue, 20 Jul 2010)

Log Message:
-----------
Implemented "Any" socket type, which can be used for generic nodes. The socket 
type is resolved as soon as such a node (or subtree) gets connected to a 
concrete type socket. Should be used with care since generic nodes have to 
implement versions for all other socket types.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/editors/space_node/drawnode.c
    branches/particles-2010/source/blender/editors/space_node/node_draw.c
    branches/particles-2010/source/blender/editors/space_node/node_edit.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree_types.h
    branches/particles-2010/source/blender/nodes/SIM_node.h
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_debugprint.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_pass.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_subprogram.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_get_object_data.c
    
branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_object_data.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h        
2010-07-20 12:22:45 UTC (rev 30534)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h        
2010-07-20 12:35:56 UTC (rev 30535)
@@ -166,9 +166,11 @@
 int                            ntreeHasType(struct bNodeTree *ntree, int type);
 
 void                   ntreeSocketUseFlags(struct bNodeTree *ntree);
-void                   ntreeUpdateListSockets(struct bNodeTree *ntree);
 
 void                   ntreeSolveOrder(struct bNodeTree *ntree);
+void                   ntreeUpdateListSockets(struct bNodeTree *ntree);
+void                   ntreeUpdateSocketTypes(struct bNodeTree *ntree);
+void                   ntreeUpdateLinks(struct bNodeTree *ntree);
 
 void                   ntreeBeginExecTree(struct bNodeTree *ntree);
 void                   ntreeExecTree(struct bNodeTree *ntree, void 
*callerdata, int thread);
@@ -205,7 +207,6 @@
 struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, 
struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
 void                   nodeRemLink(struct bNodeTree *ntree, struct bNodeLink 
*link);
 void                   nodeRemSocketLinks(struct bNodeTree *ntree, struct 
bNodeSocket *sock);
-void                   nodeCheckLink(struct bNodeLink *link);
 
 struct bNode   *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
 int                    nodeFindNode(struct bNodeTree *ntree, struct 
bNodeSocket *sock, struct bNode **nodep, int *sockindex);
@@ -469,11 +470,13 @@
 /* range 1 - 100 is reserved for common nodes */
 /* using toolbox, we add node groups by assuming the values below don't exceed 
NODE_GROUP_MENU for now */
 
-#define SIM_NODE_PROGRAM       601
-#define SIM_NODE_SUBPROGRAM    602
-#define SIM_NODE_IF                    603
-#define SIM_NODE_TIMESTEP      604
-#define SIM_NODE_PASS          605
+#define SIM_NODE_PROGRAM                       601
+#define SIM_NODE_SUBPROGRAM                    602
+#define SIM_NODE_IF                                    603
+#define SIM_NODE_TIMESTEP                      604
+#define SIM_NODE_PASS                          605
+#define SIM_NODE_GETOBJECTDATA         606
+#define SIM_NODE_SETOBJECTDATA         607
 
 #define SIM_NODE_DEBUGPRINT    699
 

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c     
2010-07-20 12:22:45 UTC (rev 30534)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c     
2010-07-20 12:35:56 UTC (rev 30535)
@@ -844,8 +844,8 @@
        bNodeSocketType *stype;
        bNodeSocket *sock, *next_sock;
        
-       for (node = ntree->nodes.first; node; node = node->next) {
-               /* nodes are presumed fully verified, stype and socket list are 
in sync */
+       /* nodes are presumed fully verified, stype and socket list are in sync 
*/
+       for (node=ntree->nodes.first; node; node = node->next) {
                stype= node->typeinfo->inputs;
                sock= node->inputs.first;
                while (sock) {
@@ -868,7 +868,7 @@
                                        sock = sock->next;
                                }
                        }
-
+                       
                        ++stype;
                }
        }
@@ -1093,31 +1093,47 @@
        }
 }
 
-void nodeCheckLink(bNodeLink *link)
+void ntreeUpdateLinks(bNodeTree *ntree)
 {
-       /* TODO this is where an actual converter matrix would come in handy - 
phonybone */
-       int valid = 1;
-       if (link->fromsock == NULL || link->tosock == NULL) {
-               /* don't assume bad links when they're incomplete (e.g. in 
modal operator) */
-               valid = 1;
-       }
-       else {
-               int fromtype = link->fromsock->type;
-               int totype = link->tosock->type;
-               if (ELEM3(fromtype, SOCK_VALUE, SOCK_RGBA, SOCK_VECTOR) && 
ELEM3(totype, SOCK_VALUE, SOCK_RGBA, SOCK_VECTOR)) {
+       bNodeLink *link;
+       
+       for (link = ntree->links.first; link; link = link->next) {
+               int valid = 1;
+               if (link->fromsock == NULL || link->tosock == NULL) {
+                       /* don't assume bad links when they're incomplete (e.g. 
in modal operator) */
                        valid = 1;
-               } else {
-                       valid = (fromtype == totype);
                }
+               else {
+                       int fromtype = link->fromsock->type;
+                       int totype = link->tosock->type;
+                       /* non-simulation sockets can convert anything */
+                       if (ELEM3(fromtype, SOCK_VALUE, SOCK_RGBA, SOCK_VECTOR) 
&& ELEM3(totype, SOCK_VALUE, SOCK_RGBA, SOCK_VECTOR)) {
+                               valid = 1;
+                       }
+                       /* SOCK_ANY sockets adapt to the other side */
+                       else if (fromtype == SOCK_ANY || totype == SOCK_ANY) {
+                               valid = 1;
+                               /* int and float implicitely convertible */
+                       }
+                       else if (ELEM(fromtype, SOCK_INT, SOCK_FLOAT) && 
ELEM(totype, SOCK_INT, SOCK_FLOAT)) {
+                               valid = 1;
+                       }
+                       /* int and float can be converted to boolean */
+                       else if (ELEM(fromtype, SOCK_INT, SOCK_FLOAT) && totype 
== SOCK_BOOL) {
+                               valid = 1;
+                       }
+                       else {
+                               valid = (fromtype == totype);
+                       }
+               }
+               
+               if (valid)
+                       link->flag |= NLINK_VALID;
+               else
+                       link->flag &= ~NLINK_VALID;
        }
-       
-       if (valid)
-               link->flag |= NLINK_VALID;
-       else
-               link->flag &= ~NLINK_VALID;
 }
 
-
 bNodeTree *ntreeAddTree(int type)
 {
        bNodeTreeTypeInfo *treetype= ntreeGetTypeInfo(type);
@@ -1766,6 +1782,104 @@
                might be different for editor or for "real" use... */
 }
 
+static int socktype_greater_than(int a, int b)
+{
+       static int prefmap[] = { 0, 6, 5, 0, 1, 2, 3, 4 };
+       return prefmap[a] > prefmap[b];
+}
+
+void ntreeUpdateSocketTypes(bNodeTree *ntree)
+{
+       bNode *node;
+       bNodeSocket *sock, *fromsock;
+       int resolved;
+       
+       /* reset SOCK_ANY sockets */
+       for (node=ntree->nodes.first; node; node = node->next) {
+               for (sock= node->inputs.first; sock; sock = sock->next) {
+                       if (sock->stype->type == SOCK_ANY)
+                               sock->type = SOCK_ANY;
+               }
+               for (sock= node->outputs.first; sock; sock = sock->next) {
+                       if (sock->stype->type == SOCK_ANY)
+                               sock->type = SOCK_ANY;
+               }
+       }
+       
+       /* repeat this until no more sockets can be resolved */
+       /* Note: this is kind of a brute-force approach, but it's not a 
speed-critical
+        * area and not extremely bad either. Also the number of nodes will 
probably not be
+        * big enough to make this noticable, but if necessary a 
breadth-first-search method
+        * to find "type islands" could be implemented later. - phonybone */
+       do {
+               resolved = 0;
+               
+               /* first resolve types from outputs (left to right) */
+               for (node=ntree->nodes.first; node; node = node->next) {
+                       /* only atomic nodes get resolved. */
+                       if (node->type == NODE_GROUP) {
+                               /* TODO */
+                       }
+                       else {
+                               for (sock= node->inputs.first; sock; sock = 
sock->next) {
+                                       if (sock->link && sock->link->fromsock) 
{
+                                               fromsock = sock->link->fromsock;
+                                               if (sock->stype->type == 
SOCK_ANY && socktype_greater_than(fromsock->type, sock->type)) {
+                                                       sock->type = 
fromsock->type;
+                                                       ++resolved;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               /* now resolve remaining types from inputs (right to left) */
+               for (node=ntree->nodes.last; node; node = node->prev) {
+                       /* only atomic nodes get resolved. */
+                       if (node->type == NODE_GROUP) {
+                               /* TODO */
+                       }
+                       else {
+                               /* choose the "best" socket type for output 
sockets among the linked sockets */
+                               for (sock= node->inputs.first; sock; sock = 
sock->next) {
+                                       if (sock->link && sock->link->fromsock) 
{
+                                               fromsock = sock->link->fromsock;
+                                               if (fromsock->stype->type == 
SOCK_ANY && socktype_greater_than(sock->type, fromsock->type)) {
+                                                       fromsock->type = 
sock->type;
+                                                       ++resolved;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               
+               /* finally upgrade socket types if possible */
+               for (node=ntree->nodes.first; node; node = node->next) {
+                       int besttype = -1;
+                       for (sock= node->inputs.first; sock; sock = sock->next) 
{
+                               if (sock->stype->type == SOCK_ANY && 
socktype_greater_than(sock->type, besttype))
+                                       besttype = sock->type;
+                       }
+                       for (sock= node->outputs.first; sock; sock = 
sock->next) {
+                               if (sock->stype->type == SOCK_ANY && 
socktype_greater_than(sock->type, besttype))
+                                       besttype = sock->type;
+                       }
+                       
+                       if (besttype >= 0) {
+                               for (sock= node->inputs.first; sock; sock = 
sock->next) {
+                                       if (sock->stype->type == SOCK_ANY) {
+                                               sock->type = besttype;
+                                       }
+                               }
+                               for (sock= node->outputs.first; sock; sock = 
sock->next) {
+                                       if (sock->stype->type == SOCK_ANY) {
+                                               sock->type = besttype;
+                                       }
+                               }
+                       }
+               }
+       } while (resolved > 0);
+}
+
 /* Should be callback! */
 /* Do not call execs here */
 void NodeTagChanged(bNodeTree *ntree, bNode *node)
@@ -2504,6 +2618,8 @@
        nodeRegisterType(ntypelist, &sim_node_pass);
        nodeRegisterType(ntypelist, &sim_node_timestep);
        nodeRegisterType(ntypelist, &sim_node_debugprint);
+       nodeRegisterType(ntypelist, &sim_node_getobjectdata);
+       nodeRegisterType(ntypelist, &sim_node_setobjectdata);
 }
 
 static void remove_dynamic_typeinfos(ListBase *list)

Modified: branches/particles-2010/source/blender/editors/space_node/drawnode.c
===================================================================
--- branches/particles-2010/source/blender/editors/space_node/drawnode.c        
2010-07-20 12:22:45 UTC (rev 30534)
+++ branches/particles-2010/source/blender/editors/space_node/drawnode.c        
2010-07-20 12:35:56 UTC (rev 30535)
@@ -1261,39 +1261,34 @@
        }
 }
 
-#if 0
-static void node_particles_buts_emitter(uiLayout *layout, bContext *C, 
PointerRNA *ptr)
+static void node_simulation_buts_getobjectdata(uiLayout *layout, bContext *C, 
PointerRNA *ptr)
 {
-       bNode *node= ptr->data;
+//     bNode *node= ptr->data;
        uiLayout *col;
        
-       col= uiLayoutColumn(layout, 1);
-       uiItemR(col, ptr, "emitter_index", 0, NULL, 0);
+       col= uiLayoutColumn(layout, 0);
+       uiItemR(col, ptr, "object", 0, NULL, 0);
 }
 
-static void node_particles_buts_object(uiLayout *layout, bContext *C, 
PointerRNA *ptr)
+static void node_simulation_buts_setobjectdata(uiLayout *layout, bContext *C, 
PointerRNA *ptr)
 {
-       bNode *node= ptr->data;
+//     bNode *node= ptr->data;
+       uiLayout *col;
        
-       uiTemplateID(layout, C, ptr, "object", NULL, NULL, NULL);
-       
-       if(!node->id) return;
+       col= uiLayoutColumn(layout, 0);
+       uiItemR(col, ptr, "object", 0, NULL, 0);
 }
-#endif
 
 /* only once called */
 static void node_simulation_set_butfunc(bNodeType *ntype)
 {
        switch(ntype->type) {
-       #if 0
-       case SIM_NODE_EMITTER:
-               ntype->uifunc = node_simulation_buts_emitter;
+       case SIM_NODE_GETOBJECTDATA:
+               ntype->uifunc = node_simulation_buts_getobjectdata;
                break;
-               
-       case SIM_NODE_OBJECT:
-               ntype->uifunc = node_particles_buts_object;
+       case SIM_NODE_SETOBJECTDATA:
+               ntype->uifunc = node_simulation_buts_setobjectdata;
                break;
-       #endif
                
        default:
                ntype->uifunc= NULL;

Modified: branches/particles-2010/source/blender/editors/space_node/node_draw.c
===================================================================

@@ 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