Blender  V2.93
Classes | Macros | Typedefs | Enumerations
editmesh_knife.c File Reference
#include "MEM_guardedalloc.h"
#include "BLI_alloca.h"
#include "BLI_array.h"
#include "BLI_linklist.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_smallhash.h"
#include "BLI_string.h"
#include "BLT_translation.h"
#include "BKE_bvhutils.h"
#include "BKE_context.h"
#include "BKE_editmesh.h"
#include "BKE_editmesh_bvh.h"
#include "BKE_report.h"
#include "GPU_immediate.h"
#include "GPU_matrix.h"
#include "GPU_state.h"
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_view3d.h"
#include "WM_api.h"
#include "WM_types.h"
#include "DNA_object_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "RNA_access.h"
#include "RNA_define.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
#include "mesh_intern.h"

Go to the source code of this file.

Classes

struct  KnifeColors
 
struct  KnifeVert
 
struct  Ref
 
struct  KnifeEdge
 
struct  KnifeLineHit
 
struct  KnifePosData
 
struct  KnifeTool_OpData
 

Macros

#define USE_NET_ISLAND_CONNECT
 
#define KMAXDIST   (10 * U.dpi_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 WM_MODALKEY(_id)
 
#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)
 

Typedefs

typedef struct KnifeColors KnifeColors
 
typedef struct KnifeVert KnifeVert
 
typedef struct Ref Ref
 
typedef struct KnifeEdge KnifeEdge
 
typedef struct KnifeLineHit KnifeLineHit
 
typedef struct KnifePosData KnifePosData
 
typedef struct KnifeTool_OpData KnifeTool_OpData
 

Enumerations

enum  {
  KNF_MODAL_CANCEL = 1 , KNF_MODAL_CONFIRM , 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_CUT_THROUGH_TOGGLE , KNF_MODAL_PANNING , KNF_MODAL_ADD_CUT_CLOSED
}
 

Functions

Drawing
static void knifetool_draw_angle_snapping (const KnifeTool_OpData *kcd)
 
static void knifetool_draw (const bContext *UNUSED(C), ARegion *UNUSED(region), void *arg)
 
Header
static void knife_update_header (bContext *C, wmOperator *op, KnifeTool_OpData *kcd)
 
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], const float ofs, float r_origin[3], float r_origin_ofs[3])
 
static bool knife_verts_edge_in_face (KnifeVert *v1, KnifeVert *v2, BMFace *f)
 
static void knife_recalc_projmat (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 Reffind_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)
 
static KnifeEdgeget_bm_knife_edge (KnifeTool_OpData *kcd, BMEdge *e)
 
static ListBaseknife_get_face_kedges (KnifeTool_OpData *kcd, 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)
 
Cut/Hit Utils
static void knife_start_cut (KnifeTool_OpData *kcd)
 
static void linehit_to_knifepos (KnifePosData *kpos, KnifeLineHit *lh)
 
static int linehit_compare (const void *vlh1, const void *vlh2)
 
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, 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)
 
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, 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], 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 set_linehit_depth (KnifeTool_OpData *kcd, KnifeLineHit *lh)
 
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 BMFaceknife_find_closest_face (KnifeTool_OpData *kcd, float co[3], float cageco[3], bool *is_space)
 
static int knife_sample_screen_density_from_closest_face (KnifeTool_OpData *kcd, const float radius, BMFace *f, const float cageco[3])
 
static float knife_snap_size (KnifeTool_OpData *kcd, float maxsize)
 
static bool knife_snap_edge_in_angle (KnifeTool_OpData *kcd, const float sco[3], const float kfv1_sco[2], const float kfv2_sco[2], float *r_dist_sq, float *r_lambda)
 
static void knife_interp_v3_v3v3 (const KnifeTool_OpData *kcd, float r_co[3], const float v1[3], const float v2[3], float lambda_ss)
 
static KnifeEdgeknife_find_closest_edge_of_face (KnifeTool_OpData *kcd, BMFace *f, float p[3], float cagep[3])
 
static KnifeVertknife_find_closest_vert_of_edge (KnifeTool_OpData *kcd, KnifeEdge *kfe, float p[3], float cagep[3])
 
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 (KnifeTool_OpData *kcd)
 
static bool knife_snap_update_from_mval (KnifeTool_OpData *kcd, const float mval[2])
 
