Commit: 1c42e28727fb2ce99561c3663c9a22e63a771ec4 Author: makowalski Date: Tue Jul 27 12:40:08 2021 -0400 Branches: usd-importer-T81257-merge https://developer.blender.org/rB1c42e28727fb2ce99561c3663c9a22e63a771ec4
USD import: validate light attributes Added checks to validate light attributes and values, to help avoid errors when reading light settings which might not have been authored. =================================================================== M source/blender/io/usd/intern/usd_reader_light.cc =================================================================== diff --git a/source/blender/io/usd/intern/usd_reader_light.cc b/source/blender/io/usd/intern/usd_reader_light.cc index 1812a1c229c..f62576fcc81 100644 --- a/source/blender/io/usd/intern/usd_reader_light.cc +++ b/source/blender/io/usd/intern/usd_reader_light.cc @@ -46,13 +46,21 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime { Light *blight = (Light *)object_->data; + if (blight == nullptr) { + return; + } + + if (!prim_) { + return; + } + pxr::UsdLuxLight light_prim(prim_); if (!light_prim) { return; } - pxr::UsdLuxShapingAPI shapingAPI(light_prim); + pxr::UsdLuxShapingAPI shaping_api(light_prim); /* Set light type. */ @@ -68,7 +76,7 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime else if (prim_.IsA<pxr::UsdLuxSphereLight>()) { blight->type = LA_LOCAL; - if (shapingAPI.GetShapingConeAngleAttr().IsAuthored()) { + if (shaping_api && shaping_api.GetShapingConeAngleAttr().IsAuthored()) { blight->type = LA_SPOT; } } @@ -78,10 +86,12 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime /* Set light values. */ - pxr::VtValue intensity; - light_prim.GetIntensityAttr().Get(&intensity, motionSampleTime); - - blight->energy = intensity.Get<float>() * this->import_params_.light_intensity_scale; + if (pxr::UsdAttribute intensity_attr = light_prim.GetIntensityAttr()) { + float intensity = 0.0f; + if (intensity_attr.Get(&intensity, motionSampleTime)) { + blight->energy = intensity * this->import_params_.light_intensity_scale; + } + } /* TODO(makowalsk): Not currently supported. */ #if 0 @@ -95,17 +105,21 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime light_prim.GetDiffuseAttr().Get(&diffuse, motionSampleTime); #endif - pxr::VtValue specular; - light_prim.GetSpecularAttr().Get(&specular, motionSampleTime); - blight->spec_fac = specular.Get<float>(); + if (pxr::UsdAttribute spec_attr = light_prim.GetSpecularAttr()) { + float spec = 0.0f; + if (spec_attr.Get(&spec, motionSampleTime)) { + blight->spec_fac = spec; + } + } - pxr::VtValue color; - light_prim.GetColorAttr().Get(&color, motionSampleTime); - /* Calling UncheckedGet() to silence compiler warning. */ - pxr::GfVec3f color_vec = color.UncheckedGet<pxr::GfVec3f>(); - blight->r = color_vec[0]; - blight->g = color_vec[1]; - blight->b = color_vec[2]; + if (pxr::UsdAttribute color_attr = light_prim.GetColorAttr()) { + pxr::GfVec3f color; + if (color_attr.Get(&color, motionSampleTime)) { + blight->r = color[0]; + blight->g = color[1]; + blight->b = color[2]; + } + } /* TODO(makowalski): Not currently supported. */ #if 0 @@ -125,23 +139,38 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime pxr::UsdLuxRectLight rect_light(prim_); - pxr::VtValue width; - rect_light.GetWidthAttr().Get(&width, motionSampleTime); - - pxr::VtValue height; - rect_light.GetHeightAttr().Get(&height, motionSampleTime); - - blight->area_size = width.Get<float>(); - blight->area_sizey = height.Get<float>(); + if (!rect_light) { + break; + } + + if (pxr::UsdAttribute width_attr = rect_light.GetWidthAttr()) { + float width = 0.0f; + if (width_attr.Get(&width, motionSampleTime)) { + blight->area_size = width; + } + } + + if (pxr::UsdAttribute height_attr = rect_light.GetHeightAttr()) { + float height = 0.0f; + if (height_attr.Get(&height, motionSampleTime)) { + blight->area_sizey = height; + } + } } else if (blight->area_shape == LA_AREA_DISK && prim_.IsA<pxr::UsdLuxDiskLight>()) { pxr::UsdLuxDiskLight disk_light(prim_); - pxr::VtValue radius; - disk_light.GetRadiusAttr().Get(&radius, motionSampleTime); + if (!disk_light) { + break; + } - blight->area_size = radius.Get<float>() * 2.0f; + if (pxr::UsdAttribute radius_attr = disk_light.GetRadiusAttr()) { + float radius = 0.0f; + if (radius_attr.Get(&radius, motionSampleTime)) { + blight->area_size = radius * 2.0f; + } + } } break; case LA_LOCAL: @@ -149,10 +178,16 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime pxr::UsdLuxSphereLight sphere_light(prim_); - pxr::VtValue radius; - sphere_light.GetRadiusAttr().Get(&radius, motionSampleTime); + if (!sphere_light) { + break; + } - blight->area_size = radius.Get<float>(); + if (pxr::UsdAttribute radius_attr = sphere_light.GetRadiusAttr()) { + float radius = 0.0f; + if (radius_attr.Get(&radius, motionSampleTime)) { + blight->area_size = radius; + } + } } break; case LA_SPOT: @@ -160,27 +195,50 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime pxr::UsdLuxSphereLight sphere_light(prim_); - pxr::VtValue radius; - sphere_light.GetRadiusAttr().Get(&radius, motionSampleTime); - - blight->area_size = radius.Get<float>(); - - pxr::VtValue coneAngle; - shapingAPI.GetShapingConeAngleAttr().Get(&coneAngle, motionSampleTime); - blight->spotsize = coneAngle.Get<float>() * ((float)M_PI / 180.0f) * 2.0f; - - pxr::VtValue spotBlend; - shapingAPI.GetShapingConeSoftnessAttr().Get(&spotBlend, motionSampleTime); - blight->spotblend = spotBlend.Get<float>(); + if (!sphere_light) { + break; + } + + if (pxr::UsdAttribute radius_attr = sphere_light.GetRadiusAttr()) { + float radius = 0.0f; + if (radius_attr.Get(&radius, motionSampleTime)) { + blight->area_size = radius; + } + } + + if (!shaping_api) { + break; + } + + if (pxr::UsdAttribute cone_angle_attr = shaping_api.GetShapingConeAngleAttr()) { + float cone_angle = 0.0f; + if (cone_angle_attr.Get(&cone_angle, motionSampleTime)) { + blight->spotsize = cone_angle * ((float)M_PI / 180.0f) * 2.0f; + } + } + + if (pxr::UsdAttribute cone_softness_attr = shaping_api.GetShapingConeSoftnessAttr()) { + float cone_softness = 0.0f; + if (cone_softness_attr.Get(&cone_softness, motionSampleTime)) { + blight->spotblend = cone_softness; + } + } } break; case LA_SUN: if (prim_.IsA<pxr::UsdLuxDistantLight>()) { pxr::UsdLuxDistantLight distant_light(prim_); - pxr::VtValue angle; - distant_light.GetAngleAttr().Get(&angle, motionSampleTime); - blight->sun_angle = angle.Get<float>(); + if (!distant_light) { + break; + } + + if (pxr::UsdAttribute angle_attr = distant_light.GetAngleAttr()) { + float angle = 0.0f; + if (angle_attr.Get(&angle, motionSampleTime)) { + blight->sun_angle = angle; + } + } } break; } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs