Blender  V3.3
Classes | Macros | Typedefs | Enumerations
editmesh_knife.c File Reference
#include "MEM_guardedalloc.h"
#include "BLF_api.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_stack.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_layer.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_unit.h"
#include "GPU_immediate.h"
#include "GPU_matrix.h"
#include "GPU_state.h"
#include "ED_mesh.h"
#include "ED_numinput.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_transform.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  KnifeMeasureData
 
struct  KnifeUndoFrame
 
struct  KnifeBVH
 
struct  KnifeObjectInfo
 
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 KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT   30.0f
 
#define KNIFE_MIN_ANGLE_SNAPPING_INCREMENT   0.0f
 
#define KNIFE_MAX_ANGLE_SNAPPING_INCREMENT   180.0f
 
#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 KnifeMeasureData KnifeMeasureData
 
typedef struct KnifeUndoFrame KnifeUndoFrame
 
typedef struct KnifeBVH KnifeBVH
 
typedef struct KnifeObjectInfo KnifeObjectInfo
 
typedef struct KnifeTool_OpData KnifeTool_OpData
 

Enumerations

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 *UNUSED(C), ARegion *UNUSED(region), void *arg)
 
Header
static void knife_update_header (bContext *C, wmOperator *op, KnifeTool_OpData *kcd)
 
Knife Object Info Accessors (#KnifeObjectInfo)
static const int * knife_bm_tri_index_get (const KnifeTool_OpData *kcd, int base_index, int tri_index, int tri_index_buf[3])
 
static void knife_bm_tri_cagecos_get (const KnifeTool_OpData *kcd, int base_index, int tri_index, float cos[3][3])
 
static void knife_bm_tri_cagecos_get_worldspace (const KnifeTool_OpData *kcd, int base_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_hitout[3], float r_cagehit[3], uint *r_base_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_hitout[3], float r_cagehit[3], uint *r_base_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], const float ofs, float r_origin[3], float r_origin_ofs[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 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, Object *ob, uint base_index)
 
static KnifeEdgeget_bm_knife_edge (KnifeTool_OpData *kcd, BMEdge *e, Object *ob, uint base_index)
 
static ListBaseknife_get_face_kedges (KnifeTool_OpData *kcd, Object *ob, uint base_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_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, 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, Object *ob)
 
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], Object *ob, uint base_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 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, Object **r_ob, uint *r_base_index, bool *is_space, float r_co[3], float r_cageco[3])
 
static int knife_sample_screen_density_from_closest_face (KnifeTool_OpData *kcd, const float radius, Object *ob, uint base_index, BMFace *f, const float cageco[3])
 
static float knife_snap_size (KnifeTool_OpData *kcd, float maxsize)
 
static bool knife_snap_edge_constrained (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, Object *ob, uint base_index, 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_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 bool 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, uint base_index, bool use_tri_indices)
 
static void knifetool_free_obinfo (KnifeTool_OpData *kcd, uint base_index)
 
#KnifeTool_OpData (#op->customdata) Init and Free
static void knife_init_colors (KnifeColors *colors)
 
static void knifetool_init (ViewContext *vc, KnifeTool_OpData *kcd, Object **objects, const int objects_len, 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, Object *ob)
 
