Blender V4.3
transform_snap_object.cc File Reference

Go to the source code of this file.

Functions

static float4 occlusion_plane_create (float3 ray_dir, float3 ray_co, float3 ray_no)
 
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, BVHTreeNearest *nearest)
 
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], BVHTreeNearest *nearest)
 
Utilities
static IDdata_for_snap (Object *ob_eval, eSnapEditType edit_mode_type, bool *r_use_hide)
 
Ray Cast Functions
static SnapObjectHitDepthhit_depth_create (const float depth, const float co[3], uint ob_uuid)
 
static int hit_depth_cmp (const void *arg1, const void *arg2)
 
void raycast_all_cb (void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
 
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 eSnapMode raycast_obj_fn (SnapObjectContext *sctx, const Object *ob_eval, const ID *ob_data, const float4x4 &obmat, bool, bool use_hide)
 
static bool raycastObjects (SnapObjectContext *sctx)
 
Surface Snap Functions
static void nearest_world_tree_co (BVHTree *tree, BVHTree_NearestPointCallback nearest_cb, void *treedata, const float3 &co, BVHTreeNearest *r_nearest)
 
bool nearest_world_tree (SnapObjectContext *sctx, BVHTree *tree, BVHTree_NearestPointCallback nearest_cb, const blender::float4x4 &obmat, void *treedata, BVHTreeNearest *r_nearest)
 
static eSnapMode nearest_world_object_fn (SnapObjectContext *sctx, const Object *ob_eval, const ID *ob_data, const float4x4 &obmat, bool, bool use_hide)
 
static bool nearestWorldObjects (SnapObjectContext *sctx)
 
Callbacks
void cb_snap_vert (void *userdata, int index, const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
void cb_snap_edge (void *userdata, int index, const DistProjectedAABBPrecalc *precalc, const float(*clip_plane)[4], const int clip_plane_len, BVHTreeNearest *nearest)
 
Internal Object Snapping API
static eSnapMode snap_polygon (SnapObjectContext *sctx, eSnapMode snap_to_flag)
 
static eSnapMode snap_edge_points (SnapObjectContext *sctx, const float dist_px_sq_orig)
 
eSnapMode snap_object_center (SnapObjectContext *sctx, const Object *ob_eval, const float4x4 &obmat, eSnapMode snap_to_flag)
 
static eSnapMode snap_obj_fn (SnapObjectContext *sctx, const Object *ob_eval, const ID *ob_data, const float4x4 &obmat, bool is_object_active, bool use_hide)
 
static eSnapMode snapObjectsRay (SnapObjectContext *sctx)
 
static bool snap_grid (SnapObjectContext *sctx)
 
Public Object Snapping API
SnapObjectContextED_transform_snap_object_context_create (Scene *scene, int)
 
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)
 
static bool snap_object_context_runtime_init (SnapObjectContext *sctx, Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, eSnapMode snap_to_flag, eSnapOcclusionTest occlusion_test, const SnapObjectParams *params, const float ray_start[3], const float ray_dir[3], const float ray_depth, const float mval[2], const float init_co[3], const float prev_co[3], const float dist_px_sq, ListBase *hit_list)
 
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, const 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)
 
bool ED_transform_snap_object_project_ray (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])
 
eSnapMode ED_transform_snap_object_project_view3d_ex (SnapObjectContext *sctx, Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, 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, const 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)
 

Iterator

using IterSnapObjsCallback
 
static bool snap_object_is_snappable (const SnapObjectContext *sctx, const eSnapTargetOP snap_target_select, const Base *base_act, const Base *base)
 
static eSnapMode iter_snap_objects (SnapObjectContext *sctx, IterSnapObjsCallback sob_callback)
 

Typedef Documentation

◆ IterSnapObjsCallback

Initial value:
const Object *ob_eval,
const ID *ob_data,
const float4x4 &obmat,
bool is_object_active,
bool use_hide)
Definition DNA_ID.h:413

Definition at line 397 of file transform_snap_object.cc.

Function Documentation

◆ cb_snap_edge()

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

◆ cb_snap_vert()

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

◆ data_for_snap()

static ID * data_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: #96536.

Definition at line 351 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(), Object::data, ME_WRAPPER_TYPE_BMESH, OB_MESH, Mesh::runtime, SNAP_GEOM_CAGE, SNAP_GEOM_EDIT, SNAP_GEOM_FINAL, and Object::type.

Referenced by iter_snap_objects().

◆ ED_transform_snap_object_context_create()

◆ ED_transform_snap_object_context_destroy()

◆ ED_transform_snap_object_context_set_editmesh_callbacks()

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 )

