diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2020-02-06 15:05:45 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2020-02-06 15:36:39 +0300 |
commit | 62ca9bcd0a7ff6fe52e359521369fc8b063d082a (patch) | |
tree | 7aae08f2a67b3ca12e01e524e3759ae226adf936 /source/blender/editors/space_node | |
parent | dd00e8ecd642cafc6294ec7f0f31c5e0e0fe9870 (diff) |
Cleanup: refactor default materials and shader nodes
Diffstat (limited to 'source/blender/editors/space_node')
-rw-r--r-- | source/blender/editors/space_node/node_edit.c | 115 |
1 files changed, 47 insertions, 68 deletions
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 9623d89e030..045e4d28df6 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -37,6 +37,7 @@ #include "BKE_image.h" #include "BKE_library.h" #include "BKE_main.h" +#include "BKE_material.h" #include "BKE_node.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -441,81 +442,59 @@ bool ED_node_is_texture(struct SpaceNode *snode) /* called from shading buttons or header */ void ED_node_shader_default(const bContext *C, ID *id) { - bNode *in, *out; - bNodeSocket *fromsock, *tosock, *sock; - bNodeTree *ntree; - int output_type, shader_type; - float color[4] = {0.0f, 0.0f, 0.0f, 1.0f}, strength = 1.0f; - - ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); - - switch (GS(id->name)) { - case ID_MA: { - Material *ma = (Material *)id; - ma->nodetree = ntree; - - output_type = SH_NODE_OUTPUT_MATERIAL; - shader_type = SH_NODE_BSDF_PRINCIPLED; + Main *bmain = CTX_data_main(C); - copy_v3_v3(color, &ma->r); - strength = 0.0f; - break; + if (GS(id->name) == ID_MA) { + /* Materials */ + Material *ma = (Material *)id; + Material *ma_default = BKE_material_default_surface(); + ma->nodetree = ntreeCopyTree(bmain, ma_default->nodetree); + ntreeUpdateTree(bmain, ma->nodetree); + } + else if (ELEM(GS(id->name), ID_WO, ID_LA)) { + /* Emission */ + bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); + bNode *shader, *output; + + if (GS(id->name) == ID_WO) { + World *world = (World *)id; + world->nodetree = ntree; + + shader = nodeAddStaticNode(NULL, ntree, SH_NODE_BACKGROUND); + output = nodeAddStaticNode(NULL, ntree, SH_NODE_OUTPUT_WORLD); + nodeAddLink(ntree, + shader, + nodeFindSocket(shader, SOCK_OUT, "Background"), + output, + nodeFindSocket(output, SOCK_IN, "Surface")); + + bNodeSocket *color_sock = nodeFindSocket(shader, SOCK_IN, "Color"); + copy_v3_v3(((bNodeSocketValueRGBA *)color_sock->default_value)->value, &world->horr); } - case ID_WO: { - World *wo = (World *)id; - wo->nodetree = ntree; - - output_type = SH_NODE_OUTPUT_WORLD; - shader_type = SH_NODE_BACKGROUND; + else { + Light *light = (Light *)id; + light->nodetree = ntree; - copy_v3_v3(color, &wo->horr); - strength = 1.0f; - break; + shader = nodeAddStaticNode(NULL, ntree, SH_NODE_EMISSION); + output = nodeAddStaticNode(NULL, ntree, SH_NODE_OUTPUT_LIGHT); + nodeAddLink(ntree, + shader, + nodeFindSocket(shader, SOCK_OUT, "Emission"), + output, + nodeFindSocket(output, SOCK_IN, "Surface")); } - case ID_LA: { - Light *la = (Light *)id; - la->nodetree = ntree; - output_type = SH_NODE_OUTPUT_LIGHT; - shader_type = SH_NODE_EMISSION; - - copy_v3_fl3(color, 1.0f, 1.0f, 1.0f); - strength = 1.0f; - break; - } - default: - printf("ED_node_shader_default called on wrong ID type.\n"); - return; + shader->locx = 10.0f; + shader->locy = 300.0f; + output->locx = 300.0f; + output->locy = 300.0f; + nodeSetActive(ntree, output); + ntreeUpdateTree(bmain, ntree); } - - out = nodeAddStaticNode(C, ntree, output_type); - out->locx = 300.0f; - out->locy = 300.0f; - - in = nodeAddStaticNode(C, ntree, shader_type); - in->locx = 10.0f; - in->locy = 300.0f; - nodeSetActive(ntree, in); - - /* only a link from color to color */ - fromsock = in->outputs.first; - tosock = out->inputs.first; - nodeAddLink(ntree, in, fromsock, out, tosock); - - /* default values */ - PointerRNA sockptr; - sock = in->inputs.first; - RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &sockptr); - - RNA_float_set_array(&sockptr, "default_value", color); - - if (strength != 0.0f) { - sock = in->inputs.last; - RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &sockptr); - RNA_float_set(&sockptr, "default_value", strength); + else { + printf("ED_node_shader_default called on wrong ID type.\n"); + return; } - - ntreeUpdateTree(CTX_data_main(C), ntree); } /* assumes nothing being done in ntree yet, sets the default in/out node */ |