static void knifetool_finish_single_post (KnifeTool_OpData *UNUSED(kcd), 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 *UNUSED(C), 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, Object **objects, const int objects_len, 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 69 of file editmesh_knife.c.

◆ KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT

#define KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT   30.0f

Definition at line 82 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS

#define KNIFE_FLT_EPS   0.00001f

Definition at line 74 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_PX_EDGE

#define KNIFE_FLT_EPS_PX_EDGE   0.05f

Definition at line 79 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_PX_FACE

#define KNIFE_FLT_EPS_PX_FACE   0.05f

Definition at line 80 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_PX_VERT

#define KNIFE_FLT_EPS_PX_VERT   0.5f

Definition at line 78 of file editmesh_knife.c.

◆ KNIFE_FLT_EPS_SQUARED

#define KNIFE_FLT_EPS_SQUARED   (KNIFE_FLT_EPS * KNIFE_FLT_EPS)

Definition at line 75 of file editmesh_knife.c.

◆ KNIFE_FLT_EPSBIG

#define KNIFE_FLT_EPSBIG   0.0005f

Definition at line 76 of file editmesh_knife.c.

◆ KNIFE_MAX_ANGLE_SNAPPING_INCREMENT

#define KNIFE_MAX_ANGLE_SNAPPING_INCREMENT   180.0f

Definition at line 84 of file editmesh_knife.c.

◆ KNIFE_MIN_ANGLE_SNAPPING_INCREMENT

#define KNIFE_MIN_ANGLE_SNAPPING_INCREMENT   0.0f

Definition at line 83 of file editmesh_knife.c.

◆ USE_NET_ISLAND_CONNECT

#define USE_NET_ISLAND_CONNECT

Definition at line 67 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:93
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

◆ KnifeBVH

typedef struct KnifeBVH KnifeBVH

◆ KnifeColors

typedef struct KnifeColors KnifeColors

◆ KnifeEdge

typedef struct KnifeEdge KnifeEdge

◆ KnifeLineHit

typedef struct KnifeLineHit KnifeLineHit

◆ KnifeMeasureData

◆ KnifeObjectInfo

Additional per-object data.

◆ KnifePosData

typedef struct KnifePosData KnifePosData

◆ KnifeTool_OpData

◆ KnifeUndoFrame

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

◆ anonymous enum

anonymous enum
Enumerator
KNF_CONSTRAIN_ANGLE_MODE_NONE 
KNF_CONSTRAIN_ANGLE_MODE_SCREEN 
KNF_CONSTRAIN_ANGLE_MODE_RELATIVE 

Definition at line 344 of file editmesh_knife.c.

◆ anonymous enum

anonymous enum
Enumerator
KNF_CONSTRAIN_AXIS_NONE 
KNF_CONSTRAIN_AXIS_X 
KNF_CONSTRAIN_AXIS_Y 
KNF_CONSTRAIN_AXIS_Z 

Definition at line 350 of file editmesh_knife.c.

◆ anonymous enum

anonymous enum
Enumerator
KNF_CONSTRAIN_AXIS_MODE_NONE 
KNF_CONSTRAIN_AXIS_MODE_GLOBAL 
KNF_CONSTRAIN_AXIS_MODE_LOCAL 

Definition at line 357 of file editmesh_knife.c.

◆ anonymous enum

anonymous enum
Enumerator
KNF_MEASUREMENT_NONE 
KNF_MEASUREMENT_BOTH 
KNF_MEASUREMENT_DISTANCE 
KNF_MEASUREMENT_ANGLE 

Definition at line 363 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 1614 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 2681 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 ( struct ViewContext vc,
struct Object **  objects,
int  objects_len,
struct 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 4948 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,
Object ob,
uint  base_index 
)
static

◆ get_bm_knife_vert()

static KnifeVert* get_bm_knife_vert ( KnifeTool_OpData kcd,
BMVert v,
Object ob,
uint  base_index 
)
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 1678 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 2060 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 1664 of file editmesh_knife.c.

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

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

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

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

Referenced by knifetool_exit_ex().

◆ knife_bvh_init()

static void knife_bvh_init ( KnifeTool_OpData kcd)
static

◆ knife_bvh_raycast()

static BMFace* knife_bvh_raycast ( KnifeTool_OpData kcd,
const float  co[3],
const float  dir[3],
const float  radius,
float r_dist,
float  r_hitout[3],
float  r_cagehit[3],
uint r_base_index 
)
static

◆ knife_bvh_raycast_cb()

static void knife_bvh_raycast_cb ( void userdata,
int  index,
const BVHTreeRay ray,
BVHTreeRayHit hit 
)
static

◆ 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_hitout[3],
float  r_cagehit[3],
uint r_base_index,
bool(*)(BMFace *f, void *userdata)  filter_cb,
void filter_userdata 
)
static

◆ knife_calculate_snap_ref_edges()

static int knife_calculate_snap_ref_edges ( KnifeTool_OpData kcd)
static

◆ knife_constrain_axis()

static void knife_constrain_axis ( KnifeTool_OpData kcd)
static

◆ knife_cut_face()

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

Definition at line 2166 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,
Object ob,
uint  base_index,
BMFace f,
float  p[3],
float  cagep[3] 
)
static

◆ knife_find_closest_face()

static BMFace* knife_find_closest_face ( KnifeTool_OpData kcd,
Object **  r_ob,
uint r_base_index,
bool is_space,
float  r_co[3],
float  r_cageco[3] 
)
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 1690 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 2840 of file editmesh_knife.c.

References usdtokens::b(), KnifeVert::base_index, KnifeLineHit::base_index, BKE_editmesh_from_object(), 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::bvh, 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, BMLoop::f, KnifeLineHit::f, fabsf, faces, ListBase::first, KnifeLineHit::hit, 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(), 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(), KnifePosData::mval, Ref::next, NULL, KnifeVert::ob, KnifeLineHit::ob, KnifeTool_OpData::objects, KnifeTool_OpData::objects_len, 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, BMEditMesh::tottri, transform_point_by_seg_v3(), KnifeBVH::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,
Object ob,
uint  base_index,
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_join_edge()

