Blender  V3.3
Classes
transform_snap_object.cc File Reference
#include <cstdlib>
#include "MEM_guardedalloc.h"
#include "BLI_float4x4.hh"
#include "BLI_kdopbvh.h"
#include "BLI_listbase.h"
#include "BLI_map.hh"
#include "BLI_math.h"
#include "BLI_math_vector.hh"
#include "BLI_utildefines.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
#include "BKE_armature.h"
#include "BKE_bvhutils.h"
#include "BKE_curve.h"
#include "BKE_duplilist.h"
#include "BKE_editmesh.h"
#include "BKE_geometry_set.h"
#include "BKE_global.h"
#include "BKE_layer.h"
#include "BKE_mesh.h"
#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
#include "BKE_tracking.h"
#include "DEG_depsgraph_query.h"
#include "ED_armature.h"
#include "ED_transform_snap_object_context.h"
#include "ED_view3d.h"

Go to the source code of this file.

Classes

struct  SnapData_Mesh
 
struct  SnapData_EditMesh
 
struct  SnapObjectContext
 
struct  RayCastAll_Data
 
struct  RaycastObjUserData
 
struct  NearestWorldObjUserData
 
struct  Nearest2dUserData
 
struct  SnapObjUserData
 

Functions

Utilities
static const Mesh * mesh_for_snap (Object *ob_eval, eSnapEditType edit_mode_type, bool *r_use_hide)
 
Snap Object Data
static void snap_editmesh_minmax (SnapObjectContext *sctx, BMesh *bm, float r_min[3], float r_max[3])
 
static SnapData_Mesh * snap_object_data_mesh_get (SnapObjectContext *sctx, Object *ob_eval, const Mesh *me_eval, bool use_hide)
 
static Mesh_Runtime * snap_object_data_editmesh_runtime_get (Object *ob_eval)
 
static SnapData_EditMesh * snap_object_data_editmesh_get (SnapObjectContext *sctx, Object *ob_eval, BMEditMesh *em)
 
static BVHTreeFromMesh * snap_object_data_mesh_treedata_get (SnapObjectContext *sctx, Object *ob_eval, const Mesh *me_eval, bool use_hide)
 
static BVHTreeFromEditMesh * snap_object_data_editmesh_treedata_get (SnapObjectContext *sctx, Object *ob_eval, BMEditMesh *em)
 
Ray Cast Funcs
static SnapObjectHitDepth * hit_depth_create (const float depth, const float co[3], const float no[3], int index, Object *ob_eval, const float obmat[4][4], uint ob_uuid)
 
static int hit_depth_cmp (const void *arg1, const void *arg2)
 
static void raycast_all_cb (void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
 
static bool raycast_tri_backface_culling_test (const float dir[3], const float v0[3], const float v1[3], const float v2[3], float no[3])
 
static void mesh_looptri_raycast_backface_culling_cb (void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
 
static void editmesh_looptri_raycast_backface_culling_cb (void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
 
static bool raycastMesh (SnapObjectContext *sctx, const SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], Object *ob_eval, const Mesh *me_eval, const float obmat[4][4], const uint ob_index, bool use_hide, float *ray_depth, float r_loc[3], float r_no[3], int *r_index, ListBase *r_hit_list)
 
static bool raycastEditMesh (SnapObjectContext *sctx, const SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], Object *ob_eval, BMEditMesh *em, const float obmat[4][4], const uint ob_index, float *ray_depth, float r_loc[3], float r_no[3], int *r_index, ListBase *r_hit_list)
 
static void raycast_obj_fn (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], bool is_object_active, void *data)
 
static bool raycastObjects (SnapObjectContext *sctx, const SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], float *ray_depth, float r_loc[3], float r_no[3], int *r_index, Object **r_ob, float r_obmat[4][4], ListBase *r_hit_list)
 
Surface Snap Funcs
static void nearest_world_tree_co (BVHTree *tree, BVHTree_NearestPointCallback nearest_cb, void *treedata, float co[3], float r_co[3], float r_no[3], int *r_index, float *r_dist_sq)
 
static bool nearest_world_tree (SnapObjectContext *UNUSED(sctx), const struct SnapObjectParams *params, BVHTree *tree, BVHTree_NearestPointCallback nearest_cb, void *treedata, const float(*obmat)[4], const float init_co[3], const float curr_co[3], float *r_dist_sq, float *r_loc, float *r_no, int *r_index)
 
