forked from blender/blender
Move the MaterialX export code into the existing shader node files #18
@ -15,7 +15,42 @@
|
||||
|
||||
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)
|
||||
{
|
||||
@ -25,10 +60,21 @@ MaterialX::DocumentPtr export_to_materialx(Depsgraph *depsgraph, Material *mater
|
||||
if (material->use_nodes) {
|
||||
material->nodetree->ensure_topology_cache();
|
||||
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 {
|
||||
OutputMaterialNodeParser(doc.get(), depsgraph, material, nullptr).compute_default();
|
||||
DefaultMaterialNodeParser(
|
||||
doc.get(), depsgraph, material, nullptr, nullptr, NodeItem::Type::Material)
|
||||
.compute();
|
||||
}
|
||||
|
||||
CLOG_INFO(LOG_MATERIALX_SHADER,
|
||||
|
@ -11,6 +11,8 @@ namespace blender::nodes::materialx {
|
||||
|
||||
static const std::string TEXCOORD_NODE_NAME = "node_texcoord";
|
||||
|
||||
CLG_LOGREF_DECLARE_GLOBAL(LOG_MATERIALX_SHADER, "materialx.shader");
|
||||
|
||||
NodeParser::NodeParser(MaterialX::GraphElement *graph,
|
||||
const Depsgraph *depsgraph,
|
||||
const Material *material,
|
||||
|
Loading…
Reference in New Issue
Block a user