forked from blender/blender
Implement export of Shader BSDF nodes #13
@ -101,6 +101,7 @@ NodeItem NodeItem::operator+(const NodeItem &other) const
|
|||||||
{
|
{
|
||||||
Type type = this->type();
|
Type type = this->type();
|
||||||
if (ELEM(type, Type::BSDF, Type::EDF)) {
|
if (ELEM(type, Type::BSDF, Type::EDF)) {
|
||||||
|
/* Special case: add BSDF/EDF shaders */
|
||||||
NodeItem res = empty();
|
NodeItem res = empty();
|
||||||
if (other.type() == type) {
|
if (other.type() == type) {
|
||||||
res.node = graph_->addNode("add", MaterialX::EMPTY_STRING, this->type(type));
|
res.node = graph_->addNode("add", MaterialX::EMPTY_STRING, this->type(type));
|
||||||
@ -130,8 +131,10 @@ NodeItem NodeItem::operator*(const NodeItem &other) const
|
|||||||
{
|
{
|
||||||
Type type = this->type();
|
Type type = this->type();
|
||||||
if (ELEM(type, Type::BSDF, Type::EDF)) {
|
if (ELEM(type, Type::BSDF, Type::EDF)) {
|
||||||
|
/* Special case: multiple BSDF/EDF shader by Float or Color3 */
|
||||||
NodeItem res = empty();
|
NodeItem res = empty();
|
||||||
if (ELEM(other.type(), Type::Float, Type::Color3)) {
|
Type other_type = other.type();
|
||||||
|
if (ELEM(other_type, Type::Float, Type::Color3)) {
|
||||||
res.node = graph_->addNode("multiply", MaterialX::EMPTY_STRING, this->type(type));
|
res.node = graph_->addNode("multiply", MaterialX::EMPTY_STRING, this->type(type));
|
||||||
res.set_input("in1", *this);
|
res.set_input("in1", *this);
|
||||||
res.set_input("in2", other);
|
res.set_input("in2", other);
|
||||||
@ -178,7 +181,7 @@ bool NodeItem::operator==(const NodeItem &other) const
|
|||||||
|
|
||||||
NodeItem item1 = *this;
|
NodeItem item1 = *this;
|
||||||
NodeItem item2 = other;
|
NodeItem item2 = other;
|
||||||
Type to_type = adjust_types(item1, item2);
|
Type to_type = cast_types(item1, item2);
|
||||||
if (to_type == Type::Empty) {
|
if (to_type == Type::Empty) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -560,7 +563,7 @@ NodeItem NodeItem::if_else(CompareOp op,
|
|||||||
|
|
||||||
auto item1 = if_val;
|
auto item1 = if_val;
|
||||||
auto item2 = else_val;
|
auto item2 = else_val;
|
||||||
Type to_type = adjust_types(item1, item2);
|
Type to_type = cast_types(item1, item2);
|
||||||
if (to_type == Type::Empty) {
|
if (to_type == Type::Empty) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -671,7 +674,7 @@ bool NodeItem::is_arithmetic(Type type)
|
|||||||
return type >= Type::Float && type <= Type::Color4;
|
return type >= Type::Float && type <= Type::Color4;
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeItem::Type NodeItem::adjust_types(NodeItem &item1, NodeItem &item2)
|
NodeItem::Type NodeItem::cast_types(NodeItem &item1, NodeItem &item2)
|
||||||
{
|
{
|
||||||
Type t1 = item1.type();
|
Type t1 = item1.type();
|
||||||
Type t2 = item2.type();
|
Type t2 = item2.type();
|
||||||
@ -761,7 +764,7 @@ NodeItem NodeItem::arithmetic(const NodeItem &other,
|
|||||||
NodeItem res = empty();
|
NodeItem res = empty();
|
||||||
NodeItem item1 = *this;
|
NodeItem item1 = *this;
|
||||||
NodeItem item2 = other;
|
NodeItem item2 = other;
|
||||||
Type to_type = adjust_types(item1, item2);
|
Type to_type = cast_types(item1, item2);
|
||||||
if (to_type == Type::Empty) {
|
if (to_type == Type::Empty) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -11,22 +11,24 @@ namespace blender::nodes::materialx {
|
|||||||
class NodeItem {
|
class NodeItem {
|
||||||
public:
|
public:
|
||||||
enum class Type {
|
enum class Type {
|
||||||
Empty = 0,
|
Any = 0,
|
||||||
Any,
|
Empty,
|
||||||
|
|
||||||
/* Value types */
|
/* Value types */
|
||||||
String,
|
String,
|
||||||
Filename,
|
Filename,
|
||||||
Integer,
|
Integer,
|
||||||
|
/* Block of arithmetic types. Ordered by type cast */
|
||||||
Float,
|
Float,
|
||||||
Vector2,
|
Vector2,
|
||||||
Vector3,
|
Vector3,
|
||||||
Vector4,
|
|
||||||
Color3,
|
Color3,
|
||||||
|
Vector4,
|
||||||
Color4,
|
Color4,
|
||||||
|
/* End of arithmetic types */
|
||||||
|
|
||||||
/* Shader types
|
/* Shader types
|
||||||
* Note: There are only supported types */
|
* NOTE: There are only supported types */
|
||||||
BSDF,
|
BSDF,
|
||||||
EDF,
|
EDF,
|
||||||
SurfaceShader,
|
SurfaceShader,
|
||||||
@ -106,7 +108,7 @@ class NodeItem {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static bool is_arithmetic(Type type);
|
static bool is_arithmetic(Type type);
|
||||||
static Type adjust_types(NodeItem &item1, NodeItem &item2);
|
static Type cast_types(NodeItem &item1, NodeItem &item2);
|
||||||
|
|
||||||
bool is_arithmetic() const;
|
bool is_arithmetic() const;
|
||||||
NodeItem arithmetic(const std::string &category, std::function<float(float)> func) const;
|
NodeItem arithmetic(const std::string &category, std::function<float(float)> func) const;
|
||||||
|
@ -260,17 +260,17 @@ NodeItem ShaderNodeParser::get_input_shader(const bNodeSocket &socket, NodeItem:
|
|||||||
switch (from_node->typeinfo->type) {
|
switch (from_node->typeinfo->type) {
|
||||||
CASE_SHADER_NODE_TYPE(SH_NODE_ADD_SHADER, AddShaderNodeParser)
|
CASE_SHADER_NODE_TYPE(SH_NODE_ADD_SHADER, AddShaderNodeParser)
|
||||||
CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_DIFFUSE, BSDFDiffuseNodeParser)
|
CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_DIFFUSE, BSDFDiffuseNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_GLASS, BSDFGlassNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_GLASS, BSDFGlassNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_GLOSSY, BSDFGlossyNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_GLOSSY, BSDFGlossyNodeParser)
|
||||||
CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_PRINCIPLED, BSDFPrincipledNodeParser)
|
CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_PRINCIPLED, BSDFPrincipledNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_REFRACTION, BSDFRefractionNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_REFRACTION, BSDFRefractionNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_SHEEN, BSDFSheenNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_SHEEN, BSDFSheenNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_TOON, BSDFToonNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_TOON, BSDFToonNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_TRANSLUCENT, BSDFTranslucentNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_TRANSLUCENT, BSDFTranslucentNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_TRANSPARENT, BSDFTransparentNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_BSDF_TRANSPARENT, BSDFTransparentNodeParser)
|
||||||
CASE_SHADER_NODE_TYPE(SH_NODE_EMISSION, EmissionNodeParser)
|
CASE_SHADER_NODE_TYPE(SH_NODE_EMISSION, EmissionNodeParser)
|
||||||
CASE_SHADER_NODE_TYPE(SH_NODE_MIX_SHADER, MixShaderNodeParser)
|
CASE_SHADER_NODE_TYPE(SH_NODE_MIX_SHADER, MixShaderNodeParser)
|
||||||
//CASE_SHADER_NODE_TYPE(SH_NODE_SUBSURFACE_SCATTERING, SubsurfaceScatteringNodeParser)
|
// CASE_SHADER_NODE_TYPE(SH_NODE_SUBSURFACE_SCATTERING, SubsurfaceScatteringNodeParser)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CLOG_WARN(LOG_MATERIALX_SHADER,
|
CLOG_WARN(LOG_MATERIALX_SHADER,
|
||||||
|
Loading…
Reference in New Issue
Block a user