static bool nearest_world_mesh (SnapObjectContext *sctx, const struct SnapObjectParams *params, Object *ob_eval, const Mesh *me_eval, const float(*obmat)[4], bool use_hide, const float init_co[3], const float curr_co[3], float *r_dist_sq, float *r_loc, float *r_no, int *r_index)
 
static bool nearest_world_editmesh (SnapObjectContext *sctx, const struct SnapObjectParams *params, Object *ob_eval, BMEditMesh *em, const float(*obmat)[4], const float init_co[3], const float curr_co[3], float *r_dist_sq, float *r_loc, float *r_no, int *r_index)
 
static void nearest_world_object_fn (SnapObjectContext *sctx, const struct SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], bool is_object_active, void *data)
 
static bool nearestWorldObjects (SnapObjectContext *sctx, const struct SnapObjectParams *params, const float init_co[3], const float curr_co[3], float *r_loc, float *r_no, int *r_index, Object **r_ob, float r_obmat[4][4])
 
Snap Nearest utilities
static bool snap_bound_box_check_dist (const float min[3], const float max[3], const float lpmat[4][4], const float win_size[2], const float mval[2], float dist_px_sq)
 
Internal Object Snapping API
static eSnapMode snap_mesh_polygon (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static eSnapMode snap_mesh_edge_verts_mixed (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], float original_dist_px, const float prev_co[3], float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static eSnapMode snapArmature (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], bool is_object_active, float *dist_px, float r_loc[3], float *UNUSED(r_no), int *r_index)
 
static eSnapMode snapCurve (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], float *dist_px, float r_loc[3], float *UNUSED(r_no), int *r_index)
 
static eSnapMode snap_object_center (const SnapObjectContext *sctx, Object *ob_eval, const float obmat[4][4], float *dist_px, float r_loc[3], float *UNUSED(r_no), int *r_index)
 
static eSnapMode snapCamera (const SnapObjectContext *sctx, Object *object, const float obmat[4][4], float *dist_px, float r_loc[3], float *r_no, int *r_index)
 
static eSnapMode snapMesh (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const Mesh *me_eval, const float obmat[4][4], bool use_hide, float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static eSnapMode snapEditMesh (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, BMEditMesh *em, const float obmat[4][4], float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static void snap_obj_fn (SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], bool is_object_active, void *data)
 
static eSnapMode snapObjectsRay (SnapObjectContext *sctx, const SnapObjectParams *params, float *dist_px, float r_loc[3], float r_no[3], int *r_index, Object **r_ob, float r_obmat[4][4])
 
Public Object Snapping API
SnapObjectContext * ED_transform_snap_object_context_create (Scene *scene, int flag)
 
void ED_transform_snap_object_context_destroy (SnapObjectContext *sctx)
 
void ED_transform_snap_object_context_set_editmesh_callbacks (SnapObjectContext *sctx, bool(*test_vert_fn)(BMVert *, void *user_data), bool(*test_edge_fn)(BMEdge *, void *user_data), bool(*test_face_fn)(BMFace *, void *user_data), void *user_data)
 
bool ED_transform_snap_object_project_ray_ex (SnapObjectContext *sctx, Depsgraph *depsgraph, const View3D *v3d, const SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float *ray_depth, float r_loc[3], float r_no[3], int *r_index, Object **r_ob, float r_obmat[4][4])
 
bool ED_transform_snap_object_project_ray_all (SnapObjectContext *sctx, Depsgraph *depsgraph, const View3D *v3d, const SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float ray_depth, bool sort, ListBase *r_hit_list)
 
static bool transform_snap_context_project_ray_impl (SnapObjectContext *sctx, Depsgraph *depsgraph, const View3D *v3d, const SnapObjectParams *params, const float ray_start[3], const float ray_normal[3], float *ray_depth, float r_co[3], float r_no[3])
 
bool ED_transform_snap_object_project_ray (SnapObjectContext *sctx, Depsgraph *depsgraph, const View3D *v3d, const SnapObjectParams *params, const float ray_origin[3], const float ray_direction[3], float *ray_depth, float r_co[3], float r_no[3])
 
static eSnapMode transform_snap_context_project_view3d_mixed_impl (SnapObjectContext *sctx, Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const eSnapMode snap_to_flag, const SnapObjectParams *params, const float init_co[3], const float mval[2], const float prev_co[3], float *dist_px, float r_loc[3], float r_no[3], int *r_index, Object **r_ob, float r_obmat[4][4], float r_face_nor[3])
 
eSnapMode ED_transform_snap_object_project_view3d_ex (SnapObjectContext *sctx, Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const eSnapMode snap_to, const SnapObjectParams *params, const float init_co[3], const float mval[2], const float prev_co[3], float *dist_px, float r_loc[3], float r_no[3], int *r_index, Object **r_ob, float r_obmat[4][4], float r_face_nor[3])
 
eSnapMode ED_transform_snap_object_project_view3d (SnapObjectContext *sctx, Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const eSnapMode snap_to, const SnapObjectParams *params, const float init_co[3], const float mval[2], const float prev_co[3], float *dist_px, float r_loc[3], float r_no[3])
 
bool ED_transform_snap_object_project_all_view3d_ex (SnapObjectContext *sctx, Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const SnapObjectParams *params, const float mval[2], float ray_depth, bool sort, ListBase *r_hit_list)
 

Internal Data Types

#define MAX_CLIPPLANE_LEN   3
 
enum  eViewProj { VIEW_PROJ_NONE = -1 , VIEW_PROJ_ORTHO = 0 , VIEW_PROJ_PERSP = -1 }
 

Iterator

using IterSnapObjsCallback = void(*)(SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], bool is_object_active, void *data)
 
