Create parsing system that converts supported nodes and ignores unsupported #2

Merged
Bogdan Nagirniak merged 14 commits from Vasyl-Pidhirskyi/blender:BLEN-500 into matx-export-material 2023-08-28 12:29:46 +02:00
4 changed files with 41 additions and 13 deletions
Showing only changes of commit 3808bcb212 - Show all commits

View File

@ -205,6 +205,11 @@ if(WITH_OPENVDB)
) )
endif() endif()
if(WITH_MATERIALX)
list(APPEND LIB MaterialXCore)
list(APPEND LIB MaterialXFormat)
endif()
blender_add_lib(bf_usd "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") blender_add_lib(bf_usd "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
# RNA_prototypes.h # RNA_prototypes.h

View File

@ -12,6 +12,9 @@
#include <pxr/imaging/hd/tokens.h> #include <pxr/imaging/hd/tokens.h>
#include <pxr/usdImaging/usdImaging/materialParamUtils.h> #include <pxr/usdImaging/usdImaging/materialParamUtils.h>
#include <pxr/usd/usdMtlx/reader.h>
#include <pxr/usd/usdMtlx/utils.h>
#include "MEM_guardedalloc.h" #include "MEM_guardedalloc.h"
#include "BKE_lib_id.h" #include "BKE_lib_id.h"
@ -30,6 +33,7 @@
#include "intern/usd_exporter_context.h" #include "intern/usd_exporter_context.h"
#include "intern/usd_writer_material.h" #include "intern/usd_writer_material.h"
#include "shader/materialx/material.h"
namespace blender::io::hydra { namespace blender::io::hydra {
@ -68,25 +72,33 @@ void MaterialData::init()
image_cache_file_path()}; image_cache_file_path()};
/* Create USD material. */ /* Create USD material. */
pxr::UsdShadeMaterial usd_material = usd::create_usd_material( //pxr::UsdShadeMaterial usd_material = usd::create_usd_material(export_context, material_path, (Material *)id, "st");
export_context, material_path, (Material *)id, "st");
/* Convert USD material to Hydra material network map, adapted for render delegate. */ /* Convert USD material to Hydra material network map, adapted for render delegate. */
const pxr::HdRenderDelegate *render_delegate = const pxr::HdRenderDelegate *render_delegate = scene_delegate_->GetRenderIndex().GetRenderDelegate();
scene_delegate_->GetRenderIndex().GetRenderDelegate();
const pxr::TfTokenVector contextVector = render_delegate->GetMaterialRenderContexts(); const pxr::TfTokenVector contextVector = render_delegate->GetMaterialRenderContexts();
pxr::TfTokenVector shaderSourceTypes = render_delegate->GetShaderSourceTypes(); pxr::TfTokenVector shaderSourceTypes = render_delegate->GetShaderSourceTypes();
pxr::HdMaterialNetworkMap network_map; pxr::HdMaterialNetworkMap network_map;
if (pxr::UsdShadeShader surface = usd_material.ComputeSurfaceSource(contextVector)) { MaterialX::DocumentPtr doc = blender::nodes::materialx::export_to_materialx((Material *)id);
pxr::UsdImagingBuildHdMaterialNetworkFromTerminal(surface.GetPrim(), pxr::UsdMtlxRead(doc, stage);
if (pxr::UsdPrim materials = stage->GetPrimAtPath(pxr::SdfPath("/MaterialX/Materials"))) {
if (pxr::UsdPrimSiblingRange children = materials.GetChildren()) {
if (auto usd_material = pxr::UsdShadeMaterial(*children.begin())) {
if (pxr::UsdShadeShader mtlx_surface = usd_material.ComputeSurfaceSource(contextVector))
{
UsdImagingBuildHdMaterialNetworkFromTerminal(mtlx_surface.GetPrim(),
pxr::HdMaterialTerminalTokens->surface, pxr::HdMaterialTerminalTokens->surface,
shaderSourceTypes, shaderSourceTypes,
contextVector, contextVector,
&network_map, &network_map,
time); time);
} }
}
}
}
material_network_map_ = pxr::VtValue(network_map); material_network_map_ = pxr::VtValue(network_map);
} }

View File

@ -5,6 +5,7 @@
#include "material.h" #include "material.h"
#include <MaterialXCore/Node.h> #include <MaterialXCore/Node.h>
#include <MaterialXFormat/XmlIo.h>
namespace blender::nodes::materialx { namespace blender::nodes::materialx {
@ -17,20 +18,28 @@ static void create_standard_surface(MaterialX::DocumentPtr doc, Material *materi
standard_surface->addInput("base", "float")->setValue(1.0); standard_surface->addInput("base", "float")->setValue(1.0);
standard_surface->addInput("base_color", "color3") standard_surface->addInput("base_color", "color3")
->setValue(MaterialX::Color3(material->r, material->g, material->a)); ->setValue(MaterialX::Color3(material->r, material->g, material->b));
surfacematerial->addInput(standard_surface->getType(), standard_surface->getType()) surfacematerial->addInput(standard_surface->getType(), standard_surface->getType())
->setNodeName(standard_surface->getName()); ->setNodeName(standard_surface->getName());
} }
static void export_nodegraph(MaterialX::DocumentPtr doc, Material *material)
{
;
}
MaterialX::DocumentPtr export_to_materialx(Material* material) { MaterialX::DocumentPtr export_to_materialx(Material* material) {
MaterialX::DocumentPtr doc = MaterialX::createDocument(); MaterialX::DocumentPtr doc = MaterialX::createDocument();
if (material->use_nodes) { if (material->use_nodes) {
; export_nodegraph(doc, material);
} }
else { else {
create_standard_surface(doc, material); create_standard_surface(doc, material);
} }
MaterialX::writeToXmlFile(
doc,
MaterialX::FilePath("c:/Users/Vasyl_Pidhirskyi/Work/AMD/blender-git/tmp/material.mtlx"));
return doc; return doc;
} }

View File

@ -11,6 +11,8 @@
namespace blender::nodes::materialx { namespace blender::nodes::materialx {
MaterialX::DocumentPtr export_to_materialx(Material *material); MaterialX::DocumentPtr export_to_materialx(Material *material);
static void create_standard_surface(MaterialX::DocumentPtr doc, Material *material);
static void export_nodegraph(MaterialX::DocumentPtr doc, Material *material);
} // namespace blender::materialx } // namespace blender::materialx