◆ 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_start[3],
const float ray_normal[3],
float * ray_depth,
float r_co[3],
float r_no[3] )

Convenience function for snap ray-casting.

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

Returns
Snap success

Definition at line 1277 of file transform_snap_object.cc.

References depsgraph, ED_transform_snap_object_project_ray_ex(), and params.

Referenced by view3d_ruler_item_mousemove(), walk_floor_distance_get(), and walk_ray_cast().

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

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 1232 of file transform_snap_object.cc.

References BLI_assert, BLI_listbase_sort(), BVH_RAYCAST_DIST_MAX, depsgraph, hit_depth_cmp(), params, SnapObjectContext::ray_depth_max, raycastObjects(), SnapObjectContext::ret, SCE_SNAP_TO_FACE, and snap_object_context_runtime_init().

Referenced by ED_transform_snap_object_project_all_view3d_ex().

◆ ED_transform_snap_object_project_ray_ex()

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

Convenience function for performing snapping.

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

Parameters
sctxSnap context.
snap_toTarget elements to snap source to.
paramsAddition snapping options.
init_coInitial world-space coordinate of source (optional).
mvalCurrent transformed screen-space coordinate or mouse position (optional).
prev_coCurrent transformed world-space coordinate of source (optional).
dist_pxMaximum distance to snap (in pixels).
r_locSnapped world-space coordinate.
r_noSnapped world-space normal (optional).
Returns
Snapped-to element, eSnapMode.

Definition at line 1499 of file transform_snap_object.cc.

References depsgraph, ED_transform_snap_object_project_view3d_ex(), and params.

Referenced by add_vertex_invoke(), applyFaceNearest(), applyFaceProject(), EDBM_project_snap_verts(), gizmo_move_modal(), snapObjectsTransform(), v3d_cursor_snap_update(), and view3d_ruler_item_mousemove().

◆ 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,
const Object ** r_ob,
float r_obmat[4][4],
float r_face_nor[3] )

Perform snapping.

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

Parameters
sctxSnap context.
snap_toTarget elements to snap source to.
paramsAddition snapping options.
init_coInitial world-space coordinate of source (optional).
mvalCurrent transformed screen-space coordinate or mouse position (optional).
prev_coCurrent transformed world-space coordinate of source (optional).
dist_pxMaximum distance to snap (in pixels).
r_locSnapped world-space coordinate.
r_noSnapped world-space normal (optional).
r_indexIndex of snapped-to target element (optional).
r_obSnapped-to target object (optional).
r_obmatMatrix of snapped-to target object (optional).
r_face_norWorld-space normal of snapped-to target face (optional).
Returns
Snapped-to element, eSnapMode.

Definition at line 1301 of file transform_snap_object.cc.

References BLI_assert, BLI_ASSERT_UNIT_V3, BVH_RAYCAST_DIST_MAX, RegionView3D::clip, clip_segment_v3_plane_n(), copy_m4_m4(), copy_v3_v3(), depsgraph, SnapObjectContext::dist_px_sq, blender::math::dot(), ED_view3d_win_to_ray_clipped_ex(), FLT_MAX, SnapObjectContext::has_occlusion_plane, SnapObjectContext::index, SnapObjectContext::loc, nearestWorldObjects(), SnapObjectContext::no, SnapObjectContext::ob, SnapObjectContext::obmat, SnapObjectContext::occlusion_plane, occlusion_plane_create(), params, blender::MatBase< T, NumCol, NumRow, Alignment >::ptr(), SnapObjectContext::ray_dir, SnapObjectContext::ray_start, raycastObjects(), SnapObjectContext::ret, RegionView3D::rflag, SnapObjectContext::runtime, RV3D_CLIPPING, SCE_SNAP_INDIVIDUAL_NEAREST, SCE_SNAP_TO_EDGE, SCE_SNAP_TO_EDGE_ENDPOINT, SCE_SNAP_TO_EDGE_MIDPOINT, SCE_SNAP_TO_EDGE_PERPENDICULAR, SCE_SNAP_TO_FACE, SCE_SNAP_TO_GEOM, SCE_SNAP_TO_GRID, SCE_SNAP_TO_NONE, SCE_SNAP_TO_POINT, snap_edge_points(), snap_grid(), snap_object_context_runtime_init(), SNAP_OCCLUSION_ALWAYS, SNAP_OCCLUSION_AS_SEEM, SNAP_OCCLUSION_NEVER, snap_polygon(), SNAP_TO_EDGE_ELEMENTS, SnapObjectContext::snap_to_flag, snapObjectsRay(), blender::math::sqrt(), square_f(), and XRAY_ENABLED.