static bool snap_object_is_snappable (const SnapObjectContext *sctx, const eSnapTargetSelect snap_target_select, const Base *base_act, const Base *base)
 
static void iter_snap_objects (SnapObjectContext *sctx, const SnapObjectParams *params, IterSnapObjsCallback sob_callback, void *data)
 

Callbacks

using Nearest2DGetVertCoCallback = void(*)(const int index, const Nearest2dUserData *data, const float **r_co)
 
using Nearest2DGetEdgeVertsCallback = void(*)(const int index, const Nearest2dUserData *data, int r_v_index[2])
 
using Nearest2DGetTriVertsCallback = void(*)(const int index, const Nearest2dUserData *data, int r_v_index[3])
 
using Nearest2DGetTriEdgesCallback = void(*)(const int index, const Nearest2dUserData *data, int r_e_index[3])
 
using Nearest2DCopyVertNoCallback = void(*)(const int index, const Nearest2dUserData *data, float r_no[3])
 
static void cb_mvert_co_get (const int index, const Nearest2dUserData *data, const float **r_co)
 
static void cb_bvert_co_get (const int index, const Nearest2dUserData *data, const float **r_co)
 
static void cb_mvert_no_copy (const int index, const Nearest2dUserData *data, float r_no[3])
 
static void cb_bvert_no_copy (const int index, const Nearest2dUserData *data, float r_no[3])
 
static void cb_medge_verts_get (const int index, const Nearest2dUserData *data, int r_v_index[2])
 
static void cb_bedge_verts_get (const int index, const Nearest2dUserData *data, int r_v_index[2])
 
static void cb_mlooptri_edges_get (const int index, const Nearest2dUserData *data, int r_v_index[3])
 
static void cb_mlooptri_verts_get (const int index, const Nearest2dUserData *data, int r_v_index[3])
 
static bool test_projected_vert_dist (const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, const bool is_persp, const float co[3], float *dist_px_sq, float r_co[3])
 
static bool test_projected_edge_dist (const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, const bool is_persp, const float va[3], const float vb[3], float *dist_px_sq, float r_co[3])
 
