Move the MaterialX export code into the existing shader node files #18

Merged
Bogdan Nagirniak merged 14 commits from BogdanNagirniak/blender:matx-move-code into matx-export-material 2023-09-12 13:55:27 +02:00
4 changed files with 75 additions and 0 deletions
Showing only changes of commit 9b7fec9895 - Show all commits

View File

@ -225,6 +225,9 @@ typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat,
struct bNodeExecData *execdata, struct bNodeExecData *execdata,
struct GPUNodeStack *in, struct GPUNodeStack *in,
struct GPUNodeStack *out); struct GPUNodeStack *out);
typedef void (*NodeMaterialXExecFunction)(void *data,
struct bNode *node,
struct bNodeSocket *out);
/** /**
* \brief Defines a node type. * \brief Defines a node type.
@ -339,6 +342,8 @@ typedef struct bNodeType {
NodeExecFunction exec_fn; NodeExecFunction exec_fn;
/* gpu */ /* gpu */
NodeGPUExecFunction gpu_fn; NodeGPUExecFunction gpu_fn;
/* MaterialX */
NodeMaterialXExecFunction materialx_fn;
/* Get an instance of this node's compositor operation. Freeing the instance is the /* Get an instance of this node's compositor operation. Freeing the instance is the
* responsibility of the caller. */ * responsibility of the caller. */

View File

@ -125,4 +125,37 @@ DECLARE_SHADER_NODE_PARSER(EmissionNodeParser)
DECLARE_SHADER_NODE_PARSER(MixShaderNodeParser) DECLARE_SHADER_NODE_PARSER(MixShaderNodeParser)
DECLARE_SHADER_NODE_PARSER(SubsurfaceScatteringNodeParser) DECLARE_SHADER_NODE_PARSER(SubsurfaceScatteringNodeParser)
struct NodeParserData {
MaterialX::GraphElement *graph;
const Depsgraph *depsgraph;
const Material *material;
NodeItem result;
};
template<class T>
void node_shader_materialx(void *data, struct bNode *node, struct bNodeSocket *out)
{
materialx::NodeParserData *d = reinterpret_cast<materialx::NodeParserData *>(data);
T parser(d->graph, d->depsgraph, d->material, node, out);
d->result = parser.compute();
}
#define NODE_SHADER_MATERIALX_BEGIN \
class MaterialXNodeParser : public materialx::NodeParser { \
public: \
using materialx::NodeParser::NodeParser; \
materialx::NodeItem compute() override \
{ \
using NodeItem = materialx::NodeItem;
#define NODE_SHADER_MATERIALX_END \
} \
}; \
\
void node_shader_materialx(void *data, struct bNode *node, struct bNodeSocket *out) \
{ \
materialx::node_shader_materialx<MaterialXNodeParser>(data, node, out); \
}
} // namespace blender::nodes::materialx } // namespace blender::nodes::materialx

View File

@ -5,6 +5,7 @@
#include "BLI_string.h" #include "BLI_string.h"
#include "node_shader_util.hh" #include "node_shader_util.hh"
#include "../materialx/nodes/node_parser.h"
#include "UI_interface.hh" #include "UI_interface.hh"
#include "UI_resources.hh" #include "UI_resources.hh"
@ -253,6 +254,12 @@ static void node_shader_update_principled(bNodeTree *ntree, bNode *node)
} }
} }
NODE_SHADER_MATERIALX_BEGIN
{
return empty();
}
NODE_SHADER_MATERIALX_END
} // namespace blender::nodes::node_shader_bsdf_principled_cc } // namespace blender::nodes::node_shader_bsdf_principled_cc
/* node type definition */ /* node type definition */
@ -270,6 +277,7 @@ void register_node_type_sh_bsdf_principled()
ntype.initfunc = file_ns::node_shader_init_principled; ntype.initfunc = file_ns::node_shader_init_principled;
ntype.gpu_fn = file_ns::node_shader_gpu_bsdf_principled; ntype.gpu_fn = file_ns::node_shader_gpu_bsdf_principled;
ntype.updatefunc = file_ns::node_shader_update_principled; ntype.updatefunc = file_ns::node_shader_update_principled;
ntype.materialx_fn = file_ns::node_shader_materialx;
nodeRegisterType(&ntype); nodeRegisterType(&ntype);
} }

View File

@ -3,6 +3,7 @@
* SPDX-License-Identifier: GPL-2.0-or-later */ * SPDX-License-Identifier: GPL-2.0-or-later */
#include "node_shader_util.hh" #include "node_shader_util.hh"
#include "../materialx/nodes/node_parser.h"
#include "BKE_scene.h" #include "BKE_scene.h"
@ -43,6 +44,33 @@ static int node_shader_gpu_output_material(GPUMaterial *mat,
return true; return true;
} }
NODE_SHADER_MATERIALX_BEGIN
NodeItem surface = empty();
if (node_) {
NodeItem bsdf = get_input_shader("Surface", NodeItem::Type::BSDF);
NodeItem edf = get_input_shader("Surface", NodeItem::Type::EDF);
if (bsdf || edf) {
surface = create_node("surface", NodeItem::Type::SurfaceShader);
if (bsdf) {
surface.set_input("bsdf", bsdf);
}
if (edf) {
surface.set_input("edf", edf);
}
}
else {
surface = get_input_shader("Surface", NodeItem::Type::SurfaceShader);
}
}
else {
surface = create_node("standard_surface", NodeItem::Type::SurfaceShader);
surface.set_input("base_color", val(MaterialX::Color3(1.0f, 0.0f, 1.0f)));
}
NodeItem res = create_node("surfacematerial", NodeItem::Type::Material);
res.set_input("surfaceshader", surface);
return res;
NODE_SHADER_MATERIALX_END
} // namespace blender::nodes::node_shader_output_material_cc } // namespace blender::nodes::node_shader_output_material_cc
/* node type definition */ /* node type definition */
@ -56,6 +84,7 @@ void register_node_type_sh_output_material()
ntype.declare = file_ns::node_declare; ntype.declare = file_ns::node_declare;
ntype.add_ui_poll = object_shader_nodes_poll; ntype.add_ui_poll = object_shader_nodes_poll;
ntype.gpu_fn = file_ns::node_shader_gpu_output_material; ntype.gpu_fn = file_ns::node_shader_gpu_output_material;
ntype.materialx_fn = file_ns::node_shader_materialx;
ntype.no_muting = true; ntype.no_muting = true;