forked from blender/blender
Create parsing system that converts supported nodes and ignores unsupported #2
@ -205,6 +205,11 @@ if(WITH_OPENVDB)
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_MATERIALX)
|
||||
list(APPEND LIB MaterialXCore)
|
||||
list(APPEND LIB MaterialXFormat)
|
||||
endif()
|
||||
|
||||
blender_add_lib(bf_usd "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
|
||||
|
||||
# RNA_prototypes.h
|
||||
|
@ -12,6 +12,9 @@
|
||||
#include <pxr/imaging/hd/tokens.h>
|
||||
#include <pxr/usdImaging/usdImaging/materialParamUtils.h>
|
||||
|
||||
#include <pxr/usd/usdMtlx/reader.h>
|
||||
#include <pxr/usd/usdMtlx/utils.h>
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BKE_lib_id.h"
|
||||
@ -30,6 +33,7 @@
|
||||
|
||||
#include "intern/usd_exporter_context.h"
|
||||
#include "intern/usd_writer_material.h"
|
||||
#include "shader/materialx/material.h"
|
||||
|
||||
namespace blender::io::hydra {
|
||||
|
||||
@ -68,24 +72,32 @@ void MaterialData::init()
|
||||
image_cache_file_path()};
|
||||
|
||||
/* Create USD material. */
|
||||
pxr::UsdShadeMaterial usd_material = usd::create_usd_material(
|
||||
export_context, material_path, (Material *)id, "st");
|
||||
//pxr::UsdShadeMaterial usd_material = usd::create_usd_material(export_context, material_path, (Material *)id, "st");
|
||||
|
||||
/* 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();
|
||||
|
||||
pxr::HdMaterialNetworkMap network_map;
|
||||
|
||||
if (pxr::UsdShadeShader surface = usd_material.ComputeSurfaceSource(contextVector)) {
|
||||
pxr::UsdImagingBuildHdMaterialNetworkFromTerminal(surface.GetPrim(),
|
||||
pxr::HdMaterialTerminalTokens->surface,
|
||||
shaderSourceTypes,
|
||||
contextVector,
|
||||
&network_map,
|
||||
time);
|
||||
MaterialX::DocumentPtr doc = blender::nodes::materialx::export_to_materialx((Material *)id);
|
||||
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,
|
||||
shaderSourceTypes,
|
||||
contextVector,
|
||||
&network_map,
|
||||
time);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
material_network_map_ = pxr::VtValue(network_map);
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include "material.h"
|
||||
|
||||
#include <MaterialXCore/Node.h>
|
||||
#include <MaterialXFormat/XmlIo.h>
|
||||
|
||||
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_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())
|
||||
->setNodeName(standard_surface->getName());
|
||||
}
|
||||
|
||||
static void export_nodegraph(MaterialX::DocumentPtr doc, Material *material)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
MaterialX::DocumentPtr export_to_materialx(Material* material) {
|
||||
MaterialX::DocumentPtr doc = MaterialX::createDocument();
|
||||
if (material->use_nodes) {
|
||||
;
|
||||
export_nodegraph(doc, material);
|
||||
}
|
||||
else {
|
||||
create_standard_surface(doc, material);
|
||||
}
|
||||
MaterialX::writeToXmlFile(
|
||||
doc,
|
||||
MaterialX::FilePath("c:/Users/Vasyl_Pidhirskyi/Work/AMD/blender-git/tmp/material.mtlx"));
|
||||
return doc;
|
||||
}
|
||||
|
||||
|
@ -11,6 +11,8 @@
|
||||
namespace blender::nodes::materialx {
|
||||
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user