#KnifeTool_OpData (#op->customdata) Init and Free
static void knifetool_init_bmbvh (KnifeTool_OpData *kcd)
 
static void knifetool_free_bmbvh (KnifeTool_OpData *kcd)
 
static void knife_init_colors (KnifeColors *colors)
 
static void knifetool_init (bContext *C, KnifeTool_OpData *kcd, const bool only_select, const bool cut_through, const bool is_interactive)
 
static void knifetool_exit_ex (bContext *C, KnifeTool_OpData *kcd)
 
static void knifetool_exit (bContext *C, 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_ex (KnifeTool_OpData *kcd)
 
static void knifetool_finish (wmOperator *op)
 
Operator (#MESH_OT_knife_tool)
static void knifetool_cancel (bContext *C, wmOperator *op)
 
wmKeyMapknifetool_modal_keymap (wmKeyConfig *keyconf)
 
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 (bContext *C, LinkNode *polys, bool use_tag, bool cut_through)
 

Detailed Description

Interactive editmesh knife tool.

Definition in file editmesh_knife.c.

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)

◆ F_ISECT_SET_OUTSIDE

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

◆ F_ISECT_SET_UNKNOWN

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

◆ KMAXDIST

#define KMAXDIST   (10 * U.dpi_fac) /* max mouse distance from edge before not detecting it */

Definition at line 77 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS

#define KNIFE_FLT_EPS   0.00001f

Definition at line 82 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_PX_EDGE

#define KNIFE_FLT_EPS_PX_EDGE   0.05f

Definition at line 87 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_PX_FACE

#define KNIFE_FLT_EPS_PX_FACE   0.05f

Definition at line 88 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_PX_VERT

#define KNIFE_FLT_EPS_PX_VERT   0.5f

Definition at line 86 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_SQUARED

#define KNIFE_FLT_EPS_SQUARED   (KNIFE_FLT_EPS * KNIFE_FLT_EPS)

Definition at line 83 of file editmesh_knife.c.

◆ KNIFE_FLT_EPSBIG

#define KNIFE_FLT_EPSBIG   0.0005f

Definition at line 84 of file editmesh_knife.c.

◆ USE_NET_ISLAND_CONNECT

#define USE_NET_ISLAND_CONNECT

Definition at line 75 of file editmesh_knife.c.

◆ WM_MODALKEY

#define WM_MODALKEY (   _id)
Value:
op->type, (_id), true, UI_MAX_SHORTCUT_STR, &available_len, &p)
#define UI_MAX_SHORTCUT_STR
Definition: UI_interface.h:92
char * WM_modalkeymap_operator_items_to_string_buf(wmOperatorType *ot, const int propvalue, const bool compact, const int max_len, int *r_available_len, char **r_result)
Definition: wm_keymap.c:1270

Typedef Documentation

◆ KnifeColors

typedef struct KnifeColors KnifeColors

◆ KnifeEdge

typedef struct KnifeEdge KnifeEdge

◆ KnifeLineHit

typedef struct KnifeLineHit KnifeLineHit

◆ KnifePosData

typedef struct KnifePosData KnifePosData

◆ KnifeTool_OpData

◆ KnifeVert

typedef struct KnifeVert KnifeVert

◆ Ref

typedef struct Ref Ref

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
KNF_MODAL_CANCEL 
KNF_MODAL_CONFIRM 
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_CUT_THROUGH_TOGGLE 
KNF_MODAL_PANNING 
KNF_MODAL_ADD_CUT_CLOSED 

Definition at line 251 of file editmesh_knife.c.

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 691 of file editmesh_knife.c.

References KnifeEdge::basef, KnifeEdge::e, if(), and NULL.

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()

static void calc_ortho_extent ( KnifeTool_OpData kcd)
static

◆ 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 1667 of file editmesh_knife.c.

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

Referenced by bm_ray_cast_cb_elem_not_in_face_check().

◆ EDBM_mesh_knife()

void EDBM_mesh_knife ( bContext C,
LinkNode polys,
bool  use_tag,
bool  cut_through 
)

◆ edbm_mesh_knife_point_isect()

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

Definition at line 3146 of file editmesh_knife.c.

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

Referenced by EDBM_mesh_knife().

◆ find_ref()

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

◆ get_bm_knife_edge()

static KnifeEdge* get_bm_knife_edge ( KnifeTool_OpData kcd,
BMEdge e 
)
static

