[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36253] branches/particles-2010: Revived the socket type struct for collecting info and functions for socket types .
Lukas Toenne
lukas.toenne at googlemail.com
Wed Apr 20 22:56:16 CEST 2011
Revision: 36253
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36253
Author: lukastoenne
Date: 2011-04-20 20:56:15 +0000 (Wed, 20 Apr 2011)
Log Message:
-----------
Revived the socket type struct for collecting info and functions for socket types. Implemented a basic system for doing type conversions by selecting on the input side.
Modified Paths:
--------------
branches/particles-2010/release/scripts/ui/properties_modifier_node.py
branches/particles-2010/source/blender/blenkernel/BKE_node.h
branches/particles-2010/source/blender/blenkernel/intern/node.c
branches/particles-2010/source/blender/blenloader/intern/readfile.c
branches/particles-2010/source/blender/blenloader/intern/writefile.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/editors/space_node/node_intern.h
branches/particles-2010/source/blender/makesdna/DNA_node_types.h
branches/particles-2010/source/blender/makesrna/RNA_access.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/CMakeLists.txt
branches/particles-2010/source/blender/nodes/MOD_node.h
branches/particles-2010/source/blender/nodes/intern/CMP_nodetree.c
branches/particles-2010/source/blender/nodes/intern/MOD_exec.c
branches/particles-2010/source/blender/nodes/intern/MOD_exec.h
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_common.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_join.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_mesh.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodes/MOD_transform.c
branches/particles-2010/source/blender/nodes/intern/MOD_nodetree.c
branches/particles-2010/source/blender/nodes/intern/MOD_util.h
branches/particles-2010/source/blender/nodes/intern/node_common.c
branches/particles-2010/source/blender/nodes/intern/node_common.h
branches/particles-2010/source/blender/nodes/intern/node_exec.c
branches/particles-2010/source/blender/nodes/intern/node_exec.h
branches/particles-2010/source/blender/nodes/intern/node_socket.c
branches/particles-2010/source/blender/nodes/intern/node_socket.h
Modified: branches/particles-2010/release/scripts/ui/properties_modifier_node.py
===================================================================
--- branches/particles-2010/release/scripts/ui/properties_modifier_node.py 2011-04-20 20:46:02 UTC (rev 36252)
+++ branches/particles-2010/release/scripts/ui/properties_modifier_node.py 2011-04-20 20:56:15 UTC (rev 36253)
@@ -49,13 +49,7 @@
col.template_ID(node, "external_mesh")
def TRANSFORM(self, layout, node):
- col = layout.column()
- row = col.row(align=1)
- row.prop(node, "translate")
- row = col.row(align=1)
- row.prop(node, "rotate")
- row = col.row(align=1)
- row.prop(node, "scale")
+ pass
def JOIN(self, layout, node):
pass
Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h 2011-04-20 20:46:02 UTC (rev 36252)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h 2011-04-20 20:56:15 UTC (rev 36253)
@@ -41,6 +41,8 @@
#include "BKE_opencl.h"
+#include "RNA_types.h"
+
/* not very important, but the stack solver likes to know a maximum */
#define MAX_SOCKET 64
@@ -73,6 +75,8 @@
struct Object;
struct DerivedMesh;
struct ParticleSystem;
+struct bNodeDataReader;
+struct bNodeDataSource;
/* ************** NODE TYPE DEFINITIONS ***** */
@@ -87,10 +91,8 @@
struct bNodeSocket *sock; /* used to hold verified socket */
} bNodeSocketTemplate;
-typedef struct bNodeSocketConverter {
- char ui_name[32];
-} bNodeSocketConverter;
-
+/* visitor function for socket converters */
+typedef void (*SocketConvWalkFunc)(void *userdata, int converter, const char *name);
typedef struct bNodeSocketType {
int type;
char ui_name[32];
@@ -98,7 +100,17 @@
int ui_icon;
char ui_color[4];
- int (*get_converters)(int type, struct bNodeSocketConverter **conv, int *totconv);
+ int value_size;
+
+ void (*foreach_converter)(void *userdata, int type, SocketConvWalkFunc cb);
+
+ /* functions for sources of this type */
+ void *(*source_read)(struct bNodeDataSource *source, int key);
+ void (*source_write)(struct bNodeDataSource *source, int key, void *data);
+ /* get function pointers for readers of this type */
+ void (*make_reader_buffer)(struct bNodeDataReader *reader, int converter);
+ void (*make_reader_delegate)(struct bNodeDataReader *reader, int converter);
+ int (*reader_size)(struct bNodeDataReader *reader);
} bNodeSocketType;
typedef struct bNodeTemplate {
@@ -286,8 +298,8 @@
/* ************** GENERIC API, NODES *************** */
-struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type);
-struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
+struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type, PropertySubType subtype);
+struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type, PropertySubType subtype);
void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
@@ -316,6 +328,7 @@
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 nodeInitLinkConverter(struct bNodeLink *link);
void nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
void nodeAttachNode(struct bNode *node, struct bNode *parent);
@@ -637,12 +650,14 @@
/* input */
#define MOD_NODE_MESH 1000
+#define MOD_NODE_VERTEXGROUP 1001
/* transform */
#define MOD_NODE_TRANSFORM 1100
/* combine */
-#define MOD_NODE_JOIN 1200
+#define MOD_NODE_JOIN 1200
+#define MOD_NODE_MORPH 1201
/* API */
struct DerivedMesh *ntreeModifierExecTree(struct bNodeTree *ntree, struct Scene *scene, struct Object *ob, float (*inputVertexCos)[3]);
Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c 2011-04-20 20:46:02 UTC (rev 36252)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c 2011-04-20 20:56:15 UTC (rev 36253)
@@ -164,28 +164,45 @@
ntree->init |= NTREE_TYPE_INIT;
}
-static bNodeSocket *make_socket(bNodeTree *UNUSED(ntree), int in_out, const char *name, int type)
+static bNodeSocket *make_socket(bNodeTree *ntree, int in_out, const char *name, int type, int subtype)
{
- bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+ bNodeSocketType *stype= ntreeGetSocketType(type);
+ bNodeSocket *sock;
+ PropertyRNA *prop;
+ PointerRNA ptr;
+ sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+
BLI_strncpy(sock->name, name, NODE_MAXSTR);
sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
sock->type= type;
+ sock->subtype = subtype;
sock->storage = NULL;
+ if (stype->value_size > 0) {
+ /* NB: all necessary properties for RNA refine have been set! */
+ RNA_pointer_create((ID*)ntree, &RNA_NodeSocket, sock, &ptr);
+ prop = RNA_struct_find_property(&ptr, "default_value");
+ if (prop) {
+ int index, len= RNA_property_array_length(&ptr, prop);
+
+ sock->default_value = MEM_callocN(stype->value_size, "default value");
+
+ /* reset to default value */
+ for (index=0; index < len; ++index)
+ RNA_property_reset(&ptr, prop, index);
+ }
+ }
zero_v4(sock->ns.vec);
sock->ns.min = -FLT_MAX; /* _not_ FLT_MIN, that would be the smallest possible float > 0 */
sock->ns.max = FLT_MAX;
- sock->ns.ival = 0;
- sock->ns.imin = INT_MIN;
- sock->ns.imax = INT_MAX;
return sock;
}
-bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type)
+bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type, PropertySubType subtype)
{
- bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+ bNodeSocket *sock = make_socket(ntree, in_out, name, type, subtype);
if (in_out==SOCK_IN)
BLI_addtail(&node->inputs, sock);
else if (in_out==SOCK_OUT)
@@ -196,9 +213,9 @@
return sock;
}
-bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type)
+bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type, PropertySubType subtype)
{
- bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+ bNodeSocket *sock = make_socket(ntree, in_out, name, type, subtype);
if (in_out==SOCK_IN)
BLI_insertlinkbefore(&node->inputs, next_sock, sock);
else if (in_out==SOCK_OUT)
@@ -223,6 +240,9 @@
/* this is fast, this way we don't need an in_out argument */
BLI_remlink(&node->inputs, sock);
BLI_remlink(&node->outputs, sock);
+
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
MEM_freeN(sock);
ntree->update |= NTREE_UPDATE_NODES;
@@ -230,6 +250,7 @@
void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
{
+ bNodeSocket *sock;
bNodeLink *link, *next;
for(link= ntree->links.first; link; link= next) {
@@ -239,7 +260,14 @@
}
}
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
BLI_freelistN(&node->inputs);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+
BLI_freelistN(&node->outputs);
ntree->update |= NTREE_UPDATE_NODES;
@@ -458,7 +486,7 @@
if(ntype->inputs) {
sockdef= ntype->inputs;
while(sockdef->type != -1) {
- sock = nodeAddSocket(ntree, node, SOCK_IN, sockdef->name, sockdef->type);
+ sock = nodeAddSocket(ntree, node, SOCK_IN, sockdef->name, sockdef->type, PROP_NONE);
/* tag socket as static */
sock->flag |= SOCK_STATIC;
@@ -469,9 +497,6 @@
sock->ns.vec[3] = sockdef->val4;
sock->ns.min = sockdef->min;
sock->ns.max = sockdef->max;
- sock->ns.ival = (int)sockdef->val1;
- sock->ns.imin = (int)sockdef->min;
- sock->ns.imax = (int)sockdef->max;
sockdef++;
}
@@ -479,7 +504,7 @@
if(ntype->outputs) {
sockdef= ntype->outputs;
while(sockdef->type != -1) {
- sock = nodeAddSocket(ntree, node, SOCK_OUT, sockdef->name, sockdef->type);
+ sock = nodeAddSocket(ntree, node, SOCK_OUT, sockdef->name, sockdef->type, PROP_NONE);
/* tag socket as static */
sock->flag |= SOCK_STATIC;
@@ -490,9 +515,6 @@
sock->ns.vec[3] = sockdef->val4;
sock->ns.min = sockdef->min;
sock->ns.max = sockdef->max;
- sock->ns.ival = (int)sockdef->val1;
- sock->ns.imin = (int)sockdef->min;
- sock->ns.imax = (int)sockdef->max;
sockdef++;
}
@@ -622,7 +644,6 @@
return nnode;
}
-/* fromsock and tosock can be NULL */
/* also used via rna api, so we check for proper input output direction */
bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
{
@@ -645,6 +666,21 @@
from= -1; /* OK but flip */
}
}
+ else {
+ /* check tree sockets */
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= 1; /* OK */
+ else {
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= -1; /* OK but flip */
+ }
+ }
if(tonode) {
for(sock= tonode->inputs.first; sock; sock= sock->next)
if(sock==tosock)
@@ -659,8 +695,22 @@
to= -1; /* OK but flip */
}
}
+ else {
+ /* check tree sockets */
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= 1; /* OK */
+ else {
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= -1; /* OK but flip */
+ }
+ }
- /* this allows NULL sockets to work */
if(from >= 0 && to >= 0) {
link= MEM_callocN(sizeof(bNodeLink), "link");
BLI_addtail(&ntree->links, link);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list