153void USDCurvesReader::read_curve_sample(
Curves *curves_id,
const double motionSampleTime)
155 curve_prim_ = pxr::UsdGeomBasisCurves(prim_);
160 pxr::UsdAttribute widthsAttr = curve_prim_.GetWidthsAttr();
161 pxr::UsdAttribute vertexAttr = curve_prim_.GetCurveVertexCountsAttr();
162 pxr::UsdAttribute pointsAttr = curve_prim_.GetPointsAttr();
164 pxr::VtIntArray usdCounts;
165 vertexAttr.Get(&usdCounts, motionSampleTime);
167 pxr::VtVec3fArray usdPoints;
168 pointsAttr.Get(&usdPoints, motionSampleTime);
170 pxr::VtFloatArray usdWidths;
171 widthsAttr.Get(&usdWidths, motionSampleTime);
173 pxr::UsdAttribute basisAttr = curve_prim_.GetBasisAttr();
175 basisAttr.Get(&basis, motionSampleTime);
177 pxr::UsdAttribute typeAttr = curve_prim_.GetTypeAttr();
179 typeAttr.Get(&type, motionSampleTime);
181 pxr::UsdAttribute wrapAttr = curve_prim_.GetWrapAttr();
183 wrapAttr.Get(&
wrap, motionSampleTime);
187 const int curves_num = usdCounts.size();
192 curves.resize(new_offsets.
last(), curves_num);
195 curves.offsets_for_write().copy_from(new_offsets);
197 curves.fill_curve_types(curve_type);
200 curves.cyclic_for_write().fill(
true);
204 const int8_t curve_order = type == pxr::UsdGeomTokens->cubic ? 4 : 2;
205 curves.nurbs_orders_for_write().fill(curve_order);
211 if (type == pxr::UsdGeomTokens->cubic && basis == pxr::UsdGeomTokens->bezier) {
219 int usd_point_offset = 0;
220 int point_offset = 0;
221 for (
const int i : curves.curves_range()) {
222 const int usd_point_count = usdCounts[i];
232 points.
slice(usd_point_offset, usd_point_count));
237 usd_point_offset += usd_point_count;
241 static_assert(
sizeof(pxr::GfVec3f) ==
sizeof(
float3));
242 positions.copy_from(
Span(usdPoints.data(), usdPoints.size()).cast<float3>());
245 if (!usdWidths.empty()) {
248 "radius", bke::AttrDomain::Point);
250 pxr::TfToken widths_interp = curve_prim_.GetWidthsInterpolation();
251 if (widths_interp == pxr::UsdGeomTokens->constant) {
252 radii.
span.fill(usdWidths[0] / 2.0f);
255 const bool is_bezier_vertex_interp = (type == pxr::UsdGeomTokens->cubic &&
256 basis == pxr::UsdGeomTokens->bezier &&
257 widths_interp == pxr::UsdGeomTokens->vertex);
258 if (is_bezier_vertex_interp) {
261 int usd_point_offset = 0;
262 int point_offset = 0;
263 for (
const int i : curves.curves_range()) {
264 const int usd_point_count = usdCounts[i];
269 radii.span[point_offset + cp] = usdWidths[usd_point_offset + cp_offset] / 2.0f;
274 usd_point_offset += usd_point_count;
278 for (
const int i_point : curves.points_range()) {
279 radii.span[i_point] = usdWidths[i_point] / 2.0f;
287 read_custom_data(curves, motionSampleTime);
291 const double motionSampleTime)
const
293 pxr::UsdGeomPrimvarsAPI pv_api(curve_prim_);
295 std::vector<pxr::UsdGeomPrimvar> primvars = pv_api.GetPrimvarsWithValues();
296 for (
const pxr::UsdGeomPrimvar &pv : primvars) {
297 if (!pv.HasValue()) {
301 const pxr::SdfValueTypeName pv_type = pv.GetTypeName();
302 const pxr::TfToken pv_interp = pv.GetInterpolation();
307 if (!domain.has_value() || !type.has_value()) {
308 const pxr::TfToken pv_name = pxr::UsdGeomPrimvar::StripPrimvarsName(pv.GetPrimvarName());
311 "Primvar '%s' (interpolation %s, type %s) cannot be converted to Blender",
314 pv_type.GetAsToken().GetText());