Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2005-12-29 21:08:01 +0300
committerTon Roosendaal <ton@blender.org>2005-12-29 21:08:01 +0300
commit8d352139909653e881c99205e71f34f689ff6292 (patch)
tree67422d1dd33125eca2c064a10448f5829af0fc46 /source/blender/blenkernel
parentfa24217b2c49f293b18d52db1bc7eb6b7c78a54e (diff)
More node goodies!
First note; this is a WIP project, some commits might change things that make formerly saved situations not to work identically... like now! ------ New Material integration ------ Until now, the Node system worked on top of the 'current' Material, just like how the Material Layers worked. That's quite confusing in practice, especially to see what Material is a Node, or what is the "base material" Best solution is to completely separate the two. This has been implemented as follows now; - The confusing "Input" node has been removed. - When choosing a Material in Blender, you can define this Material to be either 'normal' (default) or be the root of a Node tree. - If a Material is a Node tree, you have to add Nodes in the tree to see something happen. An empty Node tree doesn't do anything (black). - If a Material is a Node Tree, the 'data browse' menus show it with an 'N' mark before the name. The 'data block' buttons display it with the suffix 'NT' (instead of 'MA'). - In a Node Tree, any Material can be inserted, including itself. Only in that case the Material is being used itself for shading. UI changes: Added a new Panel "Links", which shows: - where the Material is linked to (Object, Mesh, etc) - if the Material is a NodeTree or not - the actual active Material in the Tree The "Node" Panel itself now only shows buttons from the other nodes, when they are active. Further the Material Nodes themselves allow browsing and renaming or adding new Materials now too. Second half of today's work was cleaning up selection when the Nodes overlap... it was possible to drag links from invisible sockets, or click headers for invisible nodes, etc. This because the mouse input code was not checking for visibility yet. Works now even for buttons. :)
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_node.h4
-rw-r--r--source/blender/blenkernel/intern/library.c13
-rw-r--r--source/blender/blenkernel/intern/material.c1
-rw-r--r--source/blender/blenkernel/intern/node.c44
-rw-r--r--source/blender/blenkernel/intern/node_shaders.c56
5 files changed, 58 insertions, 60 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 83087204567..123cf6e620e 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -71,7 +71,7 @@ typedef struct bNodeType {
void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
/* after this line is set on startup of blender */
- int (*butfunc)(struct uiBlock *, struct bNode *, rctf *);
+ int (*butfunc)(struct uiBlock *, struct bNodeTree *, struct bNode *, rctf *);
} bNodeType;
@@ -110,6 +110,7 @@ struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from
int nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
struct bNode *nodeGetActive(struct bNodeTree *ntree);
struct bNode *nodeGetActiveID(struct bNodeTree *ntree, short idtype);
+void nodeSetActive(struct bNodeTree *ntree, struct bNode *node);
/* ************** SHADER NODES *************** */
@@ -117,7 +118,6 @@ struct ShadeInput;
struct ShadeResult;
/* note: types are needed to restore callbacks, don't change values */
-#define SH_NODE_INPUT 0
#define SH_NODE_OUTPUT 1
#define SH_NODE_MATERIAL 100
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index ad41e9a7fb7..33e253aa232 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -530,9 +530,10 @@ ID *find_id(char *type, char *name) /* type: "OB" or "MA" etc */
return 0;
}
-static void get_flags_for_id(ID *id, char *buf) {
+static void get_flags_for_id(ID *id, char *buf)
+{
int isfake= id->flag & LIB_FAKEUSER;
-
+ int isnode=0;
/* Writeout the flags for the entry, note there
* is a small hack that writes 5 spaces instead
* of 4 if no flags are displayed... this makes
@@ -540,10 +541,15 @@ static void get_flags_for_id(ID *id, char *buf) {
* to have that explicit, oh well - zr
*/
+ if(GS(id->name)==ID_MA)
+ isnode= ((Material *)id)->use_nodes;
+
if (id->us<0)
sprintf(buf, "-1W ");
- else if (!id->lib && !isfake && id->us)
+ else if (!id->lib && !isfake && id->us && !isnode)
sprintf(buf, " ");
+ else if(isnode)
+ sprintf(buf, "%c%cN%c ", id->lib?'L':' ', isfake?'F':' ', (id->us==0)?'O':' ');
else
sprintf(buf, "%c%c%c ", id->lib?'L':' ', isfake?'F':' ', (id->us==0)?'O':' ');
}
@@ -575,6 +581,7 @@ static void IDnames_to_dyn_pupstring(DynStr *pupds, ListBase *lb, ID *link, shor
sprintf(buf, "%%x%d", i+1);
BLI_dynstr_append(pupds, buf);
+ /* icon */
switch(GS(id->name))
{
case ID_MA: /* fall through */
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 5054774f339..44420bc44b9 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -588,6 +588,7 @@ Material *get_active_matlayer(Material *ma)
if(node && node->id) {
return (Material *)node->id;
}
+ return NULL;
}
else {
MaterialLayer *ml;
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index fbaa0b35c5e..c47572ffc43 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -35,6 +35,7 @@
#include "BKE_blender.h"
#include "BKE_node.h"
+#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "BLI_arithb.h"
@@ -56,7 +57,7 @@ static bNodeType *nodeGetType(bNodeTree *ntree, int type)
void ntreeInitTypes(bNodeTree *ntree)
{
- bNode *node;
+ bNode *node, *next;
if(ntree->type==NTREE_SHADER)
ntree->alltypes= node_all_shaders;
@@ -65,10 +66,13 @@ void ntreeInitTypes(bNodeTree *ntree)
printf("Error: no type definitions for nodes\n");
}
- for(node= ntree->nodes.first; node; node= node->next) {
+ for(node= ntree->nodes.first; node; node= next) {
+ next= node->next;
node->typeinfo= nodeGetType(ntree, node->type);
- if(node->typeinfo==NULL)
- printf("Error: no typeinfo for node %s\n", node->name);
+ if(node->typeinfo==NULL) {
+ printf("Error: Node type %s doesn't exist anymore, removed\n", node->name);
+ nodeFreeNode(ntree, node);
+ }
}
ntree->init |= NTREE_TYPE_INIT;
@@ -199,7 +203,8 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type)
node->type= ntype->type;
node->flag= NODE_SELECT|ntype->flag;
node->width= ntype->width;
-
+ node->miniwidth= 15.0f; /* small value only, allows print of first chars */
+
if(ntype->inputs) {
stype= ntype->inputs;
while(stype->type != -1) {
@@ -214,6 +219,15 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type)
stype++;
}
}
+
+ /* need init handler later? */
+ if(ntree->type==NTREE_SHADER) {
+ if(type==SH_NODE_MATERIAL)
+ node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC;
+ else if(node->type==SH_NODE_VALTORGB)
+ node->storage= add_colorband(1);
+ }
+
return node;
}
@@ -445,6 +459,26 @@ bNode *nodeGetActiveID(bNodeTree *ntree, short idtype)
return node;
}
+/* two active flags, ID nodes have special flag for buttons display */
+void nodeSetActive(bNodeTree *ntree, bNode *node)
+{
+ bNode *tnode;
+
+ /* make sure only one node is active, and only one per ID type */
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
+ tnode->flag &= ~NODE_ACTIVE;
+
+ if(node->id && tnode->id) {
+ if(GS(node->id->name) == GS(tnode->id->name))
+ tnode->flag &= ~NODE_ACTIVE_ID;
+ }
+ }
+
+ node->flag |= NODE_ACTIVE;
+ if(node->id)
+ node->flag |= NODE_ACTIVE_ID;
+}
+
/* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */
diff --git a/source/blender/blenkernel/intern/node_shaders.c b/source/blender/blenkernel/intern/node_shaders.c
index f2ece280d58..220605fae53 100644
--- a/source/blender/blenkernel/intern/node_shaders.c
+++ b/source/blender/blenkernel/intern/node_shaders.c
@@ -63,29 +63,6 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult
node_shader_lamp_loop= lamp_loop_func;
}
-/* **************** input node ************ */
-
-static void node_shader_exec_input(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
-{
- if(data) {
- ShadeResult *shr= ((ShaderCallData *)data)->shr;
- ShadeInput *shi= ((ShaderCallData *)data)->shi;
- float col[4];
-
- /* stack order output sockets: color, alpha, normal */
- VecAddf(col, shr->diff, shr->spec);
- col[3]= shr->alpha;
-
- VECCOPY(out[0]->vec, col);
- out[1]->vec[0]= shr->alpha;
- VECCOPY(out[2]->vec, shi->vn);
-
- if(shi->do_preview)
- nodeAddToPreview(node, col, shi->xs, shi->ys);
-
- }
-}
-
/* **************** output node ************ */
@@ -275,26 +252,6 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
/* Verification rule: If name changes, a saved socket and its links will be removed! Type changes are OK */
-/* *************** INPUT ********************* */
-static bNodeSocketType sh_node_input_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { -1, 0, "" }
-};
-
-static bNodeType sh_node_input= {
- /* type code */ SH_NODE_INPUT,
- /* name */ "Input",
- /* width+range */ 80, 60, 200,
- /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW,
- /* input sock */ NULL,
- /* output sock */ sh_node_input_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_input,
-
-};
-
/* **************** OUTPUT ******************** */
static bNodeSocketType sh_node_output_in[]= {
{ SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
@@ -331,7 +288,7 @@ static bNodeSocketType sh_node_material_out[]= {
static bNodeType sh_node_material= {
/* type code */ SH_NODE_MATERIAL,
/* name */ "Material",
- /* width+range */ 120, 60, 200,
+ /* width+range */ 120, 80, 240,
/* class+opts */ NODE_CLASS_GENERATOR, NODE_OPTIONS|NODE_PREVIEW,
/* input sock */ sh_node_material_in,
/* output sock */ sh_node_material_out,
@@ -351,7 +308,7 @@ static bNodeSocketType sh_node_texture_out[]= {
static bNodeType sh_node_texture= {
/* type code */ SH_NODE_TEXTURE,
/* name */ "Texture",
- /* width+range */ 120, 60, 200,
+ /* width+range */ 120, 80, 240,
/* class+opts */ NODE_CLASS_GENERATOR, NODE_OPTIONS|NODE_PREVIEW,
/* input sock */ NULL,
/* output sock */ sh_node_texture_out,
@@ -380,7 +337,7 @@ static bNodeType sh_node_value= {
/* **************** RGB ******************** */
static bNodeSocketType sh_node_rgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 0, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -399,8 +356,8 @@ static bNodeType sh_node_rgb= {
/* **************** MIX RGB ******************** */
static bNodeSocketType sh_node_mix_rgb_in[]= {
{ SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color1", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketType sh_node_mix_rgb_out[]= {
@@ -462,7 +419,7 @@ static bNodeType sh_node_rgbtobw= {
/* class+opts */ NODE_CLASS_OPERATOR, 0,
/* input sock */ sh_node_rgbtobw_in,
/* output sock */ sh_node_rgbtobw_out,
- /* storage */ "ColorBand",
+ /* storage */ "",
/* execfunc */ node_shader_exec_rgbtobw,
};
@@ -471,7 +428,6 @@ static bNodeType sh_node_rgbtobw= {
/* ****************** types array for all shaders ****************** */
bNodeType *node_all_shaders[]= {
- &sh_node_input,
&sh_node_output,
&sh_node_material,
&sh_node_value,