Blender V5.0
blender::bke::curves::nurbs Namespace Reference

Classes

struct  BasisCache

Functions

bool check_valid_eval_params (int points_num, int8_t order, bool cyclic, KnotsMode knots_mode, int resolution)
int calculate_evaluated_num (int points_num, int8_t order, bool cyclic, int resolution, KnotsMode knots_mode, Span< float > knots)
int knots_num (int points_num, int8_t order, bool cyclic)
int control_points_num (int num_control_points, int8_t order, bool cyclic)
void load_curve_knots (KnotsMode mode, int points_num, int8_t order, bool cyclic, IndexRange curve_knots, Span< float > custom_knots, MutableSpan< float > knots)
void calculate_knots (int points_num, KnotsMode mode, int8_t order, bool cyclic, MutableSpan< float > knots)
Vector< int > calculate_multiplicity_sequence (Span< float > knots)
void calculate_basis_cache (int points_num, int evaluated_num, int8_t order, int resolution, bool cyclic, KnotsMode knots_mode, Span< float > knots, BasisCache &basis_cache)
void interpolate_to_evaluated (const BasisCache &basis_cache, int8_t order, Span< float > control_weights, GSpan src, GMutableSpan dst)
void gather_custom_knots (const bke::CurvesGeometry &src, const IndexMask &src_curves, int dst_curve_offset, bke::CurvesGeometry &dst)
void update_custom_knot_modes (const IndexMask &mask, const KnotsMode mode_for_regular, const KnotsMode mode_for_cyclic, bke::CurvesGeometry &curves)
void copy_custom_knots (const bke::CurvesGeometry &src_curves, const IndexMask &exclude_curves, bke::CurvesGeometry &dst_curves)
static int calc_nonzero_knot_spans (const int points_num, const KnotsMode mode, const int8_t order, const bool cyclic)
static bool is_breakpoint (const Span< float > knots, const int knot_span)
static int count_nonzero_knot_spans (const int points_num, const int order, const bool cyclic, const Span< float > knots)
static void copy_custom_knots (const int8_t order, const bool cyclic, const Span< float > custom_knots, MutableSpan< float > knots)
static void calculate_basis_for_point (const Span< float > knots, const int degree, const float parameter, const int span_index, MutableSpan< float > r_weights, int &r_start_index)
template<typename T>
static void interpolate_to_evaluated (const BasisCache &basis_cache, const int8_t order, const Span< T > src, MutableSpan< T > dst)
template<typename T>
static void interpolate_to_evaluated_rational (const BasisCache &basis_cache, const int8_t order, const Span< float > control_weights, const Span< T > src, MutableSpan< T > dst)

Function Documentation

◆ calc_nonzero_knot_spans()

int blender::bke::curves::nurbs::calc_nonzero_knot_spans ( const int points_num,
const KnotsMode mode,
const int8_t order,
const bool cyclic )
static

◆ calculate_basis_cache()

void blender::bke::curves::nurbs::calculate_basis_cache ( int points_num,
int evaluated_num,
int8_t order,
int resolution,
bool cyclic,
KnotsMode knots_mode,
Span< float > knots,
BasisCache & basis_cache )

Based on the knots, the order, and other properties of a NURBS curve, calculate a cache that can be used to more simply interpolate attributes to the evaluated points later. The cache includes two pieces of information for every evaluated point: the first control point that influences it, and a weight for each control point.

Definition at line 232 of file curve_nurbs.cc.

References BLI_assert, check_valid_eval_params(), control_points_num(), blender::IndexRange::from_begin_end(), blender::Array< T, InlineBufferCapacity, Allocator >::index_range(), is_breakpoint(), blender::threading::parallel_for(), blender::Vector< T, InlineBufferCapacity, Allocator >::resize(), Vector< T, InlineBufferCapacity, Allocator >::resize(), blender::bke::curves::nurbs::BasisCache::start_indices, and blender::bke::curves::nurbs::BasisCache::weights.

Referenced by blender::bke::tests::TEST(), and blender::bke::tests::TEST().

◆ calculate_basis_for_point()

void blender::bke::curves::nurbs::calculate_basis_for_point ( const Span< float > knots,
const int degree,
const float parameter,
const int span_index,
MutableSpan< float > r_weights,
int & r_start_index )
static

Definition at line 200 of file curve_nurbs.cc.

References BLI_assert, left, and blender::Span< T >::size().

◆ calculate_evaluated_num()

int blender::bke::curves::nurbs::calculate_evaluated_num ( int points_num,
int8_t order,
bool cyclic,
int resolution,
KnotsMode knots_mode,
Span< float > knots )

Calculate the standard evaluated size for a NURBS curve, using the standard that the resolution is multiplied by the number of segments between the control points.

Note
Though the number of evaluated points is rather arbitrary, it's useful to have a standard for predictability and so that cached basis weights of NURBS curves with these properties can be shared.

Definition at line 83 of file curve_nurbs.cc.

References calc_nonzero_knot_spans(), check_valid_eval_params(), count_nonzero_knot_spans(), and blender::Span< T >::is_empty().

Referenced by blender::bke::calculate_evaluated_offsets(), blender::bke::tests::TEST(), and blender::bke::tests::TEST().

◆ calculate_knots()

void blender::bke::curves::nurbs::calculate_knots ( int points_num,
KnotsMode mode,
int8_t order,
bool cyclic,
MutableSpan< float > knots )

◆ calculate_multiplicity_sequence()

◆ check_valid_eval_params()

bool blender::bke::curves::nurbs::check_valid_eval_params ( int points_num,
int8_t order,
bool cyclic,
KnotsMode knots_mode,
int resolution )