static void knife_join_edge ( KnifeEdge newkfe,
KnifeEdge kfe 
)
static

◆ knife_make_cuts()

static void knife_make_cuts ( KnifeTool_OpData kcd,
Object ob 
)
static

◆ knife_make_face_cuts()

static void knife_make_face_cuts ( KnifeTool_OpData kcd,
BMesh bm,
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],
Object ob,
uint  base_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 2566 of file editmesh_knife.c.

References BKE_editmesh_from_object(), BLI_assert, KnifeVert::cageco, BMVert::co, dist_squared_to_line_segment_v2(), dist_squared_to_plane_v3(), ListBase::first, 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(), BMEditMesh::looptris, Ref::next, normal_tri_v3(), normalize_v3(), plane_from_point_normal_v3(), Ref::ref, sub_v3_v3v3(), BMEditMesh::tottri, UNPACK3, BMLoop::v, v, KnifeEdge::v1, v1, v2, and KnifeEdge::v2.

Referenced by knife_find_line_hits().

◆ knife_recalc_ortho()

static void knife_recalc_ortho ( KnifeTool_OpData kcd)
static

◆ knife_reset_snap_angle_input()

static void knife_reset_snap_angle_input ( KnifeTool_OpData kcd)
static

Definition at line 3806 of file editmesh_knife.c.

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,
Object ob,
uint  base_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 3268 of file editmesh_knife.c.

References Freestyle::c, KnifeVert::cageco, ED_view3d_clipping_test(), ListBase::first, KnifeVert::is_invalid, KnifeEdge::is_invalid, 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_relative()

static bool knife_snap_angle_relative ( KnifeTool_OpData kcd)
static

◆ knife_snap_angle_screen()

static bool knife_snap_angle_screen ( KnifeTool_OpData kcd)
static

◆ knife_snap_edge_constrained()

static bool knife_snap_edge_constrained ( 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 3326 of file editmesh_knife.c.

References KnifePosData::base_index, BLI_assert, KnifePosData::bmface, KnifePosData::cage, KnifeTool_OpData::curr, usdtokens::density(), float(), KnifeTool_OpData::is_interactive, KnifePosData::is_space, knife_sample_screen_density_from_closest_face(), min_ff(), and KnifePosData::ob.

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

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

Definition at line 4360 of file editmesh_knife.c.

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 UNUSEDC,
ARegion UNUSEDregion,
void arg 
)
static

Definition at line 885 of file editmesh_knife.c.

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, KnifeLineHit::cagehit, 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(), GPUBatch, immBegin(), immBeginBatchAtMost(), immBindBuiltinProgram(), immEnd(), immUnbindProgram(), immUniformColor3ubv(), immVertex3fv(), immVertexFormat(), KnifeTool_OpData::is_angle_snapping, KnifeVert::is_cut, KnifeEdge::is_cut, KnifeVert::is_invalid, KnifeEdge::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, NULL, KnifeColors::point, KnifeColors::point_a, pos, KnifeTool_OpData::prev, rgba_uchar_to_float(), KnifeTool_OpData::show_dist_angle, KnifeTool_OpData::snap_ref_edge, 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()

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

◆ knifetool_draw_angle_snapping()

static void knifetool_draw_angle_snapping ( const KnifeTool_OpData kcd)
static

◆ knifetool_draw_dist_angle()

static void knifetool_draw_dist_angle ( const KnifeTool_OpData kcd)
static

◆ knifetool_draw_orientation_locking()

static void knifetool_draw_orientation_locking ( const KnifeTool_OpData kcd)
static

◆ knifetool_draw_visible_angles()

static void knifetool_draw_visible_angles ( const KnifeTool_OpData kcd)
static

◆ knifetool_draw_visible_distances()

static void knifetool_draw_visible_distances ( const KnifeTool_OpData kcd)
static

◆ knifetool_exit()

static void knifetool_exit ( wmOperator op)
static

Definition at line 4248 of file editmesh_knife.c.

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

Referenced by knifetool_cancel(), and knifetool_modal().

◆ knifetool_exit_ex()

static void knifetool_exit_ex ( KnifeTool_OpData kcd)
static

◆ knifetool_finish()

static void knifetool_finish ( wmOperator op)
static

Definition at line 4348 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_finish_single_post()

static void knifetool_finish_single_post ( KnifeTool_OpData UNUSEDkcd,
Object ob 
)
static

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

Definition at line 4320 of file editmesh_knife.c.

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

Referenced by EDBM_mesh_knife(), and knifetool_finish_ex().

◆ knifetool_finish_single_pre()