◆ get_bm_knife_vert()

static KnifeVert* get_bm_knife_vert ( KnifeTool_OpData kcd,
BMVert v 
)
static

◆ get_lowest_face_tri()

static int get_lowest_face_tri ( KnifeTool_OpData kcd,
BMFace f 
)
static

◆ knife_add_cut()

static void knife_add_cut ( KnifeTool_OpData kcd)
static

◆ 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 755 of file editmesh_knife.c.

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

Referenced by knife_split_edge().

◆ knife_add_single_cut()

static void knife_add_single_cut ( KnifeTool_OpData kcd,
KnifeLineHit lh1,
KnifeLineHit lh2,
BMFace f 
)
static

◆ 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 1100 of file editmesh_knife.c.

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, KnifeVert::v, and KnifeLineHit::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()

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

◆ knife_append_list_no_dup()

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

Definition at line 741 of file editmesh_knife.c.

References find_ref(), and knife_append_list().

Referenced by add_hit_to_facehits().

◆ knife_cut_face()

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

Definition at line 1203 of file editmesh_knife.c.

References BLI_listbase_count_at_most(), ListBase::first, knife_add_single_cut(), and r.

Referenced by knife_add_cut().

◆ 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()

static KnifeEdge* knife_find_closest_edge_of_face ( KnifeTool_OpData kcd,
BMFace f,
float  p[3],
float  cagep[3] 
)
static

◆ knife_find_closest_face()

static BMFace* knife_find_closest_face ( KnifeTool_OpData kcd,
float  co[3],
float  cageco[3],
bool *  is_space 
)
static

◆ knife_find_closest_vert_of_edge()

static KnifeVert* knife_find_closest_vert_of_edge ( KnifeTool_OpData kcd,
KnifeEdge kfe,
float  p[3],
float  cagep[3] 
)
static

◆ knife_find_common_face()

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

Definition at line 767 of file editmesh_knife.c.

References ListBase::first, Ref::next, NULL, and Ref::ref.

Referenced by knife_split_edge().

◆ knife_find_line_hits()

static void knife_find_line_hits ( KnifeTool_OpData kcd)
static

Definition at line 1826 of file editmesh_knife.c.

References BKE_bmbvh_tree_get(), BLI_array_append, BLI_array_declare, BLI_array_len, BLI_bvhtree_intersect_plane(), BLI_smallhash_haskey(), BLI_smallhash_init(), BLI_smallhash_insert(), BLI_smallhash_iternew(), BLI_smallhash_iternew_p(), BLI_smallhash_iternext(), BLI_smallhash_iternext_p(), BLI_smallhash_lookup(), BLI_smallhash_reinsert(), BLI_smallhash_release(), BM_elem_flag_test, bm_elem_from_knife_edge(), bm_elem_from_knife_vert(), BM_ELEM_SELECT, KnifeTool_OpData::bmbvh, KnifePosData::cage, KnifeVert::cageco, KnifeLineHit::cagehit, calc_ortho_extent(), clip_to_ortho_planes(), closest_to_line_segment_v2(), BMVert::co, KnifeVert::co, copy_v2_v2(), copy_v3_v3(), cross_v3_v3v3(), KnifeTool_OpData::curr, ViewContext::depsgraph, dist_squared_to_line_segment_v2(), ED_view3d_win_to_segment_clipped(), KnifePosData::edge, ELEM, KnifeTool_OpData::em, BMLoop::f, KnifeLineHit::f, fabsf, faces, ListBase::first, KnifeLineHit::hit, KnifeTool_OpData::is_drag_hold, KnifeTool_OpData::is_interactive, KnifeTool_OpData::is_ortho, isect_line_line_v3(), isect_seg_seg_v2_point_ex(), KnifeLineHit::kfe, 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_project_v2(), knife_ray_intersect_face(), KnifeLineHit::l, len_squared_v2v2(), len_v2v2(), KnifeTool_OpData::linehits, BMEditMesh::looptris, MEM_freeN, mid_v2_v2v2(), mid_v3_v3v3(), mul_m4_v3(), KnifePosData::mval, Ref::next, NULL, KnifeTool_OpData::ob_imat, KnifeTool_OpData::only_select, KnifeTool_OpData::ortho_extent, KnifeTool_OpData::ortho_extent_center, KnifeLineHit::perc, RegionView3D::persp, plane_from_point_normal_v3(), point_is_visible(), KnifeTool_OpData::prev, Ref::ref, KnifeTool_OpData::region, result, ViewContext::rv3d, RV3D_CAMOB, KnifeLineHit::schit, set_linehit_depth(), set_lowest_face_tri(), KnifeTool_OpData::snap_midpoints, sub_v3_v3v3(), KnifeTool_OpData::totlinehit, transform_point_by_seg_v3(), tree, v, KnifeLineHit::v, KnifeEdge::v1, v1, v2, KnifeEdge::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()