static void cb_snap_vert (void *userdata, int index, const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
static void cb_snap_edge (void *userdata, int index, const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
static void cb_snap_edge_verts (void *userdata, int index, const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
static void cb_snap_tri_edges (void *userdata, int index, const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
static void cb_snap_tri_verts (void *userdata, int index, const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
static void nearest2d_data_init_mesh (SnapData_Mesh *sod, bool is_persp, bool use_backface_culling, Nearest2dUserData *r_nearest2d)
 
static void nearest2d_data_init_editmesh (SnapData_EditMesh *sod, bool is_persp, bool use_backface_culling, Nearest2dUserData *r_nearest2d)
 

Macro Definition Documentation

◆ MAX_CLIPPLANE_LEN

#define MAX_CLIPPLANE_LEN   3

Definition at line 55 of file transform_snap_object.cc.

Typedef Documentation

◆ IterSnapObjsCallback

using IterSnapObjsCallback = void (*)(SnapObjectContext *sctx, const SnapObjectParams *params, Object *ob_eval, const float obmat[4][4], bool is_object_active, void *data)

Definition at line 470 of file transform_snap_object.cc.

◆ Nearest2DCopyVertNoCallback

using Nearest2DCopyVertNoCallback = void (*)(const int index, const Nearest2dUserData *data, float r_no[3])

Definition at line 1554 of file transform_snap_object.cc.

◆ Nearest2DGetEdgeVertsCallback

using Nearest2DGetEdgeVertsCallback = void (*)(const int index, const Nearest2dUserData *data, int r_v_index[2])

Definition at line 1544 of file transform_snap_object.cc.

◆ Nearest2DGetTriEdgesCallback

using Nearest2DGetTriEdgesCallback = void (*)(const int index, const Nearest2dUserData *data, int r_e_index[3])

Definition at line 1551 of file transform_snap_object.cc.

◆ Nearest2DGetTriVertsCallback

using Nearest2DGetTriVertsCallback = void (*)(const int index, const Nearest2dUserData *data, int r_v_index[3])

Definition at line 1547 of file transform_snap_object.cc.

◆ Nearest2DGetVertCoCallback

using Nearest2DGetVertCoCallback = void (*)(const int index, const Nearest2dUserData *data, const float **r_co)

Definition at line 1541 of file transform_snap_object.cc.

Enumeration Type Documentation

◆ eViewProj

enum eViewProj
Enumerator
VIEW_PROJ_NONE 
VIEW_PROJ_ORTHO 
VIEW_PROJ_PERSP 

Definition at line 57 of file transform_snap_object.cc.

Function Documentation

◆ cb_bedge_verts_get()

static void cb_bedge_verts_get ( const int  index,
const Nearest2dUserData *  data,
int  r_v_index[2] 
)
static

◆ cb_bvert_co_get()

static void cb_bvert_co_get ( const int  index,
const Nearest2dUserData *  data,
const float **  r_co 
)
static

Definition at line 1587 of file transform_snap_object.cc.

References BM_vert_at_index(), BMVert::co, and data.

Referenced by nearest2d_data_init_editmesh().

◆ cb_bvert_no_copy()

static void cb_bvert_no_copy ( const int  index,
const Nearest2dUserData *  data,
float  r_no[3] 
)
static

Definition at line 1598 of file transform_snap_object.cc.

References BM_vert_at_index(), copy_v3_v3(), data, and BMVert::no.

Referenced by nearest2d_data_init_editmesh().

◆ cb_medge_verts_get()

static void cb_medge_verts_get ( const int  index,
const Nearest2dUserData *  data,
int  r_v_index[2] 
)
static

Definition at line 1605 of file transform_snap_object.cc.

References data.

Referenced by nearest2d_data_init_mesh().

◆ cb_mlooptri_edges_get()

static void cb_mlooptri_edges_get ( const int  index,
const Nearest2dUserData *  data,
int  r_v_index[3] 
)
static

Definition at line 1621 of file transform_snap_object.cc.

References data, MLoop::e, ELEM, MLoopTri::tri, MLoop::v, MEdge::v1, and MEdge::v2.

Referenced by nearest2d_data_init_mesh().

◆ cb_mlooptri_verts_get()

static void cb_mlooptri_verts_get ( const int  index,
const Nearest2dUserData *  data,
int  r_v_index[3] 
)
static

Definition at line 1639 of file transform_snap_object.cc.

References data, MLoopTri::tri, and MLoop::v.

Referenced by nearest2d_data_init_mesh().

◆ cb_mvert_co_get()

static void cb_mvert_co_get ( const int  index,
const Nearest2dUserData *  data,
const float **  r_co 
)
static

Definition at line 1582 of file transform_snap_object.cc.

References data.

Referenced by nearest2d_data_init_mesh().

◆ cb_mvert_no_copy()

static void cb_mvert_no_copy ( const int  index,
const Nearest2dUserData *  data,
float  r_no[3] 
)
static

Definition at line 1593 of file transform_snap_object.cc.

References copy_v3_v3(), and data.

Referenced by nearest2d_data_init_mesh().

◆ cb_snap_edge()

static void cb_snap_edge ( void *  userdata,
int  index,
const DistProjectedAABBPrecalc *  precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
BVHTreeNearest *  nearest 
)
static

◆ cb_snap_edge_verts()

static void cb_snap_edge_verts ( void *  userdata,
int  index,
const DistProjectedAABBPrecalc *  precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
BVHTreeNearest *  nearest 
)
static

Definition at line 1762 of file transform_snap_object.cc.

References cb_snap_vert(), data, and BVHTreeNearest::index.

Referenced by snapMesh().

◆ cb_snap_tri_edges()

static void cb_snap_tri_edges ( void *  userdata,
int  index,
const DistProjectedAABBPrecalc *  precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
BVHTreeNearest *  nearest 
)
static

◆ cb_snap_tri_verts()

static void cb_snap_tri_verts ( void *  userdata,
int  index,
const DistProjectedAABBPrecalc *  precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
BVHTreeNearest *  nearest 
)
static

◆ cb_snap_vert()

static void cb_snap_vert ( void *  userdata,
int  index,
const DistProjectedAABBPrecalc *  precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
BVHTreeNearest *  nearest 
)
static

◆ ED_transform_snap_object_context_create()

SnapObjectContext* ED_transform_snap_object_context_create ( Scene *  scene,
int  flag 
)

◆ ED_transform_snap_object_context_destroy()

void ED_transform_snap_object_context_destroy ( SnapObjectContext *  sctx)

◆ ED_transform_snap_object_context_set_editmesh_callbacks()

void ED_transform_snap_object_context_set_editmesh_callbacks ( SnapObjectContext *  sctx,
bool(*)(BMVert *, void *user_data)  test_vert_fn,
bool(*)(BMEdge *, void *user_data)  test_edge_fn,
bool(*)(BMFace *, void *user_data)  test_face_fn,
void *  user_data 
)

◆ ED_transform_snap_object_project_all_view3d_ex()

bool ED_transform_snap_object_project_all_view3d_ex ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const ARegion *  region,
const View3D *  v3d,
const SnapObjectParams *  params,
const float  mval[2],
float  ray_depth,
bool  sort,
ListBase *  r_hit_list 
)

◆ ED_transform_snap_object_project_ray()

bool ED_transform_snap_object_project_ray ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const View3D *  v3d,
const SnapObjectParams *  params,
const float  ray_origin[3],
const float  ray_direction[3],
float *  ray_depth,
float  r_co[3],
float  r_no[3] 
)

◆ ED_transform_snap_object_project_ray_all()

bool ED_transform_snap_object_project_ray_all ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const View3D *  v3d,
const SnapObjectParams *  params,
const float  ray_start[3],
const float  ray_normal[3],
float  ray_depth,
bool  sort,
ListBase *  r_hit_list 
)

◆ ED_transform_snap_object_project_ray_ex()

bool ED_transform_snap_object_project_ray_ex ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const View3D *  v3d,
const SnapObjectParams *  params,
const float  ray_start[3],
const float  ray_normal[3],
float *  ray_depth,
float  r_loc[3],
float  r_no[3],
int *  r_index,
Object **  r_ob,
float  r_obmat[4][4] 
)

◆ ED_transform_snap_object_project_view3d()

eSnapMode ED_transform_snap_object_project_view3d ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const ARegion *  region,
const View3D *  v3d,
const eSnapMode  snap_to,
const SnapObjectParams *  params,
const float  init_co[3],
const float  mval[2],
const float  prev_co[3],
float *  dist_px,
float  r_loc[3],
float  r_no[3] 
)

