Blender V5.0
blender::ed::curves::pen_tool Namespace Reference

Classes

class  CurvesPenToolOperation
struct  ClosestElement
class  PenToolOperation

Enumerations

enum class  PenModal : int8_t { MoveHandle = 0 , MoveEntire = 1 , SnapAngle = 2 }
enum class  ElementMode : int8_t {
  None = 0 , Point = 1 , Edge = 2 , HandleLeft = 3 ,
  HandleRight = 4
}

Functions

static void pen_find_closest_point (const PenToolOperation &ptd, const bke::CurvesGeometry &curves, const IndexMask &editable_curves, const float4x4 &layer_to_object, const int drawing_index, const float2 &mouse_co, ClosestElement &r_closest_element)
static void pen_find_closest_handle (const PenToolOperation &ptd, const bke::CurvesGeometry &curves, const IndexMask &bezier_points, const float4x4 &layer_to_object, const int drawing_index, const float2 &mouse_co, ClosestElement &r_closest_element)
static float2 line_segment_closest_point (const float2 &pos_1, const float2 &pos_2, const float2 &pos, float &r_local_t)
static void pen_find_closest_edge_point (const PenToolOperation &ptd, const bke::CurvesGeometry &curves, const IndexMask &editable_curves, const float4x4 &layer_to_object, const int drawing_index, const float2 &mouse_co, ClosestElement &r_closest_element)
static ClosestElement find_closest_element (const PenToolOperation &ptd, const float2 &mouse_co)
static void pen_status_indicators (bContext *C, wmOperator *op)
static float2 snap_8_angles (const float2 &p)
static void move_segment (const PenToolOperation &ptd, bke::CurvesGeometry &curves, const float4x4 &layer_to_world)
static bool move_handles_in_curve (const PenToolOperation &ptd, bke::CurvesGeometry &curves, const IndexMask &selection, const float4x4 &layer_to_world, const float4x4 &layer_to_object)
static std::optional< bke::CurvesGeometryextrude_curves (const PenToolOperation &ptd, const bke::CurvesGeometry &src, const float4x4 &layer_to_object, const IndexMask editable_curves)
static void insert_point_to_curve (const PenToolOperation &ptd, bke::CurvesGeometry &src)
static void add_single_point_and_curve (const PenToolOperation &ptd, bke::CurvesGeometry &curves, const float4x4 &layer_to_world)
static bool close_curve_and_select (const PenToolOperation &ptd, bke::CurvesGeometry &curves, const IndexRange points, const bool clear_selection)
static float2 calculate_center_of_mass (const PenToolOperation &ptd, const bool ends_only)
static void invoke_curves (PenToolOperation &ptd, bContext *C, wmOperator *op, const wmEvent *event)
static IndexMask retrieve_visible_bezier_handle_points (const bke::CurvesGeometry &curves, const int handle_display, IndexMaskMemory &memory)
static void curves_pen_exit (bContext *C, wmOperator *op)
static wmOperatorStatus curves_pen_invoke (bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus curves_pen_modal (bContext *C, wmOperator *op, const wmEvent *event)
void pen_tool_common_props (wmOperatorType *ot)
wmKeyMapensure_keymap (wmKeyConfig *keyconf)

Variables

static const EnumPropertyItem prop_handle_types []
constexpr float selection_distance_factor = 0.9f
constexpr float selection_distance_factor_edge = 0.5f
constexpr float default_handle_px_distance = 16.0f
constexpr int CURVE_HANDLE_TYPES_NUM = 4
constexpr float selection_edge_priority_factor = 0.1f
constexpr float selection_point_overwrite_edge_distance_factor = 0.7f
constexpr float selection_point_overwrite_edge_distance_factor_sq

Enumeration Type Documentation

◆ ElementMode

enum class blender::ed::curves::pen_tool::ElementMode : int8_t
strong
Enumerator
None 
Point 
Edge 
HandleLeft 
HandleRight 

Definition at line 50 of file ED_curves.hh.

◆ PenModal

enum class blender::ed::curves::pen_tool::PenModal : int8_t
strong
Enumerator
MoveHandle 
MoveEntire 
SnapAngle 

Definition at line 45 of file curves_pen.cc.

Function Documentation

◆ add_single_point_and_curve()

◆ calculate_center_of_mass()

◆ close_curve_and_select()

◆ curves_pen_exit()

◆ curves_pen_invoke()

wmOperatorStatus blender::ed::curves::pen_tool::curves_pen_invoke ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

◆ curves_pen_modal()

wmOperatorStatus blender::ed::curves::pen_tool::curves_pen_modal ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

◆ ensure_keymap()

◆ extrude_curves()

std::optional< bke::CurvesGeometry > blender::ed::curves::pen_tool::extrude_curves ( const PenToolOperation & ptd,
const bke::CurvesGeometry & src,
const float4x4 & layer_to_object,
const IndexMask editable_curves )
static

Definition at line 538 of file curves_pen.cc.

References blender::offset_indices::accumulate_counts_to_offsets(), blender::Array< T, InlineBufferCapacity, Allocator >::as_mutable_span(), blender::Array< T, InlineBufferCapacity, Allocator >::as_span(), blender::Vector< T, InlineBufferCapacity, Allocator >::as_span(), blender::bke::attribute_filter_from_skip_ref(), blender::bke::CurvesGeometry::attributes(), blender::bke::CurvesGeometry::attributes_for_write(), BKE_defgroup_copy_list(), blender::bke::Bool, blender::bke::CurvesGeometry::calculate_bezier_auto_handles(), blender::ed::curves::pen_tool::PenToolOperation::center_of_mass_co, blender::index_mask::IndexMask::complement(), blender::array_utils::copy(), blender::bke::copy_attributes(), blender::GMutableSpan::copy_from(), blender::offset_indices::copy_group_sizes(), blender::bke::Curve, CURVE_TYPE_BEZIER, CURVE_TYPE_NURBS, blender::bke::CurvesGeometry::curve_types(), blender::bke::CurvesGeometry::curves_num(), blender::bke::CurvesGeometry::curves_range(), blender::bke::CurvesGeometry::cyclic(), blender::bke::CurvesGeometry::cyclic_for_write(), blender::MutableSpan< T >::drop_back(), blender::ed::curves::ensure_selection_attribute(), blender::ed::curves::pen_tool::PenToolOperation::extrude_handle, blender::array_utils::fill_index_range(), blender::bke::GSpanAttributeWriter::finish(), blender::IndexRange::first(), blender::index_mask::IndexMask::foreach_index(), blender::IndexMask::from_predicate(), blender::bke::gather_attributes(), blender::bke::curves::nurbs::gather_custom_knots(), blender::bke::CurvesGeometry::handle_types_left_for_write(), blender::bke::CurvesGeometry::handle_types_right_for_write(), i, blender::Vector< T, InlineBufferCapacity, Allocator >::insert(), blender::IndexRange::last(), blender::ed::curves::pen_tool::PenToolOperation::layer_to_screen(), blender::bke::AttributeAccessor::lookup_or_default(), blender::ed::curves::pen_tool::PenToolOperation::mouse_co, blender::bke::CurvesGeometry::nurbs_has_custom_knots(), NURBS_KNOT_MODE_CUSTOM, NURBS_KNOT_MODE_ENDPOINT, NURBS_KNOT_MODE_NORMAL, blender::bke::CurvesGeometry::nurbs_knots_modes(), blender::bke::CurvesGeometry::offsets_for_write(), blender::bke::Point, blender::bke::CurvesGeometry::point_to_curve_map(), blender::bke::CurvesGeometry::points_by_curve(), blender::bke::CurvesGeometry::points_num(), pos, blender::bke::CurvesGeometry::positions(), blender::bke::CurvesGeometry::positions_for_write(), blender::ed::curves::pen_tool::PenToolOperation::project(), blender::ed::curves::pen_tool::PenToolOperation::radius, blender::bke::CurvesGeometry::radius_for_write(), blender::IndexRange::size(), blender::offset_indices::OffsetIndices< T >::size(), blender::bke::GSpanAttributeWriter::span, types, blender::bke::CurvesGeometry::update_curve_types(), blender::bke::curves::nurbs::update_custom_knot_modes(), and CurvesGeometry::vertex_group_names.

◆ find_closest_element()

◆ insert_point_to_curve()

void blender::ed::curves::pen_tool::insert_point_to_curve ( const PenToolOperation & ptd,
bke::CurvesGeometry & src )
static

Definition at line 695 of file curves_pen.cc.

References blender::offset_indices::accumulate_counts_to_offsets(), blender::Array< T, InlineBufferCapacity, Allocator >::as_mutable_span(), blender::Vector< T, InlineBufferCapacity, Allocator >::as_mutable_span(), blender::Array< T, InlineBufferCapacity, Allocator >::as_span(), blender::bke::attribute_filter_from_skip_ref(), blender::bke::CurvesGeometry::attributes(), blender::bke::CurvesGeometry::attributes_for_write(), BEZIER_HANDLE_ALIGN, BEZIER_HANDLE_FREE, BKE_defgroup_copy_list(), blender::bke::Bool, blender::bke::CurvesGeometry::calculate_bezier_auto_handles(), blender::ed::curves::pen_tool::PenToolOperation::closest_element, blender::index_mask::IndexMask::complement(), blender::array_utils::copy(), blender::bke::copy_attributes(), blender::offset_indices::copy_group_sizes(), blender::bke::Curve, blender::ed::curves::pen_tool::ClosestElement::curve_index, CURVE_TYPE_NURBS, blender::bke::CurvesGeometry::curve_types(), blender::bke::CurvesGeometry::curves_num(), blender::bke::CurvesGeometry::curves_range(), blender::MutableSpan< T >::drop_back(), blender::ed::curves::pen_tool::ClosestElement::edge_t, blender::ed::curves::ensure_selection_attribute(), blender::array_utils::fill_index_range(), blender::ed::curves::fill_selection_false(), blender::ed::curves::fill_selection_true(), blender::bke::GSpanAttributeWriter::finish(), blender::IndexRange::first(), blender::IndexMask::from_predicate(), blender::IndexRange::from_single(), blender::bke::gather_attributes(), blender::bke::curves::nurbs::gather_custom_knots(), blender::ed::curves::get_curves_selection_attribute_names(), blender::bke::curves::bezier::Insertion::handle_next, blender::bke::CurvesGeometry::handle_positions_left(), blender::bke::CurvesGeometry::handle_positions_left_for_write(), blender::bke::CurvesGeometry::handle_positions_right(), blender::bke::CurvesGeometry::handle_positions_right_for_write(), blender::bke::curves::bezier::Insertion::handle_prev, blender::bke::CurvesGeometry::handle_types_left_for_write(), blender::bke::CurvesGeometry::handle_types_right_for_write(), blender::bke::curves::bezier::insert(), blender::Vector< T, InlineBufferCapacity, Allocator >::insert(), blender::bke::curves::bezier::Insertion::left_handle, blender::bke::CurvesGeometry::nurbs_has_custom_knots(), NURBS_KNOT_MODE_CUSTOM, NURBS_KNOT_MODE_ENDPOINT, NURBS_KNOT_MODE_NORMAL, blender::bke::CurvesGeometry::nurbs_knots_modes(), blender::bke::CurvesGeometry::offsets_for_write(), blender::bke::Point, blender::ed::curves::pen_tool::ClosestElement::point_index, blender::bke::CurvesGeometry::points_by_curve(), blender::bke::CurvesGeometry::points_num(), blender::bke::curves::bezier::Insertion::position, blender::bke::CurvesGeometry::positions(), blender::bke::CurvesGeometry::positions_for_write(), blender::bke::curves::bezier::Insertion::right_handle, blender::IndexRange::size(), blender::offset_indices::OffsetIndices< T >::size(), blender::Vector< T, InlineBufferCapacity, Allocator >::size(), blender::bke::GSpanAttributeWriter::span, blender::bke::CurvesGeometry::update_curve_types(), blender::bke::curves::nurbs::update_custom_knot_modes(), and CurvesGeometry::vertex_group_names.

◆ invoke_curves()

◆ line_segment_closest_point()

float2 blender::ed::curves::pen_tool::line_segment_closest_point ( const float2 & pos_1,
const float2 & pos_2,
const float2 & pos,
float & r_local_t )
static

Definition at line 202 of file curves_pen.cc.

References blender::math::clamp(), blender::math::dot(), and pos.

Referenced by pen_find_closest_edge_point().

◆ move_handles_in_curve()

◆ move_segment()

void blender::ed::curves::pen_tool::move_segment ( const PenToolOperation & ptd,
bke::CurvesGeometry & curves,
const float4x4 & layer_to_world )
static

Equation of the starting Bezier Curve: => b(t) = (1-t)^3 * p0 + 3(1-t)^2 * t * p1 + 3(1-t) * t^2 * p2 + t^3 * p3

Equation of the moved Bezier Curve: => B(t) = (1-t)^3 * P0 + 3(1-t)^2 * t * P1 + 3(1-t) * t^2 * P2 + t^3 * P3

The moved Bezier curve has four unknowns: P0, P1, P2 and P3 We want the end points to stay the same so: P0 = p0 and P3 = p3

Mouse location (Pm) should satisfy the equation Pm = B(t). The last constraint used is that the vector between P1 and P2 doesn't change after moving. Therefore: => k2 = p1 - p2 = P1 - P2

Using all four equations we can solve for P1 as: => P1 = (Pm - (1-t)^3 * P0 - t^3 * P3) / (3(1-t) * t) + k2 * t And P2 as: => P2 = P1 - k2

Definition at line 340 of file curves_pen.cc.

References BEZIER_HANDLE_ALIGN, BEZIER_HANDLE_FREE, blender::ed::curves::pen_tool::PenToolOperation::closest_element, blender::ed::curves::pen_tool::ClosestElement::curve_index, blender::ed::curves::pen_tool::ClosestElement::edge_t, blender::IndexRange::first(), blender::ed::curves::pen_tool::PenToolOperation::mouse_co, blender::ed::curves::pen_tool::ClosestElement::point_index, blender::ed::curves::pen_tool::PenToolOperation::screen_to_layer(), and blender::IndexRange::size().

◆ pen_find_closest_edge_point()

◆ pen_find_closest_handle()

◆ pen_find_closest_point()

◆ pen_status_indicators()

void blender::ed::curves::pen_tool::pen_status_indicators ( bContext * C,
wmOperator * op )
static

◆ pen_tool_common_props()

◆ retrieve_visible_bezier_handle_points()

◆ snap_8_angles()

float2 blender::ed::curves::pen_tool::snap_8_angles ( const float2 & p)
static

Definition at line 333 of file curves_pen.cc.

References abs, length(), normalize, sign(), and sin.

Referenced by move_handles_in_curve().

Variable Documentation

◆ CURVE_HANDLE_TYPES_NUM

int blender::ed::curves::pen_tool::CURVE_HANDLE_TYPES_NUM = 4
constexpr

Definition at line 68 of file curves_pen.cc.

◆ default_handle_px_distance

float blender::ed::curves::pen_tool::default_handle_px_distance = 16.0f
constexpr

Definition at line 65 of file curves_pen.cc.

Referenced by add_single_point_and_curve().

◆ prop_handle_types

const EnumPropertyItem blender::ed::curves::pen_tool::prop_handle_types[]
static
Initial value:
= {
{BEZIER_HANDLE_AUTO, "AUTO", 0, "Auto", ""},
{BEZIER_HANDLE_VECTOR, "VECTOR", 0, "Vector", ""},
{0, nullptr, 0, nullptr, nullptr},
}
@ BEZIER_HANDLE_VECTOR
@ BEZIER_HANDLE_AUTO

Definition at line 54 of file curves_pen.cc.

Referenced by pen_tool_common_props().

◆ selection_distance_factor

float blender::ed::curves::pen_tool::selection_distance_factor = 0.9f
constexpr

◆ selection_distance_factor_edge

float blender::ed::curves::pen_tool::selection_distance_factor_edge = 0.5f
constexpr

◆ selection_edge_priority_factor

float blender::ed::curves::pen_tool::selection_edge_priority_factor = 0.1f
constexpr

◆ selection_point_overwrite_edge_distance_factor

float blender::ed::curves::pen_tool::selection_point_overwrite_edge_distance_factor = 0.7f
constexpr

Definition at line 73 of file curves_pen.cc.

◆ selection_point_overwrite_edge_distance_factor_sq

float blender::ed::curves::pen_tool::selection_point_overwrite_edge_distance_factor_sq
constexpr