183 data.blender_offsets.reinitialize(usd_counts.
size() + 1);
184 data.usd_offsets.reinitialize(usd_counts.
size() + 1);
185 data.usd_knot_offsets.reinitialize(usd_counts.
size() + 1);
186 data.is_cyclic.reinitialize(usd_counts.
size());
191 for (
const int curve_i : usd_counts.
index_range()) {
192 const int points_num = usd_counts[curve_i];
193 const int knots_num = points_num + usd_orders[curve_i];
194 const int degree = usd_orders[curve_i] - 1;
197 if (knots_num < 4 || knots_num != usd_current_knots.
size()) {
198 data.is_cyclic[curve_i] =
false;
201 data.is_cyclic[curve_i] = usd_current_points.
take_front(degree) ==
205 int blender_count = usd_counts[curve_i];
209 if (
data.is_cyclic[curve_i]) {
210 blender_count -= degree;
213 data.blender_offsets[curve_i] = blender_count;
214 data.usd_offsets[curve_i] = points_num;
215 data.usd_knot_offsets[curve_i] = knots_num;
218 usd_remaining_points = usd_remaining_points.
drop_front(points_num);
219 usd_remaining_knots = usd_remaining_knots.
drop_front(knots_num);
267 if (!usd_data.
load(curve_prim_, time)) {
299 const bool can_read_primvars = std::all_of(
300 data.is_cyclic.begin(),
data.is_cyclic.end(), [](
bool item) { return item == false; });
304 for (
const int curve_i : blender_points_by_curve.
index_range()) {
305 const IndexRange blender_points_range = blender_points_by_curve[curve_i];
307 blender_points_range, usd_points_by_curve[curve_i]);
309 curves_positions.
slice(blender_points_range)
317 for (
const int curve_i : blender_points_by_curve.
index_range()) {
318 curves_nurbs_orders[curve_i] = int8_t(usd_orders[curve_i]);
322 for (
const int curve_i : blender_points_by_curve.
index_range()) {
323 const IndexRange usd_knots_range = usd_knots_by_curve[curve_i];
325 usd_knots.
slice(usd_knots_range), usd_orders[curve_i],
data.is_cyclic[curve_i]);
331 for (
const int curve_i : blender_points_by_curve.
index_range()) {
332 const IndexRange blender_points_range = blender_points_by_curve[curve_i];
334 blender_points_range, usd_points_by_curve[curve_i]);
336 const Span<double> usd_weights_de_dup = usd_weights.
slice(usd_points_range_de_dup);
338 for (
const int point_i : blender_points_range) {
339 curves_weights[point_i] =
float(usd_weights_de_dup[usd_point_i]);
351 for (
const int curve_i : blender_points_by_curve.
index_range()) {
352 const IndexRange blender_points_range = blender_points_by_curve[curve_i];
354 blender_points_range, usd_points_by_curve[curve_i]);
356 curves_velocity.
span.slice(blender_points_range)
357 .copy_from(usd_velocities.
slice(usd_points_range_de_dup));
374 if (blender_custom_knots.
is_empty()) {
380 const IndexRange blender_knots_range = blender_knots_by_curve[curve_i];
381 const IndexRange usd_knots_range = usd_knots_by_curve[curve_i];
385 for (
float &blender_knot : blender_knots) {
386 blender_knot = usd_knots_values[usd_knot_i] > 0.0 ?
float(usd_knots_values[usd_knot_i]) : 0;
396 const pxr::TfToken widths_interp = curve_prim_.GetWidthsInterpolation();
397 if (widths_interp == pxr::UsdGeomTokens->constant || usd_widths.
size() == 1) {
398 radii.
fill(usd_widths[0] / 2.0f);
400 else if (widths_interp == pxr::UsdGeomTokens->varying) {
401 int point_offset = 0;
403 const float usd_curve_radius = usd_widths[curve_i] / 2.0f;
405 if (curves_cyclic[curve_i]) {
409 radii[point_offset + point] = usd_curve_radius;
415 else if (widths_interp == pxr::UsdGeomTokens->vertex) {
417 const IndexRange blender_points_range = blender_points_by_curve[curve_i];
418 const IndexRange usd_points_range = usd_points_by_curve[curve_i];
422 blender_points_range.
size());
424 const Span<float> usd_widths_de_dup = usd_widths.
slice(usd_points_range_de_dup);
426 for (
const int point_i : blender_points_range) {
427 radii[point_i] = usd_widths_de_dup[usd_point_i] / 2.0f;
434 if (can_read_primvars) {