Checks the conditions that a NURBS curve needs to evaluate.

Definition at line 16 of file curve_nurbs.cc.

References ELEM, NURBS_KNOT_MODE_BEZIER, and NURBS_KNOT_MODE_ENDPOINT_BEZIER.

Referenced by calculate_basis_cache(), and calculate_evaluated_num().

◆ control_points_num()

int blender::bke::curves::nurbs::control_points_num ( int num_control_points,
int8_t order,
bool cyclic )
inline

Calculate the total number of control points for a NURBS curve including virtual/repeated points for a cyclic/closed curve.

Definition at line 1143 of file BKE_curves.hh.

Referenced by calculate_basis_cache(), count_nonzero_knot_spans(), blender::io::obj::OBJCurves::num_control_points_u(), and blender::io::obj::OBJLegacyCurve::num_control_points_u().

◆ copy_custom_knots() [1/2]

◆ copy_custom_knots() [2/2]

void blender::bke::curves::nurbs::copy_custom_knots ( const int8_t order,
const bool cyclic,
const Span< float > custom_knots,
MutableSpan< float > knots )
static

◆ count_nonzero_knot_spans()

int blender::bke::curves::nurbs::count_nonzero_knot_spans ( const int points_num,
const int order,
const bool cyclic,
const Span< float > knots )
static

◆ gather_custom_knots()

◆ interpolate_to_evaluated() [1/2]

template<typename T>
void blender::bke::curves::nurbs::interpolate_to_evaluated ( const BasisCache & basis_cache,
const int8_t order,
const Span< T > src,
MutableSpan< T > dst )
static

◆ interpolate_to_evaluated() [2/2]

void blender::bke::curves::nurbs::interpolate_to_evaluated ( const BasisCache & basis_cache,
int8_t order,
Span< float > control_weights,
GSpan src,
GMutableSpan dst )

Using a "basis cache" generated by BasisCache, interpolate attribute values to the evaluated points. The number of evaluated points is determined by the #basis_cache argument.

Parameters
control_weightsAn optional span of control point weights, which must have the same size as the number of control points in the curve if provided. Using this argument gives a NURBS curve the "Rational" behavior that's part of its acronym; otherwise it is a NUBS.

Definition at line 353 of file curve_nurbs.cc.

References BLI_assert, blender::bke::attribute_math::convert_to_static_type(), blender::GMutableSpan::copy_from(), interpolate_to_evaluated(), blender::bke::curves::nurbs::BasisCache::invalid, blender::GMutableSpan::size(), blender::Vector< T, InlineBufferCapacity, Allocator >::size(), blender::bke::curves::nurbs::BasisCache::start_indices, and blender::GSpan::type().

Referenced by blender::bke::evaluate_generic_data_for_curve(), blender::bke::CurvesGeometry::evaluated_positions(), interpolate_to_evaluated(), interpolate_to_evaluated(), blender::draw::test_draw_curves_interpolate_attributes(), and blender::draw::test_draw_curves_interpolate_position().

◆ interpolate_to_evaluated_rational()

template<typename T>
void blender::bke::curves::nurbs::interpolate_to_evaluated_rational ( const BasisCache & basis_cache,
const int8_t order,
const Span< float > control_weights,
const Span< T > src,
MutableSpan< T > dst )
static

◆ is_breakpoint()

bool blender::bke::curves::nurbs::is_breakpoint ( const Span< float > knots,
const int knot_span )
static

Definition at line 62 of file curve_nurbs.cc.

Referenced by calculate_basis_cache(), and count_nonzero_knot_spans().

◆ knots_num()

◆ load_curve_knots()

void blender::bke::curves::nurbs::load_curve_knots ( KnotsMode mode,
int points_num,
int8_t order,
bool cyclic,
IndexRange curve_knots,
Span< float > custom_knots,
MutableSpan< float > knots )

Depending on KnotsMode calculates knots or copies custom knots into given MutableSpan. Adds order - 1 length tail for cyclic curves.

Definition at line 160 of file curve_nurbs.cc.

References BLI_assert, calculate_knots(), copy_custom_knots(), blender::IndexRange::is_empty(), blender::Span< T >::is_empty(), NURBS_KNOT_MODE_CUSTOM, and blender::Span< T >::slice().

Referenced by blender::io::usd::populate_curve_props_for_nurbs().

◆ update_custom_knot_modes()

void blender::bke::curves::nurbs::update_custom_knot_modes ( const IndexMask & mask,
const KnotsMode mode_for_regular,
const KnotsMode mode_for_cyclic,
bke::CurvesGeometry & curves )

Overwrites NURBS_KNOT_MODE_CUSTOM to given ones for regular and cyclic curves. The purpose is to update knot modes for curves when knot copying or calculation is not possible or too complex. Curve operators not supporting NURBS custom knots should call this function with IndexMask CurvesGeometry.curves_range(), if resulting curves are created by copying all attributes. This way NURBS_KNOT_MODE_CUSTOM values might be copied though custom knots not.

Definition at line 258 of file curves_utils.cc.

References mask(), and NURBS_KNOT_MODE_CUSTOM.

Referenced by copy_custom_knots(), blender::geometry::curves_merge_endpoints(), blender::ed::curves::pen_tool::extrude_curves(), blender::ed::greasepencil::extrude_grease_pencil_curves(), blender::geometry::fillet_curves(), blender::ed::curves::pen_tool::insert_point_to_curve(), blender::geometry::remove_points_and_split(), blender::ed::curves::resize_curves(), and blender::geometry::trim_curves().