static ListBase* knife_get_face_kedges ( KnifeTool_OpData kcd,
BMFace f 
)
static

◆ knife_init_colors()

static void knife_init_colors ( KnifeColors colors)
static

◆ knife_input_ray_segment()

static void knife_input_ray_segment ( KnifeTool_OpData kcd,
const float  mval[2],
const float  ofs,
float  r_origin[3],
float  r_origin_ofs[3] 
)
static

◆ knife_interp_v3_v3v3()

static void knife_interp_v3_v3v3 ( const KnifeTool_OpData kcd,
float  r_co[3],
const float  v1[3],
const float  v2[3],
float  lambda_ss 
)
static

◆ knife_make_cuts()

static void knife_make_cuts ( KnifeTool_OpData kcd)
static

◆ knife_make_face_cuts()

static void knife_make_face_cuts ( KnifeTool_OpData kcd,
BMFace f,
ListBase kfedges 
)
static

◆ knife_pos_data_clear()

static void knife_pos_data_clear ( KnifePosData kpd)
static

◆ knife_project_v2()

static void knife_project_v2 ( const KnifeTool_OpData kcd,
const float  co[3],
float  sco[2] 
)
static

◆ 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],
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 1574 of file editmesh_knife.c.

References BLI_assert, BM_elem_index_get, KnifeVert::cageco, KnifeTool_OpData::cagecos, BMVert::co, dist_squared_to_line_segment_v2(), dist_squared_to_plane_v3(), KnifeTool_OpData::em, ListBase::first, get_lowest_face_tri(), interp_v3_v3v3v3_uv(), isect_ray_tri_epsilon_v3(), KNIFE_FLT_EPS, knife_get_face_kedges(), knife_project_v2(), BMEditMesh::looptris, Ref::next, normal_tri_v3(), normalize_v3(), plane_from_point_normal_v3(), Ref::ref, sub_v3_v3v3(), BMEditMesh::tottri, BMLoop::v, v, KnifeEdge::v1, v1, v2, and KnifeEdge::v2.

Referenced by knife_find_line_hits().

◆ knife_recalc_projmat()

static void knife_recalc_projmat ( KnifeTool_OpData kcd)
static

◆ knife_sample_screen_density_from_closest_face()

static int knife_sample_screen_density_from_closest_face ( KnifeTool_OpData kcd,
const float  radius,
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 2226 of file editmesh_knife.c.

References Freestyle::c, KnifeVert::cageco, ED_view3d_clipping_test(), ListBase::first, knife_get_face_kedges(), knife_project_v2(), len_squared_v2v2(), Ref::next, Ref::ref, ViewContext::rv3d, RV3D_CLIPPING_ENABLED, KnifeEdge::v1, KnifeEdge::v2, ViewContext::v3d, and KnifeTool_OpData::vc.

Referenced by knife_snap_size().

◆ knife_snap_angle()

static bool knife_snap_angle ( KnifeTool_OpData kcd)
static

◆ knife_snap_edge_in_angle()

static bool knife_snap_edge_in_angle ( KnifeTool_OpData kcd,
const float  sco[3],
const float  kfv1_sco[2],
const float  kfv2_sco[2],
float r_dist_sq,
float r_lambda 
)
static

◆ 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 2274 of file editmesh_knife.c.

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(), and min_ff().

Referenced by knife_find_closest_edge_of_face(), and knife_find_closest_vert_of_edge().

◆ knife_snap_update_from_mval()

static bool 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 2545 of file editmesh_knife.c.

References KnifeTool_OpData::angle_snapping, KnifePosData::bmface, KnifePosData::cage, KnifePosData::co, copy_v2_v2(), KnifeTool_OpData::curr, KnifePosData::edge, KnifeTool_OpData::ignore_edge_snapping, KnifeTool_OpData::is_angle_snapping, KnifePosData::is_space, knife_find_closest_edge_of_face(), knife_find_closest_face(), knife_find_closest_vert_of_edge(), knife_pos_data_clear(), knife_project_v2(), knife_snap_angle(), KnifeTool_OpData::mode, KnifePosData::mval, NULL, KnifeTool_OpData::prev, and KnifePosData::vert.

Referenced by knife_update_active().

◆ knife_split_edge()

static KnifeVert* knife_split_edge ( KnifeTool_OpData kcd,
KnifeEdge kfe,
const float  co[3],
const float  cageco[3],
KnifeEdge **  r_kfe 
)
static

◆ knife_start_cut()

static void knife_start_cut ( KnifeTool_OpData kcd)
static

◆ knife_update_active()

static int knife_update_active ( KnifeTool_OpData kcd)
static

◆ knife_update_header()

static void knife_update_header ( bContext C,
wmOperator op,
KnifeTool_OpData kcd 
)
static

◆ 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 C,
wmOperator op 
)
static