static void knifetool_finish_single_pre ( KnifeTool_OpData kcd,
Object ob 
)
static

Definition at line 4311 of file editmesh_knife.c.

References knife_make_cuts().

Referenced by EDBM_mesh_knife(), and knifetool_finish_ex().

◆ knifetool_free_obinfo()

static void knifetool_free_obinfo ( KnifeTool_OpData kcd,
uint  base_index 
)
static

◆ knifetool_init()

static void knifetool_init ( ViewContext vc,
KnifeTool_OpData kcd,
Object **  objects,
const int  objects_len,
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 4084 of file editmesh_knife.c.

References KnifeTool_OpData::angle_snapping, KnifeTool_OpData::angle_snapping_increment, KnifeTool_OpData::angle_snapping_mode, KnifeTool_OpData::arena, KnifeTool_OpData::axis_string, usdtokens::b(), B_UNIT_NONE, BKE_editmesh_from_object(), BKE_view_layer_array_from_objects_in_edit_mode_unique_data, 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_callocN, MEM_SIZE_OPTIMAL, KnifeTool_OpData::no_cuts, KnifeTool_OpData::num, NUM_NO_NEGATIVE, KnifeTool_OpData::objects, KnifeTool_OpData::objects_free, KnifeTool_OpData::objects_info, KnifeTool_OpData::objects_len, KnifeTool_OpData::only_select, KnifeTool_OpData::origedgemap, KnifeTool_OpData::origvertmap, KnifeTool_OpData::prev, KnifeTool_OpData::refs, ViewContext::region, KnifeTool_OpData::region, REGION_DRAW_POST_VIEW, SCE_SELECT_FACE, scene, ViewContext::scene, KnifeTool_OpData::scene, KnifeTool_OpData::select_result, BMEditMesh::selectmode, KnifeTool_OpData::show_dist_angle, KnifeTool_OpData::splitstack, UnitSettings::system, ARegion::type, KnifeTool_OpData::undostack, Scene::unit, NumInput::unit_sys, NumInput::unit_type, ViewContext::v3d, NumInput::val_flag, KnifeTool_OpData::vc, ViewContext::view_layer, and KnifeTool_OpData::vthresh.

Referenced by EDBM_mesh_knife(), and knifetool_invoke().

◆ knifetool_init_obinfo()

static void knifetool_init_obinfo ( KnifeTool_OpData kcd,
Object ob,
uint  base_index,
bool  use_tri_indices 
)
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 4429 of file editmesh_knife.c.

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(), C, 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::mode, MOUSEMOVE, MOUSEPAN, MOUSEROTATE, MOUSEZOOM, KnifePosData::mval, wmEvent::mval, NDOF_MOTION, KnifeTool_OpData::no_cuts, NULL, KnifeTool_OpData::num, KnifePosData::ob, OB_MESH, 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, ViewContext::region, KnifeTool_OpData::region, RNA_float_get(), ViewContext::rv3d, KnifeTool_OpData::show_dist_angle, KnifeTool_OpData::snap_edge, KnifeTool_OpData::snap_midpoints, KnifeTool_OpData::snap_ref_edges_count, NumInput::str_cur, KnifeTool_OpData::totkvert, KnifeTool_OpData::totlinehit, 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()

wmKeyMap* knifetool_modal_keymap ( wmKeyConfig keyconf)

◆ knifetool_raycast_planes()

static void knifetool_raycast_planes ( const KnifeTool_OpData kcd,
float  r_v1[3],
float  r_v2[3] 
)
static

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

References BLI_mempool_iternew(), BLI_mempool_iterstep(), BLI_stack_discard(), BLI_stack_peek(), BLI_stack_pop(), KnifeUndoFrame::cuts, KnifeEdge::is_cut, KnifeEdge::is_invalid, KnifeTool_OpData::kedges, knife_join_edge(), KnifeUndoFrame::mdata, KnifeTool_OpData::mdata, KnifeTool_OpData::mode, Ref::next, NULL, KnifeUndoFrame::pos, KnifeTool_OpData::prev, Ref::ref, KnifeEdge::splits, KnifeUndoFrame::splits, KnifeTool_OpData::splitstack, KnifeTool_OpData::undostack, KnifeEdge::v1, v1, v2, and KnifeEdge::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 4299 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 1935 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 2743 of file editmesh_knife.c.

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(), NULL, 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,
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 3557 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_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 3607 of file editmesh_knife.c.

References angle(), angle_signed_on_axis_v3v3_v3(), r, 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 2296 of file editmesh_knife.c.

References KnifeVert::co, and len_squared_v3v3().

Referenced by knife_make_cuts().