Render API: shader script node for custom shaders.

* Shader script node added, which stores either a link to a text datablock or
  file on disk, and has functions to add and remove sockets.
* Callback RenderEngine.update_script_node(self, node) added for render engines
  to compile the shader and update the node with new sockets.

Thanks to Thomas, Lukas and Dalai for the implementation.
This commit is contained in:
2012-11-03 14:32:26 +00:00
parent 615fe0295f
commit e02b23b81a
22 changed files with 572 additions and 17 deletions

View File

@@ -1384,6 +1384,34 @@ static void node_shader_buts_glossy(uiLayout *layout, bContext *UNUSED(C), Point
uiItemR(layout, ptr, "distribution", 0, "", ICON_NONE);
}
static void node_shader_buts_script(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
row = uiLayoutRow(layout, FALSE);
uiItemR(row, ptr, "mode", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
row = uiLayoutRow(layout, TRUE);
if(RNA_enum_get(ptr, "mode") == NODE_SCRIPT_INTERNAL)
uiItemR(row, ptr, "script", 0, "", ICON_NONE);
else
uiItemR(row, ptr, "filepath", 0,"", ICON_NONE);
uiItemO(row, "", ICON_FILE_REFRESH, "node.shader_script_update");
}
static void node_shader_buts_script_details(uiLayout *layout, bContext *C, PointerRNA *ptr)
{
uiItemS(layout);
node_shader_buts_script(layout, C, ptr);
/* not implemented yet
if(RNA_enum_get(ptr, "mode") == NODE_SCRIPT_EXTERNAL)
uiItemR(layout, ptr, "use_auto_update", 0, NULL, ICON_NONE);*/
}
/* only once called */
static void node_shader_set_butfunc(bNodeType *ntype)
{
@@ -1467,6 +1495,10 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case SH_NODE_BSDF_GLASS:
ntype->uifunc = node_shader_buts_glossy;
break;
case SH_NODE_SCRIPT:
ntype->uifunc = node_shader_buts_script;
ntype->uifuncbut = node_shader_buts_script_details;
break;
}
}