forked from blender/blender
Export to MatX various Texture nodes #5
@ -41,8 +41,9 @@ class NodeParser {
|
|||||||
NodeItem empty() const;
|
NodeItem empty() const;
|
||||||
template<class T> NodeItem value(const T &data) const;
|
template<class T> NodeItem value(const T &data) const;
|
||||||
|
|
||||||
|
virtual NodeItem get_input_default(const bNodeSocket &socket);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NodeItem get_input_default(const bNodeSocket &socket);
|
|
||||||
NodeItem get_input_link(const bNodeSocket &socket);
|
NodeItem get_input_link(const bNodeSocket &socket);
|
||||||
NodeItem get_input_value(const bNodeSocket &socket);
|
NodeItem get_input_value(const bNodeSocket &socket);
|
||||||
};
|
};
|
||||||
@ -66,7 +67,23 @@ DECLARE_PARSER(MixRGBNodeParser)
|
|||||||
DECLARE_PARSER(OutputMaterialNodeParser)
|
DECLARE_PARSER(OutputMaterialNodeParser)
|
||||||
DECLARE_PARSER(TexImageNodeParser)
|
DECLARE_PARSER(TexImageNodeParser)
|
||||||
DECLARE_PARSER(TexEnvironmentNodeParser)
|
DECLARE_PARSER(TexEnvironmentNodeParser)
|
||||||
DECLARE_PARSER(TexNoiseNodeParser)
|
|
||||||
DECLARE_PARSER(TexCheckerNodeParser)
|
class TexNoiseNodeParser : public NodeParser {
|
||||||
|
public:
|
||||||
|
using NodeParser::NodeParser;
|
||||||
|
NodeItem compute() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
NodeItem get_input_default(const bNodeSocket &socket) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TexCheckerNodeParser : public NodeParser {
|
||||||
|
public:
|
||||||
|
using NodeParser::NodeParser;
|
||||||
|
NodeItem compute() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
NodeItem get_input_default(const bNodeSocket &socket) override;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace blender::nodes::materialx
|
} // namespace blender::nodes::materialx
|
||||||
|
@ -8,6 +8,20 @@
|
|||||||
|
|
||||||
namespace blender::nodes::materialx {
|
namespace blender::nodes::materialx {
|
||||||
|
|
||||||
|
NodeItem TexCheckerNodeParser::get_input_default(const bNodeSocket &socket)
|
||||||
|
{
|
||||||
|
/* Explicit check for Scale socket since MaterialX has scales for X and Y
|
||||||
DagerD marked this conversation as resolved
Outdated
|
|||||||
|
* axes and Blender only single. */
|
||||||
|
if (UNLIKELY(STREQ(socket.name, "Scale"))) {
|
||||||
|
NodeItem res = empty();
|
||||||
|
float v = socket.default_value_typed<bNodeSocketValueFloat>()->value;
|
||||||
|
res.value = MaterialX::Value::createValue<MaterialX::Vector2>({v, v});
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NodeParser::get_input_default(socket);
|
||||||
|
}
|
||||||
|
|
||||||
NodeItem TexCheckerNodeParser::compute()
|
NodeItem TexCheckerNodeParser::compute()
|
||||||
{
|
{
|
||||||
NodeItem texcoord = create_node("texcoord", "vector2", true);
|
NodeItem texcoord = create_node("texcoord", "vector2", true);
|
||||||
@ -58,8 +72,8 @@ NodeItem TexCheckerNodeParser::compute()
|
|||||||
NodeItem ifequal = create_node("ifequal", "float", true);
|
NodeItem ifequal = create_node("ifequal", "float", true);
|
||||||
ifequal.set_input("value1", add);
|
ifequal.set_input("value1", add);
|
||||||
ifequal.set_input("value2", MaterialX::Value::createValue<float>(1.0f));
|
ifequal.set_input("value2", MaterialX::Value::createValue<float>(1.0f));
|
||||||
ifequal.set_input("in1", MaterialX::Value::createValue<float>(1.0f));
|
ifequal.set_input("in1", MaterialX::Value::createValue<float>(0.0f));
|
||||||
ifequal.set_input("in2", MaterialX::Value::createValue<float>(0.0f));
|
ifequal.set_input("in2", MaterialX::Value::createValue<float>(1.0f));
|
||||||
|
|
||||||
NodeItem res = create_node("mix", "color3", true);
|
NodeItem res = create_node("mix", "color3", true);
|
||||||
NodeItem color1 = get_input_value("Color1");
|
NodeItem color1 = get_input_value("Color1");
|
||||||
|
@ -8,6 +8,20 @@
|
|||||||
|
|
||||||
namespace blender::nodes::materialx {
|
namespace blender::nodes::materialx {
|
||||||
|
|
||||||
|
NodeItem TexNoiseNodeParser::get_input_default(const bNodeSocket &socket)
|
||||||
|
{
|
||||||
|
/* Explicit check for Detail socket since MaterialX expects integer for
|
||||||
|
* octaves. */
|
||||||
|
if (UNLIKELY(STREQ(socket.name, "Detail"))) {
|
||||||
|
NodeItem res = empty();
|
||||||
|
int v = socket.default_value_typed<bNodeSocketValueFloat>()->value;
|
||||||
DagerD marked this conversation as resolved
Outdated
Bogdan Nagirniak
commented
Use following order:
Use following order:
1. get_input_...()
2. operations: math, new nodes
3. creating result node.
```
NodeItem detail = get_input_value("Detail");
NodeItem lacunarity = get_input_value("Lacunarity");
NodeItem scale = get_input_value("Scale");
NodeItem texcoord = create_node("position", "vector3", true);
NodeItem position = texcoord * scale;
```
|
|||||||
|
res.value = MaterialX::Value::createValue<int>(v);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NodeParser::get_input_default(socket);
|
||||||
|
}
|
||||||
|
|
||||||
NodeItem TexNoiseNodeParser::compute()
|
NodeItem TexNoiseNodeParser::compute()
|
||||||
{
|
{
|
||||||
NodeItem texcoord = create_node("position", "vector3", true);
|
NodeItem texcoord = create_node("position", "vector3", true);
|
||||||
|
Loading…
Reference in New Issue
Block a user
change create_node() signature accessory->noname = true