Blender V4.3
node_parser.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "material.h"
8#include "node_item.h"
9
10#include "DEG_depsgraph.hh"
11#include "DNA_material_types.h"
12#include "DNA_node_types.h"
13
14#include "CLG_log.h"
15
17
18extern struct CLG_LogRef *LOG_MATERIALX_SHADER;
19
20class GroupNodeParser;
21
27 protected:
28 MaterialX::GraphElement *graph_;
29 const Depsgraph *depsgraph_;
31 const bNode *node_;
36
37 public:
38 NodeParser(MaterialX::GraphElement *graph,
39 const Depsgraph *depsgraph,
40 const Material *material,
41 const bNode *node,
42 const bNodeSocket *socket_out,
44 GroupNodeParser *group_parser,
45 const ExportParams &export_params);
46 virtual ~NodeParser() = default;
47
48 virtual NodeItem compute() = 0;
49 virtual NodeItem compute_full();
50
51 protected:
52 std::string node_name(bool with_out_socket = true) const;
53 NodeItem create_node(const std::string &category, NodeItem::Type type);
54 NodeItem create_node(const std::string &category,
55 NodeItem::Type type,
56 const NodeItem::Inputs &inputs);
57 NodeItem create_input(const std::string &name, const NodeItem &item);
58 NodeItem create_output(const std::string &name, const NodeItem &item);
59 NodeItem get_input_default(const std::string &name, NodeItem::Type to_type);
61 NodeItem get_output_default(const std::string &name, NodeItem::Type to_type);
63 NodeItem get_input_link(const std::string &name, NodeItem::Type to_type);
65 NodeItem get_input_value(const std::string &name, NodeItem::Type to_type);
67 NodeItem empty() const;
68 template<class T> NodeItem val(const T &data) const;
70 const std::string &attribute_name = "");
71
72 private:
73 NodeItem get_default(const bNodeSocket &socket, NodeItem::Type to_type);
76 bool use_group_default);
78};
79
80template<class T> NodeItem NodeParser::val(const T &data) const
81{
82 return empty().val(data);
83}
84
110
111#define NODE_SHADER_MATERIALX_BEGIN \
112 class MaterialXNodeParser : public materialx::NodeParser { \
113 public: \
114 using materialx::NodeParser::NodeParser; \
115 materialx::NodeItem compute() override; \
116 }; \
117\
118 materialx::NodeItem MaterialXNodeParser::compute() \
119 { \
120 using NodeItem = materialx::NodeItem;
121
122#define NODE_SHADER_MATERIALX_END \
123 } \
124\
125 static void node_shader_materialx(void *data, struct bNode *node, struct bNodeSocket *out) \
126 { \
127 materialx::NodeParserData *d = reinterpret_cast<materialx::NodeParserData *>(data); \
128 d->result = MaterialXNodeParser(d->graph, \
129 d->depsgraph, \
130 d->material, \
131 node, \
132 out, \
133 d->to_type, \
134 d->group_parser, \
135 d->export_params) \
136 .compute_full(); \
137 }
138
139} // namespace blender::nodes::materialx
NodeItem val(const T &data) const
Definition node_item.h:148
std::vector< std::pair< std::string, NodeItem > > Inputs
Definition node_item.h:20
NodeItem get_input_value(const std::string &name, NodeItem::Type to_type)
MaterialX::GraphElement * graph_
Definition node_parser.h:28
NodeParser(MaterialX::GraphElement *graph, const Depsgraph *depsgraph, const Material *material, const bNode *node, const bNodeSocket *socket_out, NodeItem::Type to_type, GroupNodeParser *group_parser, const ExportParams &export_params)
NodeItem create_input(const std::string &name, const NodeItem &item)
NodeItem get_input_link(const std::string &name, NodeItem::Type to_type)
NodeItem texcoord_node(NodeItem::Type type=NodeItem::Type::Vector2, const std::string &attribute_name="")
NodeItem get_input_default(const std::string &name, NodeItem::Type to_type)
NodeItem get_output_default(const std::string &name, NodeItem::Type to_type)
NodeItem create_node(const std::string &category, NodeItem::Type type)
std::string node_name(bool with_out_socket=true) const
NodeItem create_output(const std::string &name, const NodeItem &item)
NodeItem val(const T &data) const
Definition node_parser.h:80
const Depsgraph * depsgraph
static Type to_type(const eGPUType type)
struct CLG_LogRef * LOG_MATERIALX_SHADER