Blender  V2.93
Classes
transform_snap_object.c File Reference
#include <stdlib.h>
#include "MEM_guardedalloc.h"
#include "BLI_ghash.h"
#include "BLI_kdopbvh.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
#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_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
 
struct  SnapObjectData
 
struct  SnapObjectContext
 
struct  RayCastAll_Data
 
struct  RaycastObjUserData
 
struct  Nearest2dUserData
 
struct  SnapObjUserData
 

Functions

Utilities
static bool editmesh_eval_final_is_bmesh (const BMEditMesh *em)
 
Snap Object Data
static void bm_mesh_minmax (BMesh *bm, float r_min[3], float r_max[3])
 
static void snap_object_data_mesh_clear (SnapObjectData *sod)
 
static void snap_object_data_editmesh_clear (SnapObjectData *sod)
 
static void snap_object_data_clear (SnapObjectData *sod)
 
static SnapObjectDatasnap_object_data_lookup (SnapObjectContext *sctx, Object *ob)
 
static SnapObjectDatasnap_object_data_mesh_get (SnapObjectContext *sctx, Object *ob)
 
static struct Mesh_Runtimesnap_object_data_editmesh_runtime_get (Object *ob)
 
static SnapObjectDatasnap_object_data_editmesh_get (SnapObjectContext *sctx, Object *ob, BMEditMesh *em)
 
Ray Cast Funcs
static struct SnapObjectHitDepthhit_depth_create (const float depth, const float co[3], const float no[3], int index, Object *ob, 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 float ray_start[3], const float ray_dir[3], Object *ob, Mesh *me, const float obmat[4][4], const uint ob_index, bool use_hide, bool use_backface_culling, float *ray_depth, float r_loc[3], float r_no[3], int *r_index, ListBase *r_hit_list)
 
static bool raycastEditMesh (SnapObjectContext *sctx, const float ray_start[3], const float ray_dir[3], Object *ob, BMEditMesh *em, const float obmat[4][4], const uint ob_index, bool use_backface_culling, 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, Object *ob, float obmat[4][4], bool use_obedit, bool use_backface_culling, bool is_object_active, void *data)
 
static bool raycastObjects (SnapObjectContext *sctx, Depsgraph *depsgraph, const struct 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)
 
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)
 
static void cb_mvert_co_get (const int index, const float **co, const BVHTreeFromMesh *data)
 
static void cb_bvert_co_get (const int index, const float **co, const BMEditMesh *data)
 
static void cb_mvert_no_copy (const int index, float r_no[3], const BVHTreeFromMesh *data)
 
static void cb_bvert_no_copy (const int index, float r_no[3], const BMEditMesh *data)
 
static void cb_medge_verts_get (const int index, int v_index[2], const BVHTreeFromMesh *data)
 
static void cb_bedge_verts_get (const int index, int v_index[2], const BMEditMesh *data)
 
static void cb_mlooptri_edges_get (const int index, int v_index[3], const BVHTreeFromMesh *data)
 
static void cb_mlooptri_verts_get (const int index, int v_index[3], const BVHTreeFromMesh *data)
 
static bool test_projected_vert_dist (const struct 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 struct 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])
 