Definition at line 2829 of file editmesh_knife.c.

References C, and knifetool_exit().

Referenced by MESH_OT_knife_tool().

◆ knifetool_draw()

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

Definition at line 341 of file editmesh_knife.c.

References batch, BLI_mempool_iternew(), BLI_mempool_iterstep(), BLI_mempool_len(), KnifePosData::bmface, KnifePosData::cage, KnifeVert::cageco, KnifeLineHit::cagehit, KnifeTool_OpData::colors, KnifeColors::curpoint, KnifeColors::curpoint_a, KnifeTool_OpData::curr, KnifeColors::edge, KnifePosData::edge, 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_mul, GPU_matrix_pop(), GPU_matrix_pop_projection(), GPU_matrix_push(), 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(), GPUBatch, immBegin(), immBeginBatchAtMost(), immBindBuiltinProgram(), immEnd(), immUnbindProgram(), immUniformColor3ubv(), immVertex3fv(), immVertexFormat(), KnifeTool_OpData::is_angle_snapping, KnifeVert::is_cut, KnifeEdge::is_cut, KnifeTool_OpData::kedges, knifetool_draw_angle_snapping(), KnifeTool_OpData::kverts, KnifeColors::line, KnifeTool_OpData::linehits, KnifeTool_OpData::mode, NULL, KnifeTool_OpData::ob, Object::obmat, KnifeColors::point, KnifeColors::point_a, pos, KnifeTool_OpData::prev, rgba_uchar_to_float(), KnifeTool_OpData::totkedge, KnifeTool_OpData::totkvert, KnifeTool_OpData::totlinehit, UI_DPI_FAC, KnifeLineHit::v, KnifeEdge::v1, KnifeEdge::v2, and KnifePosData::vert.

Referenced by knifetool_init().

◆ knifetool_draw_angle_snapping()

static void knifetool_draw_angle_snapping ( const KnifeTool_OpData kcd)
static

◆ knifetool_exit()

static void knifetool_exit ( bContext C,
wmOperator op 
)
static

Definition at line 2741 of file editmesh_knife.c.

References C, wmOperator::customdata, knifetool_exit_ex(), and NULL.

Referenced by knifetool_cancel(), and knifetool_modal().

◆ knifetool_exit_ex()

static void knifetool_exit_ex ( bContext C,
KnifeTool_OpData kcd 
)
static

◆ knifetool_finish()

static void knifetool_finish ( wmOperator op)
static

Definition at line 2817 of file editmesh_knife.c.

References wmOperator::customdata, and knifetool_finish_ex().

Referenced by knifetool_modal().

◆ knifetool_finish_ex()

static void knifetool_finish_ex ( KnifeTool_OpData kcd)
static

◆ knifetool_free_bmbvh()

static void knifetool_free_bmbvh ( KnifeTool_OpData kcd)
static

◆ knifetool_init()

static void knifetool_init ( bContext C,
KnifeTool_OpData kcd,
const bool  only_select,
const bool  cut_through,
const bool  is_interactive 
)
static

◆ knifetool_init_bmbvh()

static void knifetool_init_bmbvh ( KnifeTool_OpData kcd)
static

◆ knifetool_invoke()

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

◆ knifetool_modal()

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

Definition at line 2867 of file editmesh_knife.c.