Referenced by ED_transform_snap_object_project_view3d(), ED_view3d_cursor3d_position_rotation(), and v3d_cursor_snap_update().

◆ 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],
uint ob_uuid )
static

Definition at line 521 of file transform_snap_object.cc.

References copy_v3_v3().

Referenced by raycast_all_cb().

◆ iter_snap_objects()

◆ nearest_world_object_fn()

◆ nearest_world_tree()

◆ nearest_world_tree_co()

static void nearest_world_tree_co ( BVHTree * tree,
BVHTree_NearestPointCallback nearest_cb,
void * treedata,
const float3 & co,
BVHTreeNearest * r_nearest )
static

◆ nearestWorldObjects()

static bool nearestWorldObjects ( SnapObjectContext * sctx)
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.

Definition at line 773 of file transform_snap_object.cc.

References iter_snap_objects(), nearest_world_object_fn(), and SCE_SNAP_TO_NONE.

Referenced by ED_transform_snap_object_project_view3d_ex().

◆ occlusion_plane_create()

static float4 occlusion_plane_create ( float3 ray_dir,
float3 ray_co,
float3 ray_no )
static

◆ raycast_all_cb()

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

◆ raycast_obj_fn()

◆ raycast_tri_backface_culling_test()

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

◆ raycastObjects()

static bool raycastObjects ( SnapObjectContext * sctx)
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.

Definition at line 643 of file transform_snap_object.cc.

References iter_snap_objects(), raycast_obj_fn(), and SCE_SNAP_TO_NONE.

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

◆ snap_edge_points()

◆ snap_grid()

◆ snap_obj_fn()

◆ snap_object_center()

◆ snap_object_context_runtime_init()

static bool snap_object_context_runtime_init ( SnapObjectContext * sctx,
Depsgraph * depsgraph,
const ARegion * region,
const View3D * v3d,
eSnapMode snap_to_flag,
eSnapOcclusionTest occlusion_test,
const SnapObjectParams * params,
const float ray_start[3],
const float ray_dir[3],
const float ray_depth,
const float mval[2],
const float init_co[3],
const float prev_co[3],
const float dist_px_sq,
ListBase * hit_list )
static

Definition at line 1059 of file transform_snap_object.cc.

References blender::math::abs(), RegionView3D::clip, SnapObjectContext::clip_planes, compare_m4m4(), copy_v2_v2(), copy_v3_v3(), SnapObjectContext::curr_co, SnapObjectContext::data, depsgraph, SnapObjectContext::depsgraph, SnapObjectContext::dist_px_sq, ED_view3d_grid_view_scale(), SnapObjectContext::grid, SnapObjectContext::has_occlusion_plane, SnapObjectContext::has_occlusion_plane_in_front, SnapObjectContext::hit_list, SnapObjectContext::index, SnapObjectContext::init_co, SnapObjectContext::mval, SnapObjectContext::ob, SnapObjectContext::object_index, SnapObjectParams::occlusion_test, SnapObjectContext::occlusion_test_edit, params, SnapObjectContext::params, RegionView3D::persmat, SnapObjectContext::persmat, plane_from_point_normal_v3(), SnapObjectContext::planes, planes_from_projmat(), blender::MatBase< T, NumCol, NumRow, Alignment >::ptr(), SnapObjectContext::ray_depth_max, SnapObjectContext::ray_depth_max_in_front, SnapObjectContext::ray_dir, SnapObjectContext::ray_start, SnapObjectContext::ret, RegionView3D::rflag, SnapObjectContext::runtime, SnapObjectContext::rv3d, RV3D_CLIPPING, SCE_SNAP_INDIVIDUAL_NEAREST, SCE_SNAP_TO_EDGE_PERPENDICULAR, SCE_SNAP_TO_FACE, SCE_SNAP_TO_GRID, SCE_SNAP_TO_NONE, SnapObjectContext::scene, SnapObjectContext::size, SNAP_OCCLUSION_ALWAYS, SnapObjectContext::snap_to_flag, SnapObjectContext::use_init_co, SnapObjectContext::v3d, RegionView3D::viewinv, and SnapObjectContext::win_size.

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

◆ snap_object_is_snappable()

◆ snap_polygon()

◆ snapObjectsRay()

static eSnapMode snapObjectsRay ( SnapObjectContext * sctx)
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).

Definition at line 956 of file transform_snap_object.cc.

References iter_snap_objects(), and snap_obj_fn().

Referenced by ED_transform_snap_object_project_view3d_ex().

◆ 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],
BVHTreeNearest * nearest )
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,
BVHTreeNearest * nearest )
static