◆ ED_transform_snap_object_project_view3d_ex()

eSnapMode ED_transform_snap_object_project_view3d_ex ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const ARegion *  region,
const View3D *  v3d,
const eSnapMode  snap_to,
const SnapObjectParams *  params,
const float  init_co[3],
const float  mval[2],
const float  prev_co[3],
float *  dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index,
Object **  r_ob,
float  r_obmat[4][4],
float  r_face_nor[3] 
)

◆ editmesh_looptri_raycast_backface_culling_cb()

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

◆ hit_depth_cmp()

static int hit_depth_cmp ( const void *  arg1,
const void *  arg2 
)
static

◆ hit_depth_create()

static SnapObjectHitDepth* hit_depth_create ( const float  depth,
const float  co[3],
const float  no[3],
int  index,
Object *  ob_eval,
const float  obmat[4][4],
uint  ob_uuid 
)
static

◆ iter_snap_objects()

static void iter_snap_objects ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
IterSnapObjsCallback  sob_callback,
void *  data 
)
static

◆ mesh_for_snap()

static const Mesh* mesh_for_snap ( Object *  ob_eval,
eSnapEditType  edit_mode_type,
bool *  r_use_hide 
)
static

Mesh used for snapping.

  • When the return value is null the BKE_editmesh_from_object(ob_eval) should be used.
  • In rare cases there is no evaluated mesh available and a null result doesn't imply an edit-mesh, so callers need to account for a null edit-mesh too, see: T96536.

Definition at line 178 of file transform_snap_object.cc.

