forked from blender/blender
Move the MaterialX export code into the existing shader node files #18
@ -15,7 +15,42 @@
|
|||||||
|
|
||||||
namespace blender::nodes::materialx {
|
namespace blender::nodes::materialx {
|
||||||
|
|
||||||
CLG_LOGREF_DECLARE_GLOBAL(LOG_MATERIALX_SHADER, "materialx.shader");
|
class DefaultMaterialNodeParser : public NodeParser {
|
||||||
|
public:
|
||||||
|
using NodeParser::NodeParser;
|
||||||
|
|
||||||
|
NodeItem compute() override
|
||||||
|
{
|
||||||
|
NodeItem surface = create_node("standard_surface", NodeItem::Type::SurfaceShader);
|
||||||
|
surface.set_input("base_color",
|
||||||
|
val(MaterialX::Color3(material_->r, material_->g, material_->b)));
|
||||||
|
surface.set_input("diffuse_roughness", val(material_->roughness));
|
||||||
|
if (material_->metallic > 0.0f) {
|
||||||
|
surface.set_input("metalness", val(material_->metallic));
|
||||||
|
}
|
||||||
|
if (material_->spec) {
|
||||||
|
surface.set_input("specular", val(material_->spec));
|
||||||
|
surface.set_input("specular_color", val(material_->spec));
|
||||||
|
surface.set_input("specular_roughness", val(material_->roughness));
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeItem res = create_node("surfacematerial", NodeItem::Type::Material);
|
||||||
|
res.node->setName("Material_Default");
|
||||||
|
res.set_input("surfaceshader", surface);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
NodeItem compute_error()
|
||||||
|
{
|
||||||
|
NodeItem 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.node->setName("Material_Error");
|
||||||
|
res.set_input("surfaceshader", surface);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
MaterialX::DocumentPtr export_to_materialx(Depsgraph *depsgraph, Material *material)
|
MaterialX::DocumentPtr export_to_materialx(Depsgraph *depsgraph, Material *material)
|
||||||
{
|
{
|
||||||
@ -25,10 +60,21 @@ MaterialX::DocumentPtr export_to_materialx(Depsgraph *depsgraph, Material *mater
|
|||||||
if (material->use_nodes) {
|
if (material->use_nodes) {
|
||||||
material->nodetree->ensure_topology_cache();
|
material->nodetree->ensure_topology_cache();
|
||||||
bNode *output_node = ntreeShaderOutputNode(material->nodetree, SHD_OUTPUT_ALL);
|
bNode *output_node = ntreeShaderOutputNode(material->nodetree, SHD_OUTPUT_ALL);
|
||||||
OutputMaterialNodeParser(doc.get(), depsgraph, material, output_node).compute_full();
|
if (output_node) {
|
||||||
|
NodeParserData data = {
|
||||||
|
doc.get(), depsgraph, material, NodeItem::Type::Material, NodeItem(doc.get())};
|
||||||
|
output_node->typeinfo->materialx_fn(&data, output_node, nullptr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DefaultMaterialNodeParser(
|
||||||
|
doc.get(), depsgraph, material, nullptr, nullptr, NodeItem::Type::Material)
|
||||||
|
.compute_error();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
OutputMaterialNodeParser(doc.get(), depsgraph, material, nullptr).compute_default();
|
DefaultMaterialNodeParser(
|
||||||
|
doc.get(), depsgraph, material, nullptr, nullptr, NodeItem::Type::Material)
|
||||||
|
.compute();
|
||||||
}
|
}
|
||||||
|
|
||||||
CLOG_INFO(LOG_MATERIALX_SHADER,
|
CLOG_INFO(LOG_MATERIALX_SHADER,
|
||||||
|
@ -11,6 +11,8 @@ namespace blender::nodes::materialx {
|
|||||||
|
|
||||||
static const std::string TEXCOORD_NODE_NAME = "node_texcoord";
|
static const std::string TEXCOORD_NODE_NAME = "node_texcoord";
|
||||||
|
|
||||||
|
CLG_LOGREF_DECLARE_GLOBAL(LOG_MATERIALX_SHADER, "materialx.shader");
|
||||||
|
|
||||||
NodeParser::NodeParser(MaterialX::GraphElement *graph,
|
NodeParser::NodeParser(MaterialX::GraphElement *graph,
|
||||||
const Depsgraph *depsgraph,
|
const Depsgraph *depsgraph,
|
||||||
const Material *material,
|
const Material *material,
|
||||||
|
Loading…
Reference in New Issue
Block a user