forked from blender/blender
Create parsing system that converts supported nodes and ignores unsupported #2
@ -73,7 +73,8 @@ void MaterialData::init()
|
||||
/* Create USD material. */
|
||||
pxr::UsdShadeMaterial usd_material;
|
||||
if (scene_delegate_->use_materialx) {
|
||||
MaterialX::DocumentPtr doc = blender::nodes::materialx::export_to_materialx(scene_delegate_->depsgraph, (Material *)id);
|
||||
MaterialX::DocumentPtr doc = blender::nodes::materialx::export_to_materialx(
|
||||
scene_delegate_->depsgraph, (Material *)id);
|
||||
pxr::UsdMtlxRead(doc, stage);
|
||||
if (pxr::UsdPrim materials = stage->GetPrimAtPath(pxr::SdfPath("/MaterialX/Materials"))) {
|
||||
pxr::UsdPrimSiblingRange children = materials.GetChildren();
|
||||
@ -87,7 +88,8 @@ void MaterialData::init()
|
||||
}
|
||||
|
||||
/* Convert USD material to Hydra material network map, adapted for render delegate. */
|
||||
const pxr::HdRenderDelegate *render_delegate = scene_delegate_->GetRenderIndex().GetRenderDelegate();
|
||||
const pxr::HdRenderDelegate *render_delegate =
|
||||
scene_delegate_->GetRenderIndex().GetRenderDelegate();
|
||||
const pxr::TfTokenVector contextVector = render_delegate->GetMaterialRenderContexts();
|
||||
pxr::TfTokenVector shaderSourceTypes = render_delegate->GetShaderSourceTypes();
|
||||
|
||||
|
@ -148,16 +148,16 @@ if(WITH_MATERIALX)
|
||||
list(APPEND LIB MaterialXFormat)
|
||||
list(APPEND SRC
|
||||
materialx/material.cc
|
||||
materialx/nodes/node.cc
|
||||
materialx/nodes/material_output.cc
|
||||
materialx/nodes/principled_bsdf.cc
|
||||
materialx/nodes/image.cc
|
||||
materialx/nodes/bsdf_principled.cc
|
||||
materialx/nodes/node_parser.cc
|
||||
materialx/nodes/output_material.cc
|
||||
materialx/nodes/tex_image.cc
|
||||
|
||||
materialx/material.h
|
||||
materialx/nodes/node.h
|
||||
materialx/nodes/material_output.h
|
||||
materialx/nodes/principled_bsdf.h
|
||||
materialx/nodes/image.h
|
||||
materialx/nodes/bsdf_principled.h
|
||||
materialx/nodes/node_parser.h
|
||||
materialx/nodes/output_material.h
|
||||
materialx/nodes/tex_image.h
|
||||
)
|
||||
endif()
|
||||
|
||||
|
@ -3,15 +3,9 @@
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "material.h"
|
||||
#include "nodes/material_output.h"
|
||||
#include "nodes/output_material.h"
|
||||
|
||||
#include <MaterialXCore/Node.h>
|
||||
#include <MaterialXFormat/XmlIo.h>
|
||||
|
||||
#include "BLI_fileops.h"
|
||||
#include "BLI_path_util.h"
|
||||
|
||||
#include "BKE_appdir.h"
|
||||
|
||||
#include "NOD_shader.h"
|
||||
|
||||
|
@ -2,10 +2,9 @@
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "principled_bsdf.h"
|
||||
#include "bsdf_principled.h"
|
||||
|
||||
#include <BKE_node_runtime.hh>
|
||||
#include "shader/materialx/nodes/node.h"
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
@ -13,7 +12,7 @@ MaterialXPrincipledBSDFNode::MaterialXPrincipledBSDFNode(MaterialX::DocumentPtr
|
||||
const Depsgraph *depsgraph,
|
||||
const Material *material,
|
||||
const bNode *node)
|
||||
: MaterialXNode(doc, depsgraph, material, node)
|
||||
: NodeParser(doc, depsgraph, material, node)
|
||||
{
|
||||
matx_node = doc->addNode(
|
||||
"standard_surface", MaterialX::createValidName(node->name), "surfaceshader");
|
||||
@ -30,11 +29,10 @@ MaterialX::NodePtr MaterialXPrincipledBSDFNode::convert()
|
||||
}
|
||||
else {
|
||||
const float *base_color = base_color_socket.default_value_typed<bNodeSocketValueRGBA>()->value;
|
||||
matx_node->addInput("base_color", "color3")->setValue(MaterialX::Color3(base_color[0], base_color[1], base_color[2]));
|
||||
matx_node->addInput("base_color", "color3")
|
||||
->setValue(MaterialX::Color3(base_color[0], base_color[1], base_color[2]));
|
||||
}
|
||||
|
||||
|
||||
|
||||
const float *base_color =
|
||||
node->input_by_identifier("Base Color").default_value_typed<bNodeSocketValueRGBA>()->value;
|
||||
const float subsurface =
|
@ -4,11 +4,11 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "node.h"
|
||||
#include "node_parser.h"
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
class MaterialXPrincipledBSDFNode : public MaterialXNode {
|
||||
class MaterialXPrincipledBSDFNode : public NodeParser {
|
||||
public:
|
||||
MaterialXPrincipledBSDFNode(MaterialX::DocumentPtr doc,
|
||||
const Depsgraph *depsgraph,
|
@ -2,14 +2,16 @@
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "node.h"
|
||||
#include "principled_bsdf.h"
|
||||
#include "image.h"
|
||||
#include "node_parser.h"
|
||||
|
||||
#include "bsdf_principled.h"
|
||||
#include "tex_image.h"
|
||||
|
||||
#include <BKE_node_runtime.hh>
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
MaterialXNode::MaterialXNode(MaterialX::DocumentPtr doc,
|
||||
NodeParser::NodeParser(MaterialX::DocumentPtr doc,
|
||||
const Depsgraph *depsgraph,
|
||||
const Material *material,
|
||||
const bNode *node)
|
||||
@ -17,7 +19,9 @@ MaterialXNode::MaterialXNode(MaterialX::DocumentPtr doc,
|
||||
{
|
||||
}
|
||||
|
||||
void MaterialXNode::get_input_link_node(const bNodeSocket *sock, MaterialX::NodePtr matx_node_to, const char *input)
|
||||
void NodeParser::get_input_link_node(const bNodeSocket *sock,
|
||||
MaterialX::NodePtr matx_node_to,
|
||||
const char *input)
|
||||
{
|
||||
const bNode *inode = sock->link->fromnode;
|
||||
if (inode->type == SH_NODE_BSDF_PRINCIPLED) {
|
||||
@ -35,7 +39,7 @@ void MaterialXNode::get_input_link_node(const bNodeSocket *sock, MaterialX::Node
|
||||
matx_node_to->addInput(input, get_mx_type(sock))->setNodeName(MaterialX::createValidName(inode->name));
|
||||
};
|
||||
|
||||
std::string MaterialXNode::get_mx_type(const bNodeSocket *sock)
|
||||
std::string NodeParser::get_mx_type(const bNodeSocket *sock)
|
||||
{
|
||||
std::string mx_sock_type;
|
||||
switch (sock->type) {
|
@ -12,7 +12,7 @@
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
class MaterialXNode {
|
||||
class NodeParser {
|
||||
public:
|
||||
const Depsgraph *depsgraph = nullptr;
|
||||
const Material *material = nullptr;
|
||||
@ -21,11 +21,11 @@ class MaterialXNode {
|
||||
MaterialX::DocumentPtr doc;
|
||||
|
||||
public:
|
||||
MaterialXNode(MaterialX::DocumentPtr doc,
|
||||
NodeParser(MaterialX::DocumentPtr doc,
|
||||
const Depsgraph *depsgraph,
|
||||
const Material *material,
|
||||
const bNode *node);
|
||||
virtual ~MaterialXNode() = default;
|
||||
virtual ~NodeParser() = default;
|
||||
|
||||
virtual MaterialX::NodePtr convert() = 0;
|
||||
|
@ -2,8 +2,7 @@
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "material_output.h"
|
||||
#include "principled_bsdf.h"
|
||||
#include "output_material.h"
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
@ -11,25 +10,13 @@ MaterialXMaterialOutputNode::MaterialXMaterialOutputNode(MaterialX::DocumentPtr
|
||||
const Depsgraph *depsgraph,
|
||||
const Material *material,
|
||||
const bNode *node)
|
||||
: MaterialXNode(doc, depsgraph, material, node)
|
||||
: NodeParser(doc, depsgraph, material, node)
|
||||
{
|
||||
matx_node = doc->addNode("surfacematerial", MaterialX::createValidName(node->name), "material");
|
||||
}
|
||||
|
||||
MaterialX::NodePtr MaterialXMaterialOutputNode::convert()
|
||||
{
|
||||
//LISTBASE_FOREACH (const bNodeSocket *, sock, &node->inputs) {
|
||||
// if (!sock->link) {
|
||||
// continue;
|
||||
// }
|
||||
// if (STREQ(sock->name, "Surface")) {
|
||||
// const bNode *inode = sock->link->fromnode;
|
||||
// MaterialXPrincipledBSDFNode surface_node(doc, material, inode);
|
||||
// surface_node.convert();
|
||||
// matx_node->addInput("surfaceshader", "surfaceshader")->setNodeName(inode->name);
|
||||
// }
|
||||
//}
|
||||
const char *matx_socket = "surfaceshader";
|
||||
{ const char *matx_socket = "surfaceshader";
|
||||
const bNodeSocket sock = node->input_by_identifier("Surface");
|
||||
get_input_link_node(&sock, matx_node, matx_socket);
|
||||
return matx_node;
|
@ -4,11 +4,11 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "node.h"
|
||||
#include "node_parser.h"
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
class MaterialXMaterialOutputNode : public MaterialXNode {
|
||||
class MaterialXMaterialOutputNode : public NodeParser {
|
||||
public:
|
||||
MaterialXMaterialOutputNode(MaterialX::DocumentPtr doc,
|
||||
const Depsgraph *depsgraph,
|
@ -2,8 +2,8 @@
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
|
||||
#include "node.h"
|
||||
#include "image.h"
|
||||
#include "tex_image.h"
|
||||
#include "node_parser.h"
|
||||
|
||||
#include "hydra/image.h"
|
||||
|
||||
@ -17,7 +17,7 @@ MaterialXTexImageNode::MaterialXTexImageNode(MaterialX::DocumentPtr doc,
|
||||
const Depsgraph *depsgraph,
|
||||
const Material *material,
|
||||
const bNode *node)
|
||||
: MaterialXNode(doc, depsgraph, material, node)
|
||||
: NodeParser(doc, depsgraph, material, node)
|
||||
{
|
||||
matx_node = doc->addNode("image", MaterialX::createValidName(node->name), "color3");
|
||||
}
|
@ -4,11 +4,11 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "node.h"
|
||||
#include "node_parser.h"
|
||||
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
class MaterialXTexImageNode : public MaterialXNode {
|
||||
class MaterialXTexImageNode : public NodeParser {
|
||||
protected:
|
||||
/* Following Cycles color for wrong Texture nodes. */
|
||||
static const MaterialX::Color3 texture_error_color_;
|
Loading…
Reference in New Issue
Block a user