References BKE_object_get_editmesh_eval_cage(), BKE_object_get_editmesh_eval_final(), BKE_object_get_evaluated_mesh(), BKE_object_is_in_editmode(), ME_WRAPPER_TYPE_BMESH, Mesh::runtime, SNAP_GEOM_CAGE, SNAP_GEOM_EDIT, SNAP_GEOM_FINAL, and Mesh_Runtime::wrapper_type.

Referenced by nearest_world_object_fn(), raycast_obj_fn(), and snap_obj_fn().

◆ mesh_looptri_raycast_backface_culling_cb()

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

◆ nearest2d_data_init_editmesh()

static void nearest2d_data_init_editmesh ( SnapData_EditMesh *  sod,
bool  is_persp,
bool  use_backface_culling,
Nearest2dUserData *  r_nearest2d 
)
static

◆ nearest2d_data_init_mesh()

static void nearest2d_data_init_mesh ( SnapData_Mesh *  sod,
bool  is_persp,
bool  use_backface_culling,
Nearest2dUserData *  r_nearest2d 
)
static

◆ nearest_world_editmesh()

static bool nearest_world_editmesh ( SnapObjectContext *  sctx,
const struct SnapObjectParams *  params,
Object *  ob_eval,
BMEditMesh *  em,
const float(*)  obmat[4],
const float  init_co[3],
const float  curr_co[3],
float *  r_dist_sq,
float *  r_loc,
float *  r_no,
int *  r_index 
)
static

◆ nearest_world_mesh()

static bool nearest_world_mesh ( SnapObjectContext *  sctx,
const struct SnapObjectParams *  params,
Object *  ob_eval,
const Mesh *  me_eval,
const float(*)  obmat[4],
bool  use_hide,
const float  init_co[3],
const float  curr_co[3],
float *  r_dist_sq,
float *  r_loc,
float *  r_no,
int *  r_index 
)
static

◆ nearest_world_object_fn()

static void nearest_world_object_fn ( SnapObjectContext *  sctx,
const struct SnapObjectParams *  params,
Object *  ob_eval,
const float  obmat[4][4],
bool  is_object_active,
void *  data 
)
static

◆ nearest_world_tree()

static bool nearest_world_tree ( SnapObjectContext *  UNUSEDsctx,
const struct SnapObjectParams *  params,
BVHTree *  tree,
BVHTree_NearestPointCallback  nearest_cb,
void *  treedata,
const float(*)  obmat[4],
const float  init_co[3],
const float  curr_co[3],
float *  r_dist_sq,
float *  r_loc,
float *  r_no,
int *  r_index 
)
static

◆ nearest_world_tree_co()

static void nearest_world_tree_co ( BVHTree *  tree,
BVHTree_NearestPointCallback  nearest_cb,
void *  treedata,
float  co[3],
float  r_co[3],
float  r_no[3],
int *  r_index,
float *  r_dist_sq 
)
static

◆ nearestWorldObjects()

static bool nearestWorldObjects ( SnapObjectContext *  sctx,
const struct SnapObjectParams *  params,
const float  init_co[3],
const float  curr_co[3],
float *  r_loc,
float *  r_no,
int *  r_index,
Object **  r_ob,
float  r_obmat[4][4] 
)
static

Main Nearest World Surface Function

Walks through all objects in the scene to find the nearest location on target surface.

Parameters
sctxSnap context to store data.
paramsSettings for snapping.
init_coInitial location of source point.
prev_coCurrent location of source point after transformation but before snapping.

Output Args

Parameters
r_locLocation of nearest point on target surface.
r_noNormal of nearest point on target surface.
r_indexIndex of nearest polygon on target surface.
r_obNearest target object.
r_obmatNearest target matrix (may not be Object.obmat with dupli-instances).

Definition at line 1479 of file transform_snap_object.cc.

References NearestWorldObjUserData::curr_co, data, NearestWorldObjUserData::init_co, iter_snap_objects(), nearest_world_object_fn(), params, NearestWorldObjUserData::r_index, NearestWorldObjUserData::r_loc, NearestWorldObjUserData::r_no, NearestWorldObjUserData::r_ob, and NearestWorldObjUserData::r_obmat.

Referenced by transform_snap_context_project_view3d_mixed_impl().

◆ raycast_all_cb()

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

◆ raycast_obj_fn()

static void raycast_obj_fn ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
const float  obmat[4][4],
bool  is_object_active,
void *  data 
)
static

◆ raycast_tri_backface_culling_test()

