Blender V4.3
editmesh_knife.cc File Reference
#include <fmt/format.h>
#include "MEM_guardedalloc.h"
#include "BLF_api.hh"
#include "BLI_alloca.h"
#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_map.hh"
#include "BLI_math_color.h"
#include "BLI_math_matrix.h"
#include "BLI_math_rotation.h"
#include "BLI_math_vector_types.hh"
#include "BLI_memarena.h"
#include "BLI_set.hh"
#include "BLI_stack.h"
#include "BLI_string.h"
#include "BLI_vector.hh"
#include "BLT_translation.hh"
#include "BKE_bvhutils.hh"
#include "BKE_context.hh"
#include "BKE_editmesh.hh"
#include "BKE_layer.hh"
#include "BKE_report.hh"
#include "BKE_scene.hh"
#include "BKE_unit.hh"
#include "GPU_immediate.hh"
#include "GPU_matrix.hh"
#include "GPU_state.hh"
#include "ED_mesh.hh"
#include "ED_numinput.hh"
#include "ED_screen.hh"
#include "ED_space_api.hh"
#include "ED_transform.hh"
#include "ED_view3d.hh"
#include "WM_api.hh"
#include "WM_types.hh"
#include "DNA_object_types.h"
#include "UI_interface.hh"
#include "UI_resources.hh"
#include "RNA_access.hh"
#include "RNA_define.hh"
#include "DEG_depsgraph.hh"
#include "DEG_depsgraph_query.hh"
#include "mesh_intern.hh"

Go to the source code of this file.

Classes

struct  KnifeColors
 
struct  KnifeVert
 
struct  KnifeEdge
 
struct  KnifeLineHit
 
struct  KnifePosData
 
struct  KnifeMeasureData
 
struct  KnifeUndoFrame
 
struct  KnifeBVH
 
struct  KnifeObjectInfo
 
struct  KnifeTool_OpData
 

Macros

#define USE_NET_ISLAND_CONNECT
 
#define KMAXDIST   (10 * UI_SCALE_FAC) /* Max mouse distance from edge before not detecting it. */
 
#define KNIFE_FLT_EPS   0.00001f
 
#define KNIFE_FLT_EPS_SQUARED   (KNIFE_FLT_EPS * KNIFE_FLT_EPS)
 
#define KNIFE_FLT_EPSBIG   0.0005f
 
#define KNIFE_FLT_EPS_PX_VERT   0.5f
 
#define KNIFE_FLT_EPS_PX_EDGE   0.05f
 
#define KNIFE_FLT_EPS_PX_FACE   0.05f
 
#define KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT   30.0f
 
#define KNIFE_MIN_ANGLE_SNAPPING_INCREMENT   0.0f
 
#define KNIFE_MAX_ANGLE_SNAPPING_INCREMENT   180.0f
 
#define F_ISECT_IS_UNKNOWN(f)   BM_elem_flag_test(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)
 
#define F_ISECT_SET_UNKNOWN(f)   BM_elem_flag_enable(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)
 
#define F_ISECT_SET_OUTSIDE(f)   BM_elem_flag_disable(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)
 

Enumerations

enum  KnifeMode { MODE_IDLE , MODE_DRAGGING , MODE_CONNECT , MODE_PANNING }
 
enum  {
  KNF_MODAL_CANCEL = 1 , KNF_MODAL_CONFIRM , KNF_MODAL_UNDO , KNF_MODAL_MIDPOINT_ON ,
  KNF_MODAL_MIDPOINT_OFF , KNF_MODAL_NEW_CUT , KNF_MODAL_IGNORE_SNAP_ON , KNF_MODAL_IGNORE_SNAP_OFF ,
  KNF_MODAL_ADD_CUT , KNF_MODAL_ANGLE_SNAP_TOGGLE , KNF_MODAL_CYCLE_ANGLE_SNAP_EDGE , KNF_MODAL_CUT_THROUGH_TOGGLE ,
  KNF_MODAL_SHOW_DISTANCE_ANGLE_TOGGLE , KNF_MODAL_DEPTH_TEST_TOGGLE , KNF_MODAL_PANNING , KNF_MODAL_X_AXIS ,
  KNF_MODAL_Y_AXIS , KNF_MODAL_Z_AXIS , KNF_MODAL_ADD_CUT_CLOSED
}
 
enum  { KNF_CONSTRAIN_ANGLE_MODE_NONE = 0 , KNF_CONSTRAIN_ANGLE_MODE_SCREEN = 1 , KNF_CONSTRAIN_ANGLE_MODE_RELATIVE = 2 }
 
enum  { KNF_CONSTRAIN_AXIS_NONE = 0 , KNF_CONSTRAIN_AXIS_X = 1 , KNF_CONSTRAIN_AXIS_Y = 2 , KNF_CONSTRAIN_AXIS_Z = 3 }
 
enum  { KNF_CONSTRAIN_AXIS_MODE_NONE = 0 , KNF_CONSTRAIN_AXIS_MODE_GLOBAL = 1 , KNF_CONSTRAIN_AXIS_MODE_LOCAL = 2 }
 
enum  { KNF_MEASUREMENT_NONE = 0 , KNF_MEASUREMENT_BOTH = 1 , KNF_MEASUREMENT_DISTANCE = 2 , KNF_MEASUREMENT_ANGLE = 3 }
 

Functions

Drawing
static void knifetool_raycast_planes (const KnifeTool_OpData *kcd, float r_v1[3], float r_v2[3])
 
static void knifetool_draw_angle_snapping (const KnifeTool_OpData *kcd)
 
static void knifetool_draw_orientation_locking (const KnifeTool_OpData *kcd)
 
static void knifetool_draw_visible_distances (const KnifeTool_OpData *kcd)
 
static void knifetool_draw_angle (const KnifeTool_OpData *kcd, const float start[3], const float mid[3], const float end[3], const float start_ss[2], const float mid_ss[2], const float end_ss[2], const float angle)
 
static void knifetool_draw_visible_angles (const KnifeTool_OpData *kcd)
 
static void knifetool_draw_dist_angle (const KnifeTool_OpData *kcd)
 
static void knifetool_draw (const bContext *, ARegion *, void *arg)
 
Header
static void knife_update_header (bContext *C, wmOperator *op, KnifeTool_OpData *kcd)
 