References KnifeTool_OpData::angle_snapping, BKE_editmesh_from_object(), C, KnifePosData::cage, CTX_data_edit_object(), KnifeTool_OpData::curr, wmOperator::customdata, KnifeTool_OpData::cut_through, ED_region_tag_redraw(), ED_view3d_init_mats_rv3d(), ED_workspace_status_text(), KnifeTool_OpData::em, em_setup_viewcontext(), EVT_MODAL_MAP, wmOperator::flag, KnifeTool_OpData::ignore_edge_snapping, KnifeTool_OpData::ignore_vert_snapping, KnifeTool_OpData::init, KnifeTool_OpData::is_drag_hold, KM_RELEASE, 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_IGNORE_SNAP_OFF, KNF_MODAL_IGNORE_SNAP_ON, KNF_MODAL_MIDPOINT_OFF, KNF_MODAL_MIDPOINT_ON, KNF_MODAL_NEW_CUT, KNF_MODAL_PANNING, knife_add_cut(), knife_finish_cut(), knife_project_v2(), knife_recalc_projmat(), knife_start_cut(), knife_update_active(), knife_update_header(), knifetool_exit(), knifetool_finish(), knifetool_update_mval(), knifetool_update_mval_i(), KnifeTool_OpData::mode, MOUSEMOVE, MOUSEPAN, MOUSEROTATE, MOUSEZOOM, KnifePosData::mval, wmEvent::mval, NDOF_MOTION, NULL, OB_MESH, OP_IS_MODAL_CURSOR_REGION, OPERATOR_CANCELLED, OPERATOR_FINISHED, OPERATOR_PASS_THROUGH, OPERATOR_RUNNING_MODAL, KnifeTool_OpData::prev, KnifeTool_OpData::prevmode, wmEvent::prevval, ViewContext::region, KnifeTool_OpData::region, ViewContext::rv3d, KnifeTool_OpData::snap_midpoints, KnifeTool_OpData::totlinehit, Object::type, wmEvent::type, wmEvent::val, KnifeTool_OpData::vc, WHEELDOWNMOUSE, and WHEELUPMOUSE.

Referenced by knifetool_invoke(), and MESH_OT_knife_tool().

◆ knifetool_modal_keymap()

wmKeyMap* knifetool_modal_keymap ( wmKeyConfig keyconf)

◆ 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 2792 of file editmesh_knife.c.

References knifetool_update_mval(), and UNPACK2.

Referenced by knifetool_invoke(), and knifetool_modal().

◆ linehit_compare()

static int linehit_compare ( const void *  vlh1,
const void *  vlh2 
)
static

Definition at line 976 of file editmesh_knife.c.

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

Referenced by prepare_linehits_for_cut().

◆ linehit_to_knifepos()

static void linehit_to_knifepos ( KnifePosData kpos,
KnifeLineHit lh 
)
static

◆ MESH_OT_knife_tool()

void MESH_OT_knife_tool ( wmOperatorType ot)

◆ 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 1729 of file editmesh_knife.c.

References BKE_bmbvh_ray_cast(), BKE_bmbvh_ray_cast_filter(), bm_ray_cast_cb_elem_not_in_face_check(), KnifeTool_OpData::bmbvh, 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(), KnifeTool_OpData::is_ortho, KNIFE_FLT_EPS, len_v3v3(), madd_v3_v3v3fl(), mul_m4_v3(), normalize_v3(), NULL, KnifeTool_OpData::ob_imat, RegionView3D::persp, ViewContext::region, ViewContext::rv3d, RV3D_CAMOB, RV3D_CLIPPING_ENABLED, sub_v3_v3(), ViewContext::v3d, KnifeTool_OpData::vc, and view.

Referenced by EDBM_mesh_knife(), and knife_find_line_hits().

◆ prepare_linehits_for_cut()

static void prepare_linehits_for_cut ( KnifeTool_OpData kcd)
static

◆ set_linehit_depth()

static void set_linehit_depth ( KnifeTool_OpData kcd,
KnifeLineHit lh 
)
static

◆ set_lowest_face_tri()

static void set_lowest_face_tri ( KnifeTool_OpData kcd,
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 2499 of file editmesh_knife.c.

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

Referenced by knife_snap_angle().

◆ 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 1329 of file editmesh_knife.c.

References KnifeVert::co, and len_squared_v3v3().

Referenced by knife_make_cuts().