[Bf-blender-cvs] [d9ca13066f6] universal-scene-description: USD import: fixed crash getting shader value.
Michael Kowalski
noreply at git.blender.org
Wed Dec 8 21:44:47 CET 2021
Commit: d9ca13066f646d670862e35c9109198ac5b3f29f
Author: Michael Kowalski
Date: Wed Dec 8 15:38:09 2021 -0500
Branches: universal-scene-description
https://developer.blender.org/rBd9ca13066f646d670862e35c9109198ac5b3f29f
USD import: fixed crash getting shader value.
Getting a value from an invalid shader input was causing
a crash in the UMM conversion invocation. I added validty
checks for the input attribute in several places to
avoid this. Also, minor formatting fix.
===================================================================
M source/blender/io/usd/intern/usd_umm.cc
===================================================================
diff --git a/source/blender/io/usd/intern/usd_umm.cc b/source/blender/io/usd/intern/usd_umm.cc
index 76e94366a5e..46ad064f1b9 100644
--- a/source/blender/io/usd/intern/usd_umm.cc
+++ b/source/blender/io/usd/intern/usd_umm.cc
@@ -384,7 +384,7 @@ static void test_python()
static PyObject *get_shader_source_data(const pxr::UsdShadeShader &usd_shader)
{
- if (!(usd_shader)) {
+ if (!usd_shader) {
return nullptr;
}
@@ -394,6 +394,10 @@ static PyObject *get_shader_source_data(const pxr::UsdShadeShader &usd_shader)
for (auto input : inputs) {
+ if (!input) {
+ continue;
+ }
+
PyObject *tup = nullptr;
std::string name = input.GetBaseName().GetString();
@@ -402,7 +406,7 @@ static PyObject *get_shader_source_data(const pxr::UsdShadeShader &usd_shader)
continue;
}
- pxr::UsdAttribute usd_attr = input.GetAttr();
+ pxr::UsdAttribute usd_attr;
bool have_connected_source = false;
@@ -417,9 +421,18 @@ static PyObject *get_shader_source_data(const pxr::UsdShadeShader &usd_shader)
}
else {
std::cerr << "ERROR: couldn't get connected source for usd shader input "
- << input.GetPrim().GetPath() << " " << input.GetFullName() << std::endl;
+ << input.GetPrim().GetPath() << " " << input.GetFullName() << std::endl;
}
}
+ else {
+ usd_attr = input.GetAttr();
+ }
+
+ if (!usd_attr) {
+ std::cerr << "ERROR: couldn't get attribute for usd shader input " << input.GetPrim().GetPath()
+ << " " << input.GetFullName() << std::endl;
+ continue;
+ }
pxr::VtValue val;
if (!usd_attr.Get(&val)) {
@@ -457,7 +470,9 @@ static PyObject *get_shader_source_data(const pxr::UsdShadeShader &usd_shader)
if (color_space_tok.IsEmpty() && have_connected_source) {
/* The connected asset input has no color space specified,
* so we also check the shader's asset input for this data. */
- color_space_tok = input.GetAttr().GetColorSpace();
+ if (pxr::UsdAttribute input_attr = input.GetAttr()) {
+ color_space_tok = input_attr.GetColorSpace();
+ }
}
std::string color_space_str = !color_space_tok.IsEmpty() ? color_space_tok.GetString() :
More information about the Bf-blender-cvs
mailing list