Knife Object Info Accessors (#KnifeObjectInfo)
static const intknife_bm_tri_index_get (const KnifeTool_OpData *kcd, int ob_index, int tri_index, int tri_index_buf[3])
 
static void knife_bm_tri_cagecos_get (const KnifeTool_OpData *kcd, int ob_index, int tri_index, float cos[3][3])
 
static void knife_bm_tri_cagecos_get_worldspace (const KnifeTool_OpData *kcd, int ob_index, int tri_index, float cos[3][3])
 
Knife BVH Utils
static bool knife_bm_face_is_select (BMFace *f)
 
static bool knife_bm_face_is_not_hidden (BMFace *f)
 
static void knife_bvh_init (KnifeTool_OpData *kcd)
 
static void knife_bvh_free (KnifeTool_OpData *kcd)
 
static void knife_bvh_raycast_cb (void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
 
static BMFaceknife_bvh_raycast (KnifeTool_OpData *kcd, const float co[3], const float dir[3], const float radius, float *r_dist, float r_cagehit[3], int *r_ob_index)
 
static BMFaceknife_bvh_raycast_filter (KnifeTool_OpData *kcd, const float co[3], const float dir[3], const float radius, float *r_dist, float r_cagehit[3], int *r_ob_index, bool(*filter_cb)(BMFace *f, void *userdata), void *filter_userdata)
 
Geometry Utils
static void knife_project_v2 (const KnifeTool_OpData *kcd, const float co[3], float sco[2])
 
static void knife_input_ray_segment (KnifeTool_OpData *kcd, const float mval[2], float r_origin[3], float r_end[3])
 
static void UNUSED_FUNCTION knifetool_recast_cageco (KnifeTool_OpData *kcd, float mval[3], float r_cage[3])
 
static bool knife_verts_edge_in_face (KnifeVert *v1, KnifeVert *v2, BMFace *f)
 
static void knife_recalc_ortho (KnifeTool_OpData *kcd)
 
Knife Element Utils

Currently only used in knife_find_line_hits.

static BMElembm_elem_from_knife_vert (KnifeVert *kfv, KnifeEdge **r_kfe)
 
static BMElembm_elem_from_knife_edge (KnifeEdge *kfe)
 
Knife Element List Utils
static ListBaseknife_empty_list (KnifeTool_OpData *kcd)
 
static void knife_append_list (KnifeTool_OpData *kcd, ListBase *lst, void *elem)
 
static LinkDatafind_ref (ListBase *lb, void *ref)
 
static void knife_append_list_no_dup (KnifeTool_OpData *kcd, ListBase *lst, void *elem)
 
static void knife_add_to_vert_edges (KnifeTool_OpData *kcd, KnifeEdge *kfe)
 
static void knife_add_edge_faces_to_vert (KnifeTool_OpData *kcd, KnifeVert *kfv, BMEdge *e)
 
static BMFaceknife_find_common_face (ListBase *faces1, ListBase *faces2)
 
Knife Element Creation
static KnifeVertnew_knife_vert (KnifeTool_OpData *kcd, const float co[3], const float cageco[3])
 
static KnifeEdgenew_knife_edge (KnifeTool_OpData *kcd)
 
static KnifeVertget_bm_knife_vert (KnifeTool_OpData *kcd, BMVert *v, int ob_index)
 
static KnifeEdgeget_bm_knife_edge (KnifeTool_OpData *kcd, BMEdge *e, int ob_index)
 
static ListBaseknife_get_face_kedges (KnifeTool_OpData *kcd, int ob_index, BMFace *f)
 
static void knife_edge_append_face (KnifeTool_OpData *kcd, KnifeEdge *kfe, BMFace *f)
 
static KnifeVertknife_split_edge (KnifeTool_OpData *kcd, KnifeEdge *kfe, const float co[3], const float cageco[3], KnifeEdge **r_kfe)
 
static void knife_join_edge (KnifeEdge *newkfe, KnifeEdge *kfe)
 
Cut/Hit Utils
static void knife_snap_curr (KnifeTool_OpData *kcd, const float2 &mval)
 
static void knife_start_cut (KnifeTool_OpData *kcd, const float2 &mval)
 
static void linehit_to_knifepos (KnifePosData *kpos, KnifeLineHit *lh)
 
static int linehit_compare (const KnifeLineHit &lh1, const KnifeLineHit &lh2)
 
static void prepare_linehits_for_cut (KnifeTool_OpData *kcd)
 
static void add_hit_to_facehits (KnifeTool_OpData *kcd, GHash *facehits, BMFace *f, KnifeLineHit *hit)
 
static bool knife_add_single_cut__is_linehit_outside_face (BMFace *f, const KnifeLineHit *lh, const float co[3])
 
static void knife_add_single_cut (KnifeTool_OpData *kcd, KnifeLineHit *lh1, KnifeLineHit *lh2, BMFace *f)
 
static void knife_cut_face (KnifeTool_OpData *kcd, BMFace *f, ListBase *hits)
 
static void knife_make_face_cuts (KnifeTool_OpData *kcd, BMesh *bm, BMFace *f, ListBase *kfedges)
 
static int sort_verts_by_dist_cb (void *co_p, const void *cur_a_p, const void *cur_b_p)
 
static void knife_make_cuts (KnifeTool_OpData *kcd, int ob_index)
 
static void knife_add_cut (KnifeTool_OpData *kcd)
 
static void knife_finish_cut (KnifeTool_OpData *kcd)
 
Screen Line Hits (#knife_find_line_hits)
static void set_lowest_face_tri (KnifeTool_OpData *kcd, BMEditMesh *em, BMFace *f, int index)
 
static int get_lowest_face_tri (KnifeTool_OpData *kcd, BMFace *f)
 
static bool knife_ray_intersect_face (KnifeTool_OpData *kcd, const float s[2], const float v1[3], const float v2[3], int ob_index, BMFace *f, const float face_tol_sq, float hit_co[3], float hit_cageco[3])
 
static void calc_ortho_extent (KnifeTool_OpData *kcd)
 
static bool coinciding_edges (BMEdge *e1, BMEdge *e2)
 
static bool bm_ray_cast_cb_elem_not_in_face_check (BMFace *f, void *user_data)
 
static bool point_is_visible (KnifeTool_OpData *kcd, const float p[3], const float s[2], BMElem *ele_test)
 
static void clip_to_ortho_planes (float v1[3], float v2[3], const float center[3], const float d)
 
static void knife_linehit_set (KnifeTool_OpData *kcd, float s1[2], float s2[2], float sco[2], float cage[3], int ob_index, KnifeVert *v, KnifeEdge *kfe, KnifeLineHit *r_hit)
 
static bool knife_linehit_face_test (KnifeTool_OpData *kcd, float s1[2], float s2[2], float sco[2], float ray_start[3], float ray_end[3], int ob_index, BMFace *f, float face_tol_sq, KnifeLineHit *r_hit)
 
static void knife_find_line_hits (KnifeTool_OpData *kcd)
 
KnifePosData Utils
static void knife_pos_data_clear (KnifePosData *kpd)
 
Snapping (#knife_snap_update_from_mval)
static bool knife_find_closest_face (KnifeTool_OpData *kcd, const float3 &ray_origin, const float3 &ray_normal, const float2 &mval, KnifePosData *r_kpd)
 
static int knife_sample_screen_density_from_closest_face (KnifeTool_OpData *kcd, const float radius, int ob_index, BMFace *f, const float cageco[3])
 
static float knife_snap_size (KnifeTool_OpData *kcd, float maxsize)
 
static bool knife_closest_constrain_to_edge (KnifeTool_OpData *kcd, const float3 &kfv1_cageco, const float3 &kfv2_cageco, float r_close[3])
 
static bool knife_find_closest_edge_of_face (KnifeTool_OpData *kcd, int ob_index, BMFace *f, const float3 &ray_origin, const float3 &ray_normal, const float2 &curr_cage_ss, KnifePosData *r_kpd)
 
static bool knife_find_closest_vert_of_edge (KnifeTool_OpData *kcd, const KnifeEdge *kfe, const float2 &cage_ss, KnifePosData *r_kpd)
 
static float snap_v2_angle (float r[2], const float v[2], const float v_ref[2], float angle_snap)
 
static bool knife_snap_angle_screen (KnifeTool_OpData *kcd)
 
static float snap_v3_angle_plane (float r[3], const float v[3], const float v_ref[3], const float plane_no[3], float snap_step)
 
static bool knife_snap_angle_relative (KnifeTool_OpData *kcd)
 
static int knife_calculate_snap_ref_edges (KnifeTool_OpData *kcd)
 
static void knife_reset_snap_angle_input (KnifeTool_OpData *kcd)
 
static void knife_constrain_axis (KnifeTool_OpData *kcd)
 
static void knife_snap_update_from_mval (KnifeTool_OpData *kcd, const float mval[2])
 
static void knifetool_undo (KnifeTool_OpData *kcd)
 
#KnifeObjectInfo (#kcd->objects_info) Init and Free
static void knifetool_init_obinfo (KnifeTool_OpData *kcd, Object *ob, int ob_index, bool use_tri_indices)
 
#KnifeTool_OpData (#op->customdata) Init and Free
static void knife_init_colors (KnifeColors *colors)
 
static void knifetool_init (ViewContext *vc, KnifeTool_OpData *kcd, Vector< Object * > objects, const bool only_select, const bool cut_through, const bool xray, const int visible_measurements, const int angle_snapping, const float angle_snapping_increment, const bool is_interactive)
 
static void knifetool_exit_ex (KnifeTool_OpData *kcd)
 
static void knifetool_exit (wmOperator *op)
 
Mouse-Moving Event Updates
static int knife_update_active (KnifeTool_OpData *kcd)
 
static void knifetool_update_mval (KnifeTool_OpData *kcd, const float mval[2])
 
static void knifetool_update_mval_i (KnifeTool_OpData *kcd, const int mval_i[2])
 
Finalization
static void knifetool_finish_single_pre (KnifeTool_OpData *kcd, int ob_index)
 
static void knifetool_finish_single_post (KnifeTool_OpData *, Object *ob)
 
static void knifetool_finish_ex (KnifeTool_OpData *kcd)
 
static void knifetool_finish (wmOperator *op)
 
Operator (#MESH_OT_knife_tool)
static void knifetool_cancel (bContext *, wmOperator *op)
 
wmKeyMapknifetool_modal_keymap (wmKeyConfig *keyconf)
 
static void knifetool_disable_angle_snapping (KnifeTool_OpData *kcd)
 
static void knifetool_disable_orientation_locking (KnifeTool_OpData *kcd)
 
static int knifetool_modal (bContext *C, wmOperator *op, const wmEvent *event)
 
static int knifetool_invoke (bContext *C, wmOperator *op, const wmEvent *event)
 
void MESH_OT_knife_tool (wmOperatorType *ot)
 
Knife tool as a utility function

Can be used for internal slicing operations.

static bool edbm_mesh_knife_point_isect (LinkNode *polys, const float cent_ss[2])
 
void EDBM_mesh_knife (ViewContext *vc, const Span< Object * > objects, LinkNode *polys, bool use_tag, bool cut_through)
 

Detailed Description

Interactive editmesh knife tool.

Definition in file editmesh_knife.cc.

Macro Definition Documentation

◆ F_ISECT_IS_UNKNOWN

#define F_ISECT_IS_UNKNOWN ( f)    BM_elem_flag_test(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)

Referenced by EDBM_mesh_knife().

◆ F_ISECT_SET_OUTSIDE

#define F_ISECT_SET_OUTSIDE ( f)    BM_elem_flag_disable(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)

Referenced by EDBM_mesh_knife().

◆ F_ISECT_SET_UNKNOWN

#define F_ISECT_SET_UNKNOWN ( f)    BM_elem_flag_enable(BM_FACE_FIRST_LOOP(f), BM_ELEM_TAG)

Referenced by EDBM_mesh_knife().

◆ KMAXDIST

#define KMAXDIST   (10 * UI_SCALE_FAC) /* Max mouse distance from edge before not detecting it. */

Definition at line 77 of file editmesh_knife.cc.

Referenced by knife_find_closest_face(), and knifetool_init().

◆ KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT

#define KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT   30.0f

◆ KNIFE_FLT_EPS

◆ KNIFE_FLT_EPS_PX_EDGE

#define KNIFE_FLT_EPS_PX_EDGE   0.05f

Definition at line 87 of file editmesh_knife.cc.

Referenced by knife_find_line_hits().

◆ KNIFE_FLT_EPS_PX_FACE

#define KNIFE_FLT_EPS_PX_FACE   0.05f

Definition at line 88 of file editmesh_knife.cc.

Referenced by knife_find_line_hits().

◆ KNIFE_FLT_EPS_PX_VERT

#define KNIFE_FLT_EPS_PX_VERT   0.5f

Definition at line 86 of file editmesh_knife.cc.

Referenced by knife_find_line_hits().

◆ KNIFE_FLT_EPS_SQUARED

#define KNIFE_FLT_EPS_SQUARED   (KNIFE_FLT_EPS * KNIFE_FLT_EPS)

Definition at line 83 of file editmesh_knife.cc.

Referenced by knife_find_line_hits().

◆ KNIFE_FLT_EPSBIG

◆ KNIFE_MAX_ANGLE_SNAPPING_INCREMENT

#define KNIFE_MAX_ANGLE_SNAPPING_INCREMENT   180.0f

◆ KNIFE_MIN_ANGLE_SNAPPING_INCREMENT

#define KNIFE_MIN_ANGLE_SNAPPING_INCREMENT   0.0f

◆ USE_NET_ISLAND_CONNECT

#define USE_NET_ISLAND_CONNECT

Definition at line 75 of file editmesh_knife.cc.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
KNF_MODAL_CANCEL 
KNF_MODAL_CONFIRM 
KNF_MODAL_UNDO 
KNF_MODAL_MIDPOINT_ON 
KNF_MODAL_MIDPOINT_OFF 
KNF_MODAL_NEW_CUT 
KNF_MODAL_IGNORE_SNAP_ON 
KNF_MODAL_IGNORE_SNAP_OFF 
KNF_MODAL_ADD_CUT 
KNF_MODAL_ANGLE_SNAP_TOGGLE 
KNF_MODAL_CYCLE_ANGLE_SNAP_EDGE 
KNF_MODAL_CUT_THROUGH_TOGGLE 
KNF_MODAL_SHOW_DISTANCE_ANGLE_TOGGLE 
KNF_MODAL_DEPTH_TEST_TOGGLE 
KNF_MODAL_PANNING 
KNF_MODAL_X_AXIS 
KNF_MODAL_Y_AXIS 
KNF_MODAL_Z_AXIS 
KNF_MODAL_ADD_CUT_CLOSED 

Definition at line 328 of file editmesh_knife.cc.

◆ anonymous enum

anonymous enum
Enumerator
KNF_CONSTRAIN_ANGLE_MODE_NONE 
KNF_CONSTRAIN_ANGLE_MODE_SCREEN 
KNF_CONSTRAIN_ANGLE_MODE_RELATIVE 

Definition at line 350 of file editmesh_knife.cc.

◆ anonymous enum

anonymous enum
Enumerator
KNF_CONSTRAIN_AXIS_NONE 
KNF_CONSTRAIN_AXIS_X 
KNF_CONSTRAIN_AXIS_Y 
KNF_CONSTRAIN_AXIS_Z 

Definition at line 356 of file editmesh_knife.cc.

◆ anonymous enum

anonymous enum
Enumerator
KNF_CONSTRAIN_AXIS_MODE_NONE 
KNF_CONSTRAIN_AXIS_MODE_GLOBAL 
KNF_CONSTRAIN_AXIS_MODE_LOCAL 

Definition at line 363 of file editmesh_knife.cc.

◆ anonymous enum

anonymous enum
Enumerator
KNF_MEASUREMENT_NONE 
KNF_MEASUREMENT_BOTH 
KNF_MEASUREMENT_DISTANCE 
KNF_MEASUREMENT_ANGLE 

Definition at line 369 of file editmesh_knife.cc.

◆ KnifeMode

enum KnifeMode
Enumerator
MODE_IDLE 
MODE_DRAGGING 
MODE_CONNECT 
MODE_PANNING 

Definition at line 216 of file editmesh_knife.cc.

Function Documentation

◆ add_hit_to_facehits()

static void add_hit_to_facehits ( KnifeTool_OpData * kcd,
GHash * facehits,
BMFace * f,
KnifeLineHit * hit )
static

◆ bm_elem_from_knife_edge()

static BMElem * bm_elem_from_knife_edge ( KnifeEdge * kfe)
static

Definition at line 1562 of file editmesh_knife.cc.

References KnifeEdge::basef, and KnifeEdge::e.

Referenced by knife_find_line_hits().

◆ bm_elem_from_knife_vert()

static BMElem * bm_elem_from_knife_vert ( KnifeVert * kfv,
KnifeEdge ** r_kfe )
static

◆ bm_ray_cast_cb_elem_not_in_face_check()

static bool bm_ray_cast_cb_elem_not_in_face_check ( BMFace * f,
void * user_data )
static

◆ calc_ortho_extent()

◆ clip_to_ortho_planes()

static void clip_to_ortho_planes ( float v1[3],
float v2[3],
const float center[3],
const float d )
static

◆ coinciding_edges()

static bool coinciding_edges ( BMEdge * e1,
BMEdge * e2 )
static

Definition at line 2580 of file editmesh_knife.cc.

References BMVert::co, equals_v3v3(), BMEdge::v1, and BMEdge::v2.

Referenced by bm_ray_cast_cb_elem_not_in_face_check().

◆ EDBM_mesh_knife()

◆ edbm_mesh_knife_point_isect()

static bool edbm_mesh_knife_point_isect ( LinkNode * polys,
const float cent_ss[2] )
static

Definition at line 4762 of file editmesh_knife.cc.

References float, int, isect_point_poly_v2(), LinkNode::link, MEM_allocN_len, and LinkNode::next.

Referenced by EDBM_mesh_knife().

◆ find_ref()

static LinkData * find_ref ( ListBase * lb,
void * ref )
static

◆ get_bm_knife_edge()

◆ get_bm_knife_vert()

◆ get_lowest_face_tri()

static int get_lowest_face_tri ( KnifeTool_OpData * kcd,
BMFace * f )
static

◆ knife_add_cut()

◆ knife_add_edge_faces_to_vert()

static void knife_add_edge_faces_to_vert ( KnifeTool_OpData * kcd,
KnifeVert * kfv,
BMEdge * e )
static

Definition at line 1624 of file editmesh_knife.cc.

References BM_FACES_OF_EDGE, BM_ITER_ELEM, e, KnifeVert::faces, and knife_append_list().

Referenced by knife_split_edge().

◆ knife_add_single_cut()

◆ knife_add_single_cut__is_linehit_outside_face()

static bool knife_add_single_cut__is_linehit_outside_face ( BMFace * f,
const KnifeLineHit * lh,
const float co[3] )
static

Special purpose function, if the linehit is connected to a real edge/vert. Return true if co is outside the face.

Definition at line 1980 of file editmesh_knife.cc.

References BM_face_edge_share_loop(), BM_face_vert_share_loop(), BM_loop_point_side_of_edge_test(), BM_loop_point_side_of_loop_test(), KnifeEdge::e, KnifeLineHit::kfe, l, KnifeLineHit::v, and KnifeVert::v.

Referenced by knife_add_single_cut().

◆ knife_add_to_vert_edges()

static void knife_add_to_vert_edges ( KnifeTool_OpData * kcd,
KnifeEdge * kfe )
static

◆ knife_append_list()

◆ knife_append_list_no_dup()

static void knife_append_list_no_dup ( KnifeTool_OpData * kcd,
ListBase * lst,
void * elem )
static

Definition at line 1610 of file editmesh_knife.cc.

References find_ref(), and knife_append_list().

Referenced by add_hit_to_facehits().

◆ knife_bm_face_is_not_hidden()

static bool knife_bm_face_is_not_hidden ( BMFace * f)
static

Definition at line 1204 of file editmesh_knife.cc.

References BM_elem_flag_test, and BM_ELEM_HIDDEN.

Referenced by knife_bvh_init().

◆ knife_bm_face_is_select()

static bool knife_bm_face_is_select ( BMFace * f)
static

Definition at line 1199 of file editmesh_knife.cc.

References BM_elem_flag_test, and BM_ELEM_SELECT.

Referenced by knife_bvh_init().

◆ knife_bm_tri_cagecos_get()

static void knife_bm_tri_cagecos_get ( const KnifeTool_OpData * kcd,
int ob_index,
int tri_index,
float cos[3][3] )
static

◆ knife_bm_tri_cagecos_get_worldspace()

static void knife_bm_tri_cagecos_get_worldspace ( const KnifeTool_OpData * kcd,
int ob_index,
int tri_index,
float cos[3][3] )
static

◆ knife_bm_tri_index_get()

static const int * knife_bm_tri_index_get ( const KnifeTool_OpData * kcd,
int ob_index,
int tri_index,
int tri_index_buf[3] )
static

◆ knife_bvh_free()

static void knife_bvh_free ( KnifeTool_OpData * kcd)
static

Definition at line 1291 of file editmesh_knife.cc.

References BLI_bvhtree_free(), KnifeTool_OpData::bvh, and KnifeBVH::tree.

Referenced by knifetool_exit_ex().

◆ knife_bvh_init()

◆ knife_bvh_raycast()

◆ knife_bvh_raycast_cb()

◆ knife_bvh_raycast_filter()

static BMFace * knife_bvh_raycast_filter ( KnifeTool_OpData * kcd,
const float co[3],
const float dir[3],
const float radius,
float * r_dist,
float r_cagehit[3],
int * r_ob_index,
bool(* filter_cb )(BMFace *f, void *userdata),
void * filter_userdata )
static

◆ knife_calculate_snap_ref_edges()

◆ knife_closest_constrain_to_edge()

static bool knife_closest_constrain_to_edge ( KnifeTool_OpData * kcd,
const float3 & kfv1_cageco,
const float3 & kfv2_cageco,
float r_close[3] )
static

Find a point on an edge that is closest to the axis of a constrained mode.

Returns
true if the point is between the edge limits.

Definition at line 3224 of file editmesh_knife.cc.

References KnifePosData::cage, KnifeTool_OpData::curr, interp_v3_v3v3(), isect_ray_line_v3(), KNIFE_FLT_EPSBIG, and KnifeTool_OpData::prev.

Referenced by knife_find_closest_edge_of_face().

◆ knife_constrain_axis()

◆ knife_cut_face()

static void knife_cut_face ( KnifeTool_OpData * kcd,
BMFace * f,
ListBase * hits )
static

◆ knife_edge_append_face()

static void knife_edge_append_face ( KnifeTool_OpData * kcd,
KnifeEdge * kfe,
BMFace * f )
static

◆ knife_empty_list()

static ListBase * knife_empty_list ( KnifeTool_OpData * kcd)
static

◆ knife_find_closest_edge_of_face()

◆ knife_find_closest_face()

◆ knife_find_closest_vert_of_edge()

◆ knife_find_common_face()

static BMFace * knife_find_common_face ( ListBase * faces1,
ListBase * faces2 )
static

Definition at line 1636 of file editmesh_knife.cc.

References LISTBASE_FOREACH.

Referenced by knife_split_edge().

◆ knife_find_line_hits()

static void knife_find_line_hits ( KnifeTool_OpData * kcd)
static

Definition at line 2792 of file editmesh_knife.cc.

References blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), blender::Vector< T, InlineBufferCapacity, Allocator >::append(), BKE_editmesh_from_object(), BLI_assert, BLI_bvhtree_intersect_plane(), BM_elem_flag_test, bm_elem_from_knife_edge(), bm_elem_from_knife_vert(), BM_ELEM_SELECT, KnifeTool_OpData::bvh, KnifePosData::cage, calc_ortho_extent(), blender::Vector< T, InlineBufferCapacity, Allocator >::clear_and_shrink(), clip_to_ortho_planes(), closest_to_line_segment_v2(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::contains(), copy_v2_v2(), copy_v3_v3(), cross_v3_v3v3(), KnifeTool_OpData::curr, blender::Array< T, InlineBufferCapacity, Allocator >::data(), ViewContext::depsgraph, dist_squared_to_line_segment_v2(), ED_view3d_win_to_segment_clipped(), KnifePosData::edge, ELEM, BMLoop::f, fabsf, faces, KnifeTool_OpData::is_drag_hold, KnifeTool_OpData::is_interactive, KnifeEdge::is_invalid, KnifeTool_OpData::is_ortho, isect_line_line_v3(), isect_seg_seg_v2_point_ex(), KNIFE_FLT_EPS_PX_EDGE, KNIFE_FLT_EPS_PX_FACE, KNIFE_FLT_EPS_PX_VERT, KNIFE_FLT_EPS_SQUARED, knife_get_face_kedges(), knife_input_ray_segment(), knife_linehit_face_test(), knife_linehit_set(), knife_project_v2(), len_squared_v2v2(), len_v2v2(), KnifeTool_OpData::linehits, LISTBASE_FOREACH, blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::lookup(), BMEditMesh::looptris, MEM_freeN(), mid_v2_v2v2(), mid_v3_v3v3(), KnifePosData::mval, KnifeTool_OpData::objects, KnifeTool_OpData::only_select, KnifeTool_OpData::ortho_extent, KnifeTool_OpData::ortho_extent_center, RegionView3D::persp, plane_from_point_normal_v3(), point_is_visible(), KnifeTool_OpData::prev, KnifeTool_OpData::region, blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::remove(), result, ViewContext::rv3d, RV3D_CAMOB, set_lowest_face_tri(), blender::Array< T, InlineBufferCapacity, Allocator >::size(), blender::Vector< T, InlineBufferCapacity, Allocator >::size(), KnifeTool_OpData::snap_midpoints, sub_v3_v3v3(), KnifeBVH::tree, v, KnifeEdge::v1, KnifeEdge::v2, v2, ViewContext::v3d, KnifeTool_OpData::vc, and KnifePosData::vert.

Referenced by knife_update_active().

◆ knife_finish_cut()

static void knife_finish_cut ( KnifeTool_OpData * kcd)
static

◆ knife_get_face_kedges()

◆ knife_init_colors()

◆ knife_input_ray_segment()

◆ knife_join_edge()

static void knife_join_edge ( KnifeEdge * newkfe,
KnifeEdge * kfe )
static

◆ knife_linehit_face_test()

static bool knife_linehit_face_test ( KnifeTool_OpData * kcd,
float s1[2],
float s2[2],
float sco[2],
float ray_start[3],
float ray_end[3],
int ob_index,
BMFace * f,
float face_tol_sq,
KnifeLineHit * r_hit )
static

◆ knife_linehit_set()

◆ knife_make_cuts()

◆ knife_make_face_cuts()

◆ knife_pos_data_clear()

◆ knife_project_v2()

◆ knife_ray_intersect_face()

static bool knife_ray_intersect_face ( KnifeTool_OpData * kcd,
const float s[2],
const float v1[3],
const float v2[3],
int ob_index,
BMFace * f,
const float face_tol_sq,
float hit_co[3],
float hit_cageco[3] )
static

Find intersection of v1-v2 with face f. Only take intersections that are at least face_tol_sq (in screen space) away from other intersection elements. If v1-v2 is coplanar with f, call that "no intersection though it really means "infinite number of intersections". In such a case we should have gotten hits on edges or verts of the face.

Definition at line 2466 of file editmesh_knife.cc.

References BKE_editmesh_from_object(), BLI_assert, KnifeVert::cageco, BMVert::co, dist_squared_to_line_segment_v2(), dist_squared_to_plane_v3(), get_lowest_face_tri(), interp_v3_v3v3v3_uv(), KnifeEdge::is_invalid, isect_ray_tri_epsilon_v3(), knife_bm_tri_cagecos_get_worldspace(), KNIFE_FLT_EPS, knife_get_face_kedges(), knife_project_v2(), LISTBASE_FOREACH, BMEditMesh::looptris, normal_tri_v3(), normalize_v3(), KnifeTool_OpData::objects, plane_from_point_normal_v3(), blender::Array< T, InlineBufferCapacity, Allocator >::size(), sub_v3_v3v3(), UNPACK3, v, KnifeEdge::v1, KnifeEdge::v2, and v2.

Referenced by knife_linehit_face_test().

◆ knife_recalc_ortho()

◆ knife_reset_snap_angle_input()

static void knife_reset_snap_angle_input ( KnifeTool_OpData * kcd)
static

Definition at line 3644 of file editmesh_knife.cc.

References KnifeTool_OpData::num, NumInput::str, NumInput::str_cur, and NumInput::val.

Referenced by knifetool_modal().

◆ knife_sample_screen_density_from_closest_face()

static int knife_sample_screen_density_from_closest_face ( KnifeTool_OpData * kcd,
const float radius,
int ob_index,
BMFace * f,
const float cageco[3] )
static

Find the 2d screen space density of vertices within a radius. Used to scale snapping distance for picking edges/verts.

Arguments f and cageco should be the result of a call to knife_find_closest_face.

Definition at line 3153 of file editmesh_knife.cc.

References KnifeVert::cageco, ED_view3d_clipping_test(), KnifeEdge::is_invalid, KnifeVert::is_invalid, knife_get_face_kedges(), knife_project_v2(), len_squared_v2v2(), LISTBASE_FOREACH, ViewContext::rv3d, RV3D_CLIPPING_ENABLED, KnifeEdge::v1, KnifeEdge::v2, ViewContext::v3d, and KnifeTool_OpData::vc.

Referenced by knife_snap_size().

◆ knife_snap_angle_relative()

◆ knife_snap_angle_screen()

◆ knife_snap_curr()

◆ knife_snap_size()

static float knife_snap_size ( KnifeTool_OpData * kcd,
float maxsize )
static
Returns
the snapping distance for edges/verts, scaled by the density of the surrounding mesh (in screen space).
Note
Face values in kcd->curr must be up to date.

Definition at line 3206 of file editmesh_knife.cc.

References BLI_assert, KnifePosData::bmface, KnifePosData::cage, KnifeTool_OpData::curr, float, KnifeTool_OpData::is_interactive, KnifePosData::is_space(), knife_sample_screen_density_from_closest_face(), min_ff(), and KnifePosData::ob_index.

Referenced by knife_find_closest_edge_of_face(), and knife_find_closest_vert_of_edge().

◆ knife_snap_update_from_mval()

static void knife_snap_update_from_mval ( KnifeTool_OpData * kcd,
const float mval[2] )
static
Returns
true when kcd->curr.co & kcd->curr.cage are set.

In this case is_space is nearly always false. There are some situations when vertex or edge can be snapped to, when is_space is true. In this case the selection-buffer is used to select the face, then the closest vert or edge is set, and those will enable is_co_set.

Definition at line 3768 of file editmesh_knife.cc.

References KnifeTool_OpData::angle_snapping, KnifeTool_OpData::angle_snapping_mode, KnifeTool_OpData::axis_constrained, KnifePosData::cage, copy_v2_v2(), KnifeTool_OpData::curr, KnifeTool_OpData::is_angle_snapping, KNF_CONSTRAIN_ANGLE_MODE_RELATIVE, KNF_CONSTRAIN_ANGLE_MODE_SCREEN, knife_calculate_snap_ref_edges(), knife_constrain_axis(), knife_pos_data_clear(), knife_project_v2(), knife_snap_angle_relative(), knife_snap_angle_screen(), knife_snap_curr(), KnifeTool_OpData::mode, MODE_DRAGGING, KnifePosData::mval, KnifeTool_OpData::mval, KnifeTool_OpData::prev, and KnifeTool_OpData::snap_ref_edges_count.

Referenced by knife_update_active().

◆ knife_split_edge()

◆ knife_start_cut()

static void knife_start_cut ( KnifeTool_OpData * kcd,
const float2 & mval )
static

◆ knife_update_active()

static int knife_update_active ( KnifeTool_OpData * kcd)
static

Update active knife edge/vert pointers.

Definition at line 4097 of file editmesh_knife.cc.

References knife_find_line_hits(), knife_snap_update_from_mval(), KnifeTool_OpData::mode, MODE_DRAGGING, and KnifeTool_OpData::mval.

Referenced by knifetool_modal(), and knifetool_update_mval().

◆ knife_update_header()

◆ knife_verts_edge_in_face()

static bool knife_verts_edge_in_face ( KnifeVert * v1,
KnifeVert * v2,
BMFace * f )
static

◆ knifetool_cancel()

static void knifetool_cancel ( bContext * ,
wmOperator * op )
static

Definition at line 4175 of file editmesh_knife.cc.

References knifetool_exit().

Referenced by knifetool_invoke(), and MESH_OT_knife_tool().

◆ knifetool_disable_angle_snapping()

static void knifetool_disable_angle_snapping ( KnifeTool_OpData * kcd)
static

◆ knifetool_disable_orientation_locking()

static void knifetool_disable_orientation_locking ( KnifeTool_OpData * kcd)
static

◆ knifetool_draw()

static void knifetool_draw ( const bContext * ,
ARegion * ,
void * arg )
static

Definition at line 892 of file editmesh_knife.cc.

References KnifeTool_OpData::angle_snapping_mode, KnifeTool_OpData::axis_constrained, batch, BLI_mempool_iternew(), BLI_mempool_iterstep(), BLI_mempool_len(), KnifePosData::bmface, KnifePosData::cage, KnifeVert::cageco, KnifeTool_OpData::colors, KnifeColors::curpoint, KnifeColors::curpoint_a, KnifeTool_OpData::curr, KnifeTool_OpData::depth_test, KnifeColors::edge, KnifePosData::edge, KnifeColors::edge_extra, GPU_batch_create_ex(), GPU_batch_discard(), GPU_batch_draw(), GPU_batch_draw_range(), GPU_BATCH_OWNS_VBO, GPU_batch_program_set_builtin(), GPU_batch_uniform_4fv, GPU_blend(), GPU_BLEND_ALPHA, GPU_BLEND_NONE, GPU_COMP_F32, GPU_DEPTH_LESS_EQUAL, GPU_DEPTH_NONE, GPU_depth_test(), GPU_FETCH_FLOAT, GPU_line_width(), GPU_matrix_pop_projection(), GPU_matrix_push_projection(), GPU_point_size(), GPU_polygon_offset(), GPU_PRIM_LINES, GPU_PRIM_POINTS, GPU_SHADER_3D_UNIFORM_COLOR, GPU_vertbuf_attr_set(), GPU_vertbuf_create_with_format, GPU_vertbuf_data_alloc(), GPU_vertformat_attr_add(), immBegin(), immBeginBatchAtMost(), immBindBuiltinProgram(), immEnd(), immUnbindProgram(), immUniformColor3ubv(), immVertex3fv(), immVertexFormat(), KnifeTool_OpData::is_angle_snapping, KnifeEdge::is_cut, KnifeVert::is_cut, KnifeEdge::is_invalid, KnifeVert::is_invalid, KnifeTool_OpData::kedges, KNF_CONSTRAIN_ANGLE_MODE_RELATIVE, knifetool_draw_angle_snapping(), knifetool_draw_dist_angle(), knifetool_draw_orientation_locking(), KnifeTool_OpData::kverts, KnifeColors::line, KnifeTool_OpData::linehits, KnifeTool_OpData::mode, MODE_DRAGGING, KnifeColors::point, KnifeColors::point_a, pos, KnifeTool_OpData::prev, rgba_uchar_to_float(), KnifeTool_OpData::show_dist_angle, blender::Vector< T, InlineBufferCapacity, Allocator >::size(), KnifeTool_OpData::snap_ref_edge, KnifeTool_OpData::totkedge, KnifeTool_OpData::totkvert, UI_SCALE_FAC, KnifeEdge::v1, KnifeEdge::v2, and KnifePosData::vert.

Referenced by knifetool_init().

◆ knifetool_draw_angle()

◆ knifetool_draw_angle_snapping()

◆ knifetool_draw_dist_angle()

◆ knifetool_draw_orientation_locking()

◆ knifetool_draw_visible_angles()

◆ knifetool_draw_visible_distances()

◆ knifetool_exit()

static void knifetool_exit ( wmOperator * op)
static

Definition at line 4083 of file editmesh_knife.cc.

References wmOperator::customdata, and knifetool_exit_ex().

Referenced by knifetool_cancel(), and knifetool_modal().

◆ knifetool_exit_ex()

◆ knifetool_finish()

static void knifetool_finish ( wmOperator * op)
static

Definition at line 4163 of file editmesh_knife.cc.

References wmOperator::customdata, and knifetool_finish_ex().

Referenced by knifetool_modal().

◆ knifetool_finish_ex()

◆ knifetool_finish_single_post()

static void knifetool_finish_single_post ( KnifeTool_OpData * ,
Object * ob )
static

A post version is needed to delay recalculating tessellation after making cuts. Without this, knife-project can't use the BVH tree to select geometry after a cut, see: #98349.

Definition at line 4138 of file editmesh_knife.cc.

References BKE_editmesh_from_object(), Object::data, EDBM_selectmode_flush(), EDBM_update(), and params.

Referenced by EDBM_mesh_knife(), and knifetool_finish_ex().

◆ knifetool_finish_single_pre()

static void knifetool_finish_single_pre ( KnifeTool_OpData * kcd,
int ob_index )
static

Definition at line 4129 of file editmesh_knife.cc.

References knife_make_cuts().

Referenced by EDBM_mesh_knife(), and knifetool_finish_ex().

◆ knifetool_init()

static void knifetool_init ( ViewContext * vc,
KnifeTool_OpData * kcd,
Vector< Object * > objects,
const bool only_select,
const bool cut_through,
const bool xray,
const int visible_measurements,
const int angle_snapping,
const float angle_snapping_increment,
const bool is_interactive )
static

Definition at line 3943 of file editmesh_knife.cc.

References KnifeTool_OpData::angle_snapping, KnifeTool_OpData::angle_snapping_increment, KnifeTool_OpData::angle_snapping_mode, KnifeTool_OpData::arena, KnifeTool_OpData::axis_string, B_UNIT_NONE, BKE_editmesh_from_object(), BLI_ghash_ptr_new(), BLI_gset_ptr_new(), BLI_memarena_new(), BLI_MEMPOOL_ALLOW_ITER, BLI_mempool_create(), BLI_stack_new, KnifeTool_OpData::colors, KnifeTool_OpData::curr, KnifeTool_OpData::cut_through, KnifeTool_OpData::depth_test, KnifeTool_OpData::dist_angle_mode, KnifeTool_OpData::draw_handle, ED_region_draw_cb_activate(), ED_region_tag_redraw(), KnifeTool_OpData::edge_visit, KnifeTool_OpData::edgenet, KnifeTool_OpData::ethresh, KnifeTool_OpData::facetrimap, NumInput::idx_max, initNumInput(), KnifeTool_OpData::is_interactive, KnifeTool_OpData::kedgefacemap, KnifeTool_OpData::kedges, KMAXDIST, KNF_CONSTRAIN_ANGLE_MODE_NONE, KNF_MEASUREMENT_NONE, knife_bvh_init(), knife_init_colors(), knife_pos_data_clear(), knife_recalc_ortho(), knifetool_draw(), knifetool_init_obinfo(), KnifeTool_OpData::kverts, MEM_SIZE_OPTIMAL, KnifeTool_OpData::no_cuts, KnifeTool_OpData::num, NUM_NO_NEGATIVE, KnifeTool_OpData::objects, KnifeTool_OpData::objects_info, KnifeTool_OpData::only_select, KnifeTool_OpData::origedgemap, KnifeTool_OpData::origvertmap, KnifeTool_OpData::prev, KnifeTool_OpData::refs, KnifeTool_OpData::region, ViewContext::region, REGION_DRAW_POST_VIEW, blender::Array< T, InlineBufferCapacity, Allocator >::reinitialize(), SCE_SELECT_FACE, KnifeTool_OpData::scene, scene, ViewContext::scene, KnifeTool_OpData::select_result, BMEditMesh::selectmode, KnifeTool_OpData::show_dist_angle, blender::Vector< T, InlineBufferCapacity, Allocator >::size(), KnifeTool_OpData::splitstack, ARegion::type, KnifeTool_OpData::undostack, NumInput::unit_sys, NumInput::unit_type, NumInput::val_flag, KnifeTool_OpData::vc, and KnifeTool_OpData::vthresh.

Referenced by EDBM_mesh_knife(), and knifetool_invoke().

◆ knifetool_init_obinfo()

◆ knifetool_invoke()

◆ knifetool_modal()

static int knifetool_modal ( bContext * C,
wmOperator * op,
const wmEvent * event )
static

Definition at line 4244 of file editmesh_knife.cc.

References KnifeTool_OpData::angle_snapping, KnifeTool_OpData::angle_snapping_increment, KnifeTool_OpData::angle_snapping_mode, applyNumInput(), KnifeTool_OpData::axis_constrained, KnifeTool_OpData::axis_string, BLI_stack_is_empty(), KnifePosData::cage, KnifeTool_OpData::constrain_axis, KnifeTool_OpData::constrain_axis_mode, KnifeTool_OpData::curr, wmOperator::customdata, KnifeTool_OpData::cut_through, KnifeTool_OpData::depth_test, KnifeTool_OpData::dist_angle_mode, ED_region_tag_redraw(), ED_view3d_init_mats_rv3d(), ED_workspace_status_text(), ELEM, EVT_MODAL_MAP, wmOperator::flag, handleNumInput(), hasNumInput(), KnifeTool_OpData::ignore_edge_snapping, KnifeTool_OpData::ignore_vert_snapping, KnifeTool_OpData::init, KnifeTool_OpData::is_drag_hold, KnifeTool_OpData::is_drag_undo, KM_PRESS, KM_RELEASE, KNF_CONSTRAIN_ANGLE_MODE_NONE, KNF_CONSTRAIN_ANGLE_MODE_RELATIVE, KNF_CONSTRAIN_AXIS_MODE_GLOBAL, KNF_CONSTRAIN_AXIS_MODE_LOCAL, KNF_CONSTRAIN_AXIS_MODE_NONE, KNF_CONSTRAIN_AXIS_NONE, KNF_CONSTRAIN_AXIS_X, KNF_CONSTRAIN_AXIS_Y, KNF_CONSTRAIN_AXIS_Z, KNF_MEASUREMENT_ANGLE, KNF_MEASUREMENT_NONE, KNF_MODAL_ADD_CUT, KNF_MODAL_ADD_CUT_CLOSED, KNF_MODAL_ANGLE_SNAP_TOGGLE, KNF_MODAL_CANCEL, KNF_MODAL_CONFIRM, KNF_MODAL_CUT_THROUGH_TOGGLE, KNF_MODAL_CYCLE_ANGLE_SNAP_EDGE, KNF_MODAL_DEPTH_TEST_TOGGLE, KNF_MODAL_IGNORE_SNAP_OFF, KNF_MODAL_IGNORE_SNAP_ON, KNF_MODAL_MIDPOINT_OFF, KNF_MODAL_MIDPOINT_ON, KNF_MODAL_NEW_CUT, KNF_MODAL_PANNING, KNF_MODAL_SHOW_DISTANCE_ANGLE_TOGGLE, KNF_MODAL_UNDO, KNF_MODAL_X_AXIS, KNF_MODAL_Y_AXIS, KNF_MODAL_Z_AXIS, knife_add_cut(), knife_finish_cut(), KNIFE_MAX_ANGLE_SNAPPING_INCREMENT, KNIFE_MIN_ANGLE_SNAPPING_INCREMENT, knife_project_v2(), knife_recalc_ortho(), knife_reset_snap_angle_input(), knife_start_cut(), knife_update_active(), knife_update_header(), knifetool_disable_angle_snapping(), knifetool_disable_orientation_locking(), knifetool_exit(), knifetool_finish(), knifetool_undo(), knifetool_update_mval(), knifetool_update_mval_i(), KnifeTool_OpData::linehits, KnifeTool_OpData::mode, MODE_DRAGGING, MODE_IDLE, MODE_PANNING, MOUSEMOVE, MOUSEPAN, MOUSEROTATE, MOUSEZOOM, KnifePosData::mval, wmEvent::mval, NDOF_MOTION, KnifeTool_OpData::no_cuts, KnifeTool_OpData::num, KnifePosData::ob_index, OB_MESH, ViewContext::obedit, KnifeTool_OpData::objects, OP_IS_MODAL_CURSOR_REGION, OPERATOR_CANCELLED, OPERATOR_FINISHED, OPERATOR_PASS_THROUGH, OPERATOR_RUNNING_MODAL, KnifeTool_OpData::prev, wmEvent::prev_val, KnifeTool_OpData::prevmode, wmOperator::ptr, RAD2DEGF, KnifeTool_OpData::region, ViewContext::region, RNA_float_get(), ViewContext::rv3d, KnifeTool_OpData::show_dist_angle, blender::Vector< T, InlineBufferCapacity, Allocator >::size(), KnifeTool_OpData::snap_edge, KnifeTool_OpData::snap_midpoints, KnifeTool_OpData::snap_ref_edges_count, NumInput::str_cur, KnifeTool_OpData::totkvert, Object::type, wmEvent::type, KnifeTool_OpData::undostack, wmEvent::val, KnifeTool_OpData::vc, WHEELDOWNMOUSE, and WHEELUPMOUSE.

Referenced by knifetool_invoke(), and MESH_OT_knife_tool().

◆ knifetool_modal_keymap()

◆ knifetool_raycast_planes()

◆ knifetool_recast_cageco()

static void UNUSED_FUNCTION knifetool_recast_cageco ( KnifeTool_OpData * kcd,
float mval[3],
float r_cage[3] )
static

◆ knifetool_undo()

static void knifetool_undo ( KnifeTool_OpData * kcd)
static

TODO: Undo currently assumes that the most recent cut segment added is the last valid KnifeEdge in the kcd->kedges mempool. This could break in the future so it may be better to store the KnifeEdges for each KnifeUndoFrame on a stack. This stack could then be used instead of iterating over the mempool.

Definition at line 3806 of file editmesh_knife.cc.

References BLI_mempool_iternew(), BLI_mempool_iterstep(), BLI_stack_discard(), BLI_stack_peek(), BLI_stack_pop(), KnifeUndoFrame::cuts, KnifeVert::edges, KnifeEdge::is_cut, KnifeEdge::is_invalid, KnifeVert::is_invalid, KnifeVert::is_splitting, KnifeTool_OpData::kedges, knife_join_edge(), LISTBASE_FOREACH, KnifeTool_OpData::mdata, KnifeUndoFrame::mdata, KnifeTool_OpData::mode, MODE_DRAGGING, KnifeUndoFrame::pos, KnifeTool_OpData::prev, KnifeEdge::splits, KnifeUndoFrame::splits, KnifeTool_OpData::splitstack, KnifeTool_OpData::undostack, KnifeEdge::v1, KnifeEdge::v2, and v2.

Referenced by knifetool_modal().

◆ knifetool_update_mval()

static void knifetool_update_mval ( KnifeTool_OpData * kcd,
const float mval[2] )
static

◆ knifetool_update_mval_i()

static void knifetool_update_mval_i ( KnifeTool_OpData * kcd,
const int mval_i[2] )
static

Definition at line 4117 of file editmesh_knife.cc.

References float, and knifetool_update_mval().

Referenced by knifetool_modal().

◆ linehit_compare()

static int linehit_compare ( const KnifeLineHit & lh1,
const KnifeLineHit & lh2 )
static

Definition at line 1858 of file editmesh_knife.cc.

References KnifeLineHit::l, KnifeLineHit::m, and KnifeLineHit::v.

Referenced by prepare_linehits_for_cut().

◆ linehit_to_knifepos()

◆ MESH_OT_knife_tool()

◆ new_knife_edge()

static KnifeEdge * new_knife_edge ( KnifeTool_OpData * kcd)
static

◆ new_knife_vert()

static KnifeVert * new_knife_vert ( KnifeTool_OpData * kcd,
const float co[3],
const float cageco[3] )
static

◆ point_is_visible()

static bool point_is_visible ( KnifeTool_OpData * kcd,
const float p[3],
const float s[2],
BMElem * ele_test )
static

Check if p is visible (not clipped, not occluded by another face). s in screen projection of p.

Parameters
ele_testOptional vert/edge/face to use when p is on the surface of the geometry, intersecting faces matching this face (or connected when an vert/edge) will be ignored.

Definition at line 2643 of file editmesh_knife.cc.

References bm_ray_cast_cb_elem_not_in_face_check(), View3D::clip_end, RegionView3D::clip_local, clip_segment_v3_plane_n(), copy_v3_v3(), KnifeTool_OpData::cut_through, ED_view3d_clipping_test(), ED_view3d_unproject_v3(), KnifeTool_OpData::is_ortho, knife_bvh_raycast(), knife_bvh_raycast_filter(), KNIFE_FLT_EPS, len_v3v3(), madd_v3_v3v3fl(), normalize_v3(), RegionView3D::persp, ViewContext::region, ViewContext::rv3d, RV3D_CAMOB, RV3D_CLIPPING_ENABLED, sub_v3_v3(), ViewContext::v3d, and KnifeTool_OpData::vc.

Referenced by EDBM_mesh_knife(), knife_find_line_hits(), and knife_linehit_face_test().

◆ prepare_linehits_for_cut()

◆ set_lowest_face_tri()

static void set_lowest_face_tri ( KnifeTool_OpData * kcd,
BMEditMesh * em,
BMFace * f,
int index )
static

◆ snap_v2_angle()

static float snap_v2_angle ( float r[2],
const float v[2],
const float v_ref[2],
float angle_snap )
static

Snaps a 2d vector to an angle, relative to v_ref.

Definition at line 3395 of file editmesh_knife.cc.

References angle(), angle_signed_v2v2(), angle_to_mat2(), BLI_ASSERT_UNIT_V2, mul_v2_m2v2(), normalize_v2_v2(), and v.

Referenced by knife_snap_angle_screen().

◆ snap_v3_angle_plane()

static float snap_v3_angle_plane ( float r[3],
const float v[3],
const float v_ref[3],
const float plane_no[3],
float snap_step )
static

Snaps a 3d vector to an angle, relative to v_ref, along the plane with normal plane_no.

Definition at line 3446 of file editmesh_knife.cc.

References angle(), angle_signed_on_axis_v3v3_v3(), rotate_v3_v3v3fl(), and v.

Referenced by knife_snap_angle_relative().

◆ sort_verts_by_dist_cb()

static int sort_verts_by_dist_cb ( void * co_p,
const void * cur_a_p,
const void * cur_b_p )
static

Definition at line 2210 of file editmesh_knife.cc.

References KnifeVert::co, and len_squared_v3v3().

Referenced by knife_make_cuts().