forked from blender/blender
Moved check of existing MaterialX addon from bpy_hydra.py to material.cc and log warning only once. #83
@ -6,11 +6,7 @@ __all__ = (
|
|||||||
|
|
||||||
def export_mtlx(material):
|
def export_mtlx(material):
|
||||||
""" Exports material to .mtlx file. It is called from Blender source code. """
|
""" Exports material to .mtlx file. It is called from Blender source code. """
|
||||||
try:
|
|
||||||
import materialx.utils as mx_utils
|
import materialx.utils as mx_utils
|
||||||
except ImportError:
|
|
||||||
print("ERROR: no MaterialX addon available")
|
|
||||||
return ""
|
|
||||||
|
|
||||||
doc = mx_utils.export(material, None)
|
doc = mx_utils.export(material, None)
|
||||||
if not doc:
|
if not doc:
|
||||||
|
@ -113,9 +113,34 @@ pxr::HdCullStyle MaterialData::cull_style() const
|
|||||||
|
|
||||||
void MaterialData::export_mtlx()
|
void MaterialData::export_mtlx()
|
||||||
{
|
{
|
||||||
/* Call of python function hydra.export_mtlx() */
|
|
||||||
|
|
||||||
PyGILState_STATE gstate;
|
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();
|
gstate = PyGILState_Ensure();
|
||||||
|
|
||||||
PyObject *module, *dict, *func, *result;
|
PyObject *module, *dict, *func, *result;
|
||||||
|
Loading…
Reference in New Issue
Block a user
Can you add another
if (!matx_addon_checked)
afterPyGILState_Ensure()
to make this into a double checked lock? Not that it's likely to be a problem, but it's good practice anyway to make this fully correct.