diff --git a/scripts/modules/bpy_hydra.py b/scripts/modules/bpy_hydra.py index 56fe6664f165..81111da06a96 100644 --- a/scripts/modules/bpy_hydra.py +++ b/scripts/modules/bpy_hydra.py @@ -6,11 +6,7 @@ __all__ = ( def export_mtlx(material): """ Exports material to .mtlx file. It is called from Blender source code. """ - try: - import materialx.utils as mx_utils - except ImportError: - print("ERROR: no MaterialX addon available") - return "" + import materialx.utils as mx_utils doc = mx_utils.export(material, None) if not doc: diff --git a/source/blender/io/usd/hydra/material.cc b/source/blender/io/usd/hydra/material.cc index e041ce6c9f88..455241a39c0c 100644 --- a/source/blender/io/usd/hydra/material.cc +++ b/source/blender/io/usd/hydra/material.cc @@ -113,9 +113,34 @@ pxr::HdCullStyle MaterialData::cull_style() const void MaterialData::export_mtlx() { - /* Call of python function hydra.export_mtlx() */ - PyGILState_STATE gstate; + + /* Checking materialx addon */ + static bool matx_addon_checked = false; + static bool has_matx_addon = false; + + if (!matx_addon_checked) { + gstate = PyGILState_Ensure(); + /* Adding second check into the lock, good practice to make this fully correct */ + if (!matx_addon_checked) { + PyObject *mx_module = PyImport_ImportModule("materialx"); + has_matx_addon = mx_module != nullptr; + Py_XDECREF(mx_module); + + if (!has_matx_addon) { + PyErr_Print(); + CLOG_WARN(LOG_HYDRA_SCENE, "No MaterialX addon, materials won't be exported."); + } + matx_addon_checked = true; + } + PyGILState_Release(gstate); + } + + if (!has_matx_addon) { + return; + } + + /* Call of python function bpy_hydra.export_mtlx() */ gstate = PyGILState_Ensure(); PyObject *module, *dict, *func, *result;