Internal Object Snapping API
static short snap_mesh_polygon (SnapObjectContext *sctx, SnapData *snapdata, Object *ob, const float obmat[4][4], bool use_backface_culling, float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static short snap_mesh_edge_verts_mixed (SnapObjectContext *sctx, SnapData *snapdata, Object *ob, const float obmat[4][4], float original_dist_px, const float prev_co[3], bool use_backface_culling, float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static short snapArmature (SnapData *snapdata, Object *ob, const float obmat[4][4], bool use_obedit, float *dist_px, float r_loc[3], float *UNUSED(r_no), int *r_index)
 
static short snapCurve (SnapData *snapdata, Object *ob, const float obmat[4][4], bool use_obedit, float *dist_px, float r_loc[3], float *UNUSED(r_no), int *r_index)
 
static short snap_object_center (SnapData *snapdata, Object *ob, const float obmat[4][4], float *dist_px, float r_loc[3], float *UNUSED(r_no), int *r_index)
 
static short snapCamera (const SnapObjectContext *sctx, SnapData *snapdata, Object *object, float obmat[4][4], float *dist_px, float r_loc[3], float *r_no, int *r_index)
 
static short snapMesh (SnapObjectContext *sctx, SnapData *snapdata, Object *ob, Mesh *me, const float obmat[4][4], bool use_backface_culling, float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static short snapEditMesh (SnapObjectContext *sctx, SnapData *snapdata, Object *ob, BMEditMesh *em, const float obmat[4][4], bool use_backface_culling, float *dist_px, float r_loc[3], float r_no[3], int *r_index)
 
static void snap_obj_fn (SnapObjectContext *sctx, Object *ob, float obmat[4][4], bool use_obedit, bool use_backface_culling, bool UNUSED(is_object_active), void *data)
 
static short snapObjectsRay (SnapObjectContext *sctx, Depsgraph *depsgraph, SnapData *snapdata, const struct 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
SnapObjectContextED_transform_snap_object_context_create (Scene *scene, int flag)
 
SnapObjectContextED_transform_snap_object_context_create_view3d (Scene *scene, int flag, const ARegion *region, const View3D *v3d)
 
static void snap_object_data_free (void *sod_v)
 
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 struct 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 struct 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 struct 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 struct SnapObjectParams *params, const float ray_origin[3], const float ray_direction[3], float *ray_depth, float r_co[3], float r_no[3])
 
static short transform_snap_context_project_view3d_mixed_impl (SnapObjectContext *sctx, Depsgraph *depsgraph, const ushort snap_to_flag, const struct SnapObjectParams *params, 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])
 
short ED_transform_snap_object_project_view3d_ex (SnapObjectContext *sctx, Depsgraph *depsgraph, const ushort snap_to, const struct SnapObjectParams *params, 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])
 
bool ED_transform_snap_object_project_view3d (SnapObjectContext *sctx, Depsgraph *depsgraph, const ushort snap_to, const struct SnapObjectParams *params, 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 struct 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 }
 
typedef struct SnapData SnapData
 
typedef struct SnapObjectData SnapObjectData
 

Iterator

typedef void(* IterSnapObjsCallback) (SnapObjectContext *sctx, Object *ob, float obmat[4][4], bool use_obedit, bool use_backface_culling, bool is_object_active, void *data)
 
static void iter_snap_objects (SnapObjectContext *sctx, Depsgraph *depsgraph, const struct SnapObjectParams *params, IterSnapObjsCallback sob_callback, void *data)
 

Walk DFS

typedef void(* Nearest2DGetVertCoCallback) (const int index, const float **co, void *data)
 
typedef void(* Nearest2DGetEdgeVertsCallback) (const int index, const int v_index[2], void *data)
 
typedef void(* Nearest2DGetTriVertsCallback) (const int index, const int v_index[3], void *data)
 
typedef void(* Nearest2DGetTriEdgesCallback) (const int index, const int e_index[3], void *data)
 
typedef void(* Nearest2DCopyVertNoCallback) (const int index, const float r_no[3], void *data)
 
typedef struct Nearest2dUserData Nearest2dUserData
 
static void cb_snap_vert (void *userdata, int index, const struct DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
static void cb_snap_edge (void *userdata, int index, const struct 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 struct 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 struct 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 struct DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 

Macro Definition Documentation

◆ MAX_CLIPPLANE_LEN

#define MAX_CLIPPLANE_LEN   3

Definition at line 63 of file transform_snap_object.c.

Typedef Documentation

◆ IterSnapObjsCallback

typedef void(* IterSnapObjsCallback) (SnapObjectContext *sctx, Object *ob, float obmat[4][4], bool use_obedit, bool use_backface_culling, bool is_object_active, void *data)

Definition at line 370 of file transform_snap_object.c.

◆ Nearest2DCopyVertNoCallback

typedef void(* Nearest2DCopyVertNoCallback) (const int index, const float r_no[3], void *data)

Definition at line 1312 of file transform_snap_object.c.

◆ Nearest2DGetEdgeVertsCallback

typedef void(* Nearest2DGetEdgeVertsCallback) (const int index, const int v_index[2], void *data)

Definition at line 1308 of file transform_snap_object.c.

◆ Nearest2DGetTriEdgesCallback

typedef void(* Nearest2DGetTriEdgesCallback) (const int index, const int e_index[3], void *data)

Definition at line 1311 of file transform_snap_object.c.

◆ Nearest2DGetTriVertsCallback

typedef void(* Nearest2DGetTriVertsCallback) (const int index, const int v_index[3], void *data)

Definition at line 1309 of file transform_snap_object.c.

◆ Nearest2DGetVertCoCallback

typedef void(* Nearest2DGetVertCoCallback) (const int index, const float **co, void *data)

Definition at line 1307 of file transform_snap_object.c.

◆ Nearest2dUserData

◆ SnapData

typedef struct SnapData SnapData

◆ SnapObjectData

Enumeration Type Documentation

◆ eViewProj

enum eViewProj
Enumerator
VIEW_PROJ_NONE 
VIEW_PROJ_ORTHO 
VIEW_PROJ_PERSP 

Definition at line 65 of file transform_snap_object.c.

Function Documentation

◆ bm_mesh_minmax()

static void bm_mesh_minmax ( 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 162 of file transform_snap_object.c.

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

Referenced by snap_object_data_editmesh_get().

◆ cb_bedge_verts_get()

static void cb_bedge_verts_get ( const int  index,
int  v_index[2],
const BMEditMesh data 
)
static

◆ cb_bvert_co_get()

static void cb_bvert_co_get ( const int  index,
const float **  co,
const BMEditMesh data 
)
static

◆ cb_bvert_no_copy()

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

◆ cb_medge_verts_get()

static void cb_medge_verts_get ( const int  index,
int  v_index[2],
const BVHTreeFromMesh data 
)
static

Definition at line 1197 of file transform_snap_object.c.

References data, MEdge::v1, and MEdge::v2.

Referenced by snap_mesh_edge_verts_mixed(), snap_mesh_polygon(), and snapMesh().

◆ cb_mlooptri_edges_get()

static void cb_mlooptri_edges_get ( const int  index,
int  v_index[3],
const BVHTreeFromMesh data 
)
static

Definition at line 1213 of file transform_snap_object.c.

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

Referenced by snapMesh().

◆ cb_mlooptri_verts_get()

static void cb_mlooptri_verts_get ( const int  index,
int  v_index[3],
const BVHTreeFromMesh data 
)
static

Definition at line 1231 of file transform_snap_object.c.

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

Referenced by snapMesh().

◆ cb_mvert_co_get()

static void cb_mvert_co_get ( const int  index,
const float **  co,
const BVHTreeFromMesh data 
)
static

Definition at line 1172 of file transform_snap_object.c.

References data.

Referenced by snap_mesh_edge_verts_mixed(), snap_mesh_polygon(), and snapMesh().

◆ cb_mvert_no_copy()

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

◆ cb_snap_edge()

static void cb_snap_edge ( void *  userdata,
int  index,
const struct 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 struct DistProjectedAABBPrecalc precalc,
const float(*)  clip_plane[4],
const int  clip_plane_len,
BVHTreeNearest nearest 
)
static

Definition at line 1379 of file transform_snap_object.c.

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

Referenced by snapMesh().

◆ cb_snap_tri_edges()

static void cb_snap_tri_edges ( void *  userdata,
int  index,
const struct 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 struct 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 struct 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_create_view3d()

SnapObjectContext* ED_transform_snap_object_context_create_view3d ( Scene scene,
int  flag,
const ARegion region,
const View3D v3d 
)

◆ 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 struct 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 struct 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 struct SnapObjectParams params,
const float  ray_start[3],
const float  ray_normal[3],
float  ray_depth,
bool  sort,
ListBase r_hit_list 
)

Fill in a list of all hits.

Parameters
ray_depthOnly depths in this range are considered, -1.0 for maximum.
sortOptionally sort the hits by depth.
r_hit_listList of SnapObjectHitDepth (caller must free).

Definition at line 2919 of file transform_snap_object.c.

References BLI_assert, BLI_listbase_sort(), BVH_RAYCAST_DIST_MAX, depsgraph, hit_depth_cmp(), NULL, params, raycastObjects(), and sort().

Referenced by ED_transform_snap_object_project_all_view3d_ex().

◆ ED_transform_snap_object_project_ray_ex()

bool ED_transform_snap_object_project_ray_ex ( SnapObjectContext sctx,
Depsgraph depsgraph,
const struct 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()

bool ED_transform_snap_object_project_view3d ( SnapObjectContext sctx,
Depsgraph depsgraph,
const ushort  snap_to,
const struct SnapObjectParams params,
const float  mval[2],
const float  prev_co[3],
float dist_px,
float  r_loc[3],
float  r_no[3] 
)

Convenience function for performing snapping.

Given a 2D region value, snap to vert/edge/face.

Parameters
sctxSnap context.
mvalScreenspace coordinate.
prev_coCoordinate for perpendicular point calculation (optional).
dist_pxMaximum distance to snap (in pixels).
r_lochit location.
r_nohit normal (optional).
Returns
Snap success

Definition at line 3226 of file transform_snap_object.c.

References depsgraph, SnapObjUserData::dist_px, ED_transform_snap_object_project_view3d_ex(), NULL, params, SnapObjUserData::r_loc, and SnapObjUserData::r_no.

Referenced by add_vertex_invoke(), applyProject(), EDBM_project_snap_verts(), gizmo_move_modal(), view3d_interactive_add_calc_plane(), and view3d_ruler_item_mousemove().

◆ ED_transform_snap_object_project_view3d_ex()

short ED_transform_snap_object_project_view3d_ex ( SnapObjectContext sctx,
Depsgraph depsgraph,
const ushort  snap_to,
const struct SnapObjectParams params,
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] 
)

◆ editmesh_eval_final_is_bmesh()

static bool editmesh_eval_final_is_bmesh ( const BMEditMesh em)
static

◆ 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 struct SnapObjectHitDepth* hit_depth_create ( const float  depth,
const float  co[3],
const float  no[3],
int  index,
Object ob,
const float  obmat[4][4],
uint  ob_uuid 
)
static

◆ iter_snap_objects()

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

◆ mesh_looptri_raycast_backface_culling_cb()

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

◆ 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,
Object ob,
float  obmat[4][4],
bool  use_obedit,
bool  use_backface_culling,
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 float  ray_start[3],
const float  ray_dir[3],
Object ob,
BMEditMesh em,
const float  obmat[4][4],
const uint  ob_index,
bool  use_backface_culling,
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 float  ray_start[3],
const float  ray_dir[3],
Object ob,
Mesh me,
const float  obmat[4][4],
const uint  ob_index,
bool  use_hide,
bool  use_backface_culling,
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,
Depsgraph depsgraph,
const struct 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.
paramsSnapping behavior.

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 when using snap_to == SCE_SNAP_MODE_FACE).
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 1106 of file transform_snap_object.c.

References data, depsgraph, iter_snap_objects(), params, RaycastObjUserData::r_hit_list, RaycastObjUserData::r_index, RaycastObjUserData::r_loc, RaycastObjUserData::r_no, RaycastObjUserData::r_ob, RaycastObjUserData::r_obmat, RaycastObjUserData::ray_depth, RaycastObjUserData::ray_dir, RaycastObjUserData::ray_start, and raycast_obj_fn().

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

static short snap_mesh_edge_verts_mixed ( SnapObjectContext sctx,
SnapData snapdata,
Object ob,
const float  obmat[4][4],
float  original_dist_px,
const float  prev_co[3],
bool  use_backface_culling,
float dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index 
)
static

◆ snap_mesh_polygon()

static short snap_mesh_polygon ( SnapObjectContext sctx,
SnapData snapdata,
Object ob,
const float  obmat[4][4],
bool  use_backface_culling,
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,
Object ob,
float  obmat[4][4],
bool  use_obedit,
bool  use_backface_culling,
bool   UNUSEDis_object_active,
void *  data 
)
static

◆ snap_object_center()

static short snap_object_center ( SnapData snapdata,
Object ob,
const float  obmat[4][4],
float dist_px,
float  r_loc[3],
float UNUSEDr_no,
int *  r_index 
)
static

◆ snap_object_data_clear()

static void snap_object_data_clear ( SnapObjectData sod)
static

◆ snap_object_data_editmesh_clear()

static void snap_object_data_editmesh_clear ( SnapObjectData sod)
static

◆ snap_object_data_editmesh_get()

static SnapObjectData* snap_object_data_editmesh_get ( SnapObjectContext sctx,
Object ob,
BMEditMesh em 
)
static

◆ snap_object_data_editmesh_runtime_get()

static struct Mesh_Runtime* snap_object_data_editmesh_runtime_get ( Object ob)
static

◆ snap_object_data_free()

static void snap_object_data_free ( void *  sod_v)
static

◆ snap_object_data_lookup()

static SnapObjectData* snap_object_data_lookup ( SnapObjectContext sctx,
Object ob 
)
static

◆ snap_object_data_mesh_clear()

static void snap_object_data_mesh_clear ( SnapObjectData sod)
static

◆ snap_object_data_mesh_get()

static SnapObjectData* snap_object_data_mesh_get ( SnapObjectContext sctx,
Object ob 
)
static

◆ snapArmature()

static short snapArmature ( SnapData snapdata,
Object ob,
const float  obmat[4][4],
bool  use_obedit,
float dist_px,
float  r_loc[3],
float UNUSEDr_no,
int *  r_index 
)
static

◆ snapCamera()

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

◆ snapCurve()

static short snapCurve ( SnapData snapdata,
Object ob,
const float  obmat[4][4],
bool  use_obedit,
float dist_px,
float  r_loc[3],
float UNUSEDr_no,
int *  r_index 
)
static

◆ snapEditMesh()

static short snapEditMesh ( SnapObjectContext sctx,
SnapData snapdata,
Object ob,
BMEditMesh em,
const float  obmat[4][4],
bool  use_backface_culling,
float dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index 
)
static

◆ snapMesh()

static short snapMesh ( SnapObjectContext sctx,
SnapData snapdata,
Object ob,
Mesh me,
const float  obmat[4][4],
bool  use_backface_culling,
float dist_px,
float  r_loc[3],
float  r_no[3],
int *  r_index 
)
static

Definition at line 2223 of file transform_snap_object.c.

References BKE_bvhtree_from_mesh_get(), BKE_mesh_boundbox_get(), BKE_mesh_runtime_looptri_ensure(), BLI_assert, BLI_bvhtree_find_nearest_projected(), Mesh_Runtime::bvh_cache, bvhcache_has_tree(), SnapObjectData::bvhtree, BVHTREE_FROM_LOOPTRI, BVHTREE_FROM_LOOSEEDGES, BVHTREE_FROM_LOOSEVERTS, BVHTreeFromMesh::cached, SnapObjectData::cached, cb_medge_verts_get(), cb_mlooptri_edges_get(), cb_mlooptri_verts_get(), cb_mvert_co_get(), cb_mvert_no_copy(), cb_snap_edge(), cb_snap_edge_verts(), cb_snap_tri_edges(), cb_snap_tri_verts(), cb_snap_vert(), SnapData::clip_plane, SnapData::clip_plane_len, BVHTreeNearest::co, copy_v3_v3(), BVHTreeNearest::dist_sq, BVHTreeFromMesh::edge, BVHTreeFromMesh::edge_allocated, free_bvhtree_from_mesh(), SnapObjectData::has_looptris, SnapObjectData::has_loose_edge, SnapObjectData::has_loose_vert, BVHTreeNearest::index, invert_m4_m4(), BVHTreeFromMesh::loop, BVHTreeFromMesh::loop_allocated, BVHTreeFromMesh::looptri, BVHTreeFromMesh::looptri_allocated, MAX_CLIPPLANE_LEN, Mesh::medge, Mesh::mloop, mul_m4_m4m4(), mul_m4_v3(), mul_transposed_mat3_m4_v3(), mul_v4_m4v4(), SnapData::mval, Mesh::mvert, BVHTreeNearest::no, normalize_v3(), NULL, SnapData::pmat, Mesh::runtime, SCE_SNAP_MODE_EDGE, SCE_SNAP_MODE_FACE, SCE_SNAP_MODE_VERTEX, snap_bound_box_check_dist(), snap_object_data_mesh_get(), SnapData::snap_to_flag, sqrtf, square_f(), Mesh::totedge, Mesh::totvert, transpose_m4_m4(), BVHTreeFromMesh::tree, SnapObjectData::treedata_mesh, Nearest2dUserData::userdata, BoundBox::vec, BVHTreeFromMesh::vert, BVHTreeFromMesh::vert_allocated, SnapData::view_proj, VIEW_PROJ_PERSP, and SnapData::win_size.

Referenced by snap_obj_fn().

◆ snapObjectsRay()

static short snapObjectsRay ( SnapObjectContext sctx,
Depsgraph depsgraph,
SnapData snapdata,
const struct 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.
snapdatastruct generated in get_snapdata.
paramsParameters for control snap behavior.

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 when using snap_to == SCE_SNAP_MODE_FACE).
r_obHit object.
r_obmatObject matrix (may not be Object.obmat with dupli-instances).

Definition at line 2787 of file transform_snap_object.c.

References data, depsgraph, SnapObjUserData::dist_px, iter_snap_objects(), params, SnapObjUserData::r_index, SnapObjUserData::r_loc, SnapObjUserData::r_no, SnapObjUserData::r_ob, SnapObjUserData::r_obmat, snap_obj_fn(), and SnapObjUserData::snapdata.

Referenced by transform_snap_context_project_view3d_mixed_impl().

◆ test_projected_edge_dist()

static bool test_projected_edge_dist ( const struct 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 struct 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 struct 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 2968 of file transform_snap_object.c.

References depsgraph, ED_transform_snap_object_project_ray_ex(), NULL, params, SnapObjUserData::r_no, and ret.

Referenced by ED_transform_snap_object_project_ray().

◆ transform_snap_context_project_view3d_mixed_impl()

static short transform_snap_context_project_view3d_mixed_impl ( SnapObjectContext sctx,
Depsgraph depsgraph,
const ushort  snap_to_flag,
const struct SnapObjectParams params,
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] 
)
static