static bool raycast_tri_backface_culling_test ( const float  dir[3],
const float  v0[3],
const float  v1[3],
const float  v2[3],
float  no[3] 
)
static

◆ raycastEditMesh()

static bool raycastEditMesh ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
const float  ray_start[3],
const float  ray_dir[3],
Object *  ob_eval,
BMEditMesh *  em,
const float  obmat[4][4],
const uint  ob_index,
float *  ray_depth,
float  r_loc[3],
float  r_no[3],
int *  r_index,
ListBase *  r_hit_list 
)
static

◆ raycastMesh()

static bool raycastMesh ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
const float  ray_start[3],
const float  ray_dir[3],
Object *  ob_eval,
const Mesh *  me_eval,
const float  obmat[4][4],
const uint  ob_index,
bool  use_hide,
float *  ray_depth,
float  r_loc[3],
float  r_no[3],
int *  r_index,
ListBase *  r_hit_list 
)
static

◆ raycastObjects()

static bool raycastObjects ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
const float  ray_start[3],
const float  ray_dir[3],
float *  ray_depth,
float  r_loc[3],
float  r_no[3],
int *  r_index,
Object **  r_ob,
float  r_obmat[4][4],
ListBase *  r_hit_list 
)
static

Main RayCast Function

Walks through all objects in the scene to find the hit on object surface.

Parameters
sctxSnap context to store data.

Read/Write Args

Parameters
ray_depthmaximum depth allowed for r_co, elements deeper than this value will be ignored.

Output Args

Parameters
r_locHit location.
r_noHit normal (optional).
r_indexHit index or -1 when no valid index is found. (currently only set to the polygon index when using snap_to == SCE_SNAP_MODE_FACE_RAYCAST).
r_obHit object.
r_obmatObject matrix (may not be Object.obmat with dupli-instances).
r_hit_listList of SnapObjectHitDepth (caller must free).

Definition at line 1142 of file transform_snap_object.cc.

References data, iter_snap_objects(), params, raycast_obj_fn(), SnapObjectContext::runtime, SNAP_GEOM_EDIT, SnapObjectContext::v3d, and XRAY_FLAG_ENABLED.

Referenced by ED_transform_snap_object_project_ray_all(), ED_transform_snap_object_project_ray_ex(), and transform_snap_context_project_view3d_mixed_impl().

◆ snap_bound_box_check_dist()

static bool snap_bound_box_check_dist ( const float  min[3],
const float  max[3],
const float  lpmat[4][4],
const float  win_size[2],
const float  mval[2],
float  dist_px_sq 
)
static

◆ snap_editmesh_minmax()

static void snap_editmesh_minmax ( SnapObjectContext *  sctx,
BMesh *  bm,
float  r_min[3],
float  r_max[3] 
)
static

Calculate the minimum and maximum coordinates of the box that encompasses this mesh.

Definition at line 220 of file transform_snap_object.cc.

References bm, BM_ITER_MESH, BM_VERTS_OF_MESH, SnapObjectContext::callbacks, BMVert::co, SnapObjectContext::edit_mesh, INIT_MINMAX, minmax_v3v3_v3(), and v.

Referenced by snap_object_data_editmesh_get().

◆ snap_mesh_edge_verts_mixed()

static eSnapMode snap_mesh_edge_verts_mixed ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
const float  obmat[4][4],
float  original_dist_px,
const float  prev_co[3],
float *  dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index 
)
static

◆ snap_mesh_polygon()

static eSnapMode snap_mesh_polygon ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
const float  obmat[4][4],
float *  dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index 
)
static

◆ snap_obj_fn()

static void snap_obj_fn ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
const float  obmat[4][4],
bool  is_object_active,
void *  data 
)
static

◆ snap_object_center()

static eSnapMode snap_object_center ( const SnapObjectContext *  sctx,
Object *  ob_eval,
const float  obmat[4][4],
float *  dist_px,
float  r_loc[3],
float *  UNUSEDr_no,
int *  r_index 
)
static

◆ snap_object_data_editmesh_get()

static SnapData_EditMesh* snap_object_data_editmesh_get ( SnapObjectContext *  sctx,
Object *  ob_eval,
BMEditMesh *  em 
)
static

◆ snap_object_data_editmesh_runtime_get()

static Mesh_Runtime* snap_object_data_editmesh_runtime_get ( Object *  ob_eval)
static

◆ snap_object_data_editmesh_treedata_get()

static BVHTreeFromEditMesh* snap_object_data_editmesh_treedata_get ( SnapObjectContext *  sctx,
Object *  ob_eval,
BMEditMesh *  em 
)
static

◆ snap_object_data_mesh_get()

static SnapData_Mesh* snap_object_data_mesh_get ( SnapObjectContext *  sctx,
Object *  ob_eval,
const Mesh *  me_eval,
bool  use_hide 
)
static

◆ snap_object_data_mesh_treedata_get()

static BVHTreeFromMesh* snap_object_data_mesh_treedata_get ( SnapObjectContext *  sctx,
Object *  ob_eval,
const Mesh *  me_eval,
bool  use_hide 
)
static

◆ snap_object_is_snappable()

static bool snap_object_is_snappable ( const SnapObjectContext *  sctx,
const eSnapTargetSelect  snap_target_select,
const Base *  base_act,
const Base *  base 
)
static

◆ snapArmature()

static eSnapMode snapArmature ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
const float  obmat[4][4],
bool  is_object_active,
float *  dist_px,
float  r_loc[3],
float *  UNUSEDr_no,
int *  r_index 
)
static

◆ snapCamera()

static eSnapMode snapCamera ( const SnapObjectContext *  sctx,
Object *  object,
const float  obmat[4][4],
float *  dist_px,
float  r_loc[3],
float *  r_no,
int *  r_index 
)
static

◆ snapCurve()

static eSnapMode snapCurve ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
const float  obmat[4][4],
float *  dist_px,
float  r_loc[3],
float *  UNUSEDr_no,
int *  r_index 
)
static

◆ snapEditMesh()

static eSnapMode snapEditMesh ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
BMEditMesh *  em,
const float  obmat[4][4],
float *  dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index 
)
static

◆ snapMesh()

static eSnapMode snapMesh ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
Object *  ob_eval,
const Mesh *  me_eval,
const float  obmat[4][4],
bool  use_hide,
float *  dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index 
)
static

◆ snapObjectsRay()

static eSnapMode snapObjectsRay ( SnapObjectContext *  sctx,
const SnapObjectParams *  params,
float *  dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index,
Object **  r_ob,
float  r_obmat[4][4] 
)
static

Main Snapping Function

Walks through all objects in the scene to find the closest snap element ray.

Parameters
sctxSnap context to store data.

Read/Write Args

Parameters
dist_pxMaximum threshold distance (in pixels).

Output Args

Parameters
r_locHit location.
r_noHit normal (optional).
r_indexHit index or -1 when no valid index is found. (currently only set to the polygon index when using snap_to == SCE_SNAP_MODE_FACE_RAYCAST).
r_obHit object.
r_obmatObject matrix (may not be Object.obmat with dupli-instances).

Definition at line 3168 of file transform_snap_object.cc.

References data, iter_snap_objects(), params, SCE_SNAP_MODE_NONE, and snap_obj_fn().

Referenced by transform_snap_context_project_view3d_mixed_impl().

◆ test_projected_edge_dist()

static bool test_projected_edge_dist ( const DistProjectedAABBPrecalc *  precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
const bool  is_persp,
const float  va[3],
const float  vb[3],
float *  dist_px_sq,
float  r_co[3] 
)
static

◆ test_projected_vert_dist()

static bool test_projected_vert_dist ( const DistProjectedAABBPrecalc *  precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
const bool  is_persp,
const float  co[3],
float *  dist_px_sq,
float  r_co[3] 
)
static

◆ transform_snap_context_project_ray_impl()

static bool transform_snap_context_project_ray_impl ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const View3D *  v3d,
const SnapObjectParams *  params,
const float  ray_start[3],
const float  ray_normal[3],
float *  ray_depth,
float  r_co[3],
float  r_no[3] 
)
static

Convenience function for snap ray-casting.

Given a ray, cast it into the scene (snapping to faces).

Returns
Snap success

Definition at line 3312 of file transform_snap_object.cc.

References depsgraph, ED_transform_snap_object_project_ray_ex(), params, and ret.

Referenced by ED_transform_snap_object_project_ray().

◆ transform_snap_context_project_view3d_mixed_impl()

static eSnapMode transform_snap_context_project_view3d_mixed_impl ( SnapObjectContext *  sctx,
Depsgraph *  depsgraph,
const ARegion *  region,
const View3D *  v3d,
const eSnapMode  snap_to_flag,
const SnapObjectParams *  params,
const float  init_co[3],
const float  mval[2],
const float  prev_co[3],
float *  dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index,
Object **  r_ob,
float  r_obmat[4][4],
float  r_face_nor[3] 
)
static