Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/curve/editcurve.c6
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c5
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c18
-rw-r--r--source/blender/editors/gpencil/gpencil_bake_animation.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_mesh.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_utils.c1
-rw-r--r--source/blender/editors/include/ED_gizmo_library.h2
-rw-r--r--source/blender/editors/include/ED_transform_snap_object_context.h14
-rw-r--r--source/blender/editors/mesh/editmesh_utils.c6
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c5
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_ruler.c6
-rw-r--r--source/blender/editors/space_view3d/view3d_navigate_walk.c5
-rw-r--r--source/blender/editors/space_view3d/view3d_placement.c14
-rw-r--r--source/blender/editors/transform/transform_snap.c9
-rw-r--r--source/blender/editors/transform/transform_snap_object.c440
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c1
17 files changed, 278 insertions, 263 deletions
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 9b43e23bd32..d4fdf46d8f4 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -5561,12 +5561,14 @@ static int add_vertex_invoke(bContext *C, wmOperator *op, const wmEvent *event)
if (use_proj) {
const float mval[2] = {UNPACK2(event->mval)};
- struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
- vc.scene, 0, vc.region, vc.v3d);
+ struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create(vc.scene,
+ 0);
ED_transform_snap_object_project_view3d(
snap_context,
vc.depsgraph,
+ vc.region,
+ vc.v3d,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = (vc.obedit != NULL) ? SNAP_NOT_ACTIVE : SNAP_ALL,
diff --git a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
index 68322ed56af..ec4837aec3c 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/move3d_gizmo.c
@@ -289,6 +289,8 @@ static int gizmo_move_modal(bContext *C,
if (ED_transform_snap_object_project_view3d(
inter->snap_context_v3d,
CTX_data_ensure_evaluated_depsgraph(C),
+ region,
+ CTX_wm_view3d(C),
(SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE),
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
@@ -381,8 +383,7 @@ static int gizmo_move_invoke(bContext *C, wmGizmo *gz, const wmEvent *event)
if (area) {
switch (area->spacetype) {
case SPACE_VIEW3D: {
- inter->snap_context_v3d = ED_transform_snap_object_context_create_view3d(
- CTX_data_scene(C), 0, CTX_wm_region(C), CTX_wm_view3d(C));
+ inter->snap_context_v3d = ED_transform_snap_object_context_create(CTX_data_scene(C), 0);
break;
}
default:
diff --git a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
index ae2cc05c01b..f673d3e85ef 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/snap3d_gizmo.c
@@ -278,15 +278,11 @@ void ED_gizmotypes_snap_3d_draw_util(RegionView3D *rv3d,
immUnbindProgram();
}
-SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene,
- const ARegion *region,
- const View3D *v3d,
- wmGizmo *gz)
+SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(Scene *scene, wmGizmo *gz)
{
SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
if (snap_gizmo->snap_context_v3d == NULL) {
- snap_gizmo->snap_context_v3d = ED_transform_snap_object_context_create_view3d(
- scene, 0, region, v3d);
+ snap_gizmo->snap_context_v3d = ED_transform_snap_object_context_create(scene, 0);
}
return snap_gizmo->snap_context_v3d;
}
@@ -387,6 +383,8 @@ short ED_gizmotypes_snap_3d_update(wmGizmo *gz,
snap_elem = ED_transform_snap_object_project_view3d_ex(
snap_gizmo->snap_context_v3d,
depsgraph,
+ region,
+ v3d,
snap_elements,
&(const struct SnapObjectParams){
.snap_select = snap_select,
@@ -576,8 +574,12 @@ static void snap_gizmo_setup(wmGizmo *gz)
#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
SnapGizmo3D *snap_gizmo = (SnapGizmo3D *)gz;
- snap_gizmo->keymap = WM_modalkeymap_find(gz->parent_gzgroup->type->keyconf,
- "Generic Gizmo Tweak Modal Map");
+ wmKeyConfig *keyconf = gz->parent_gzgroup->type->keyconf;
+ if (!keyconf) {
+ /* It can happen when gizmogrouptype is not linked at startup. */
+ keyconf = ((wmWindowManager *)G.main->wm.first)->defaultconf;
+ }
+ snap_gizmo->keymap = WM_modalkeymap_find(keyconf, "Generic Gizmo Tweak Modal Map");
RNA_enum_value_from_id(snap_gizmo->keymap->modal_items, "SNAP_ON", &snap_gizmo->snap_on);
#endif
}
diff --git a/source/blender/editors/gpencil/gpencil_bake_animation.c b/source/blender/editors/gpencil/gpencil_bake_animation.c
index 2d299230124..960f228edd0 100644
--- a/source/blender/editors/gpencil/gpencil_bake_animation.c
+++ b/source/blender/editors/gpencil/gpencil_bake_animation.c
@@ -213,7 +213,6 @@ static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op
Main *bmain = CTX_data_main(C);
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
Scene *scene = CTX_data_scene(C);
- ARegion *region = CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
ListBase ob_selected_list = {NULL, NULL};
@@ -256,7 +255,7 @@ static int gpencil_bake_grease_pencil_animation_exec(bContext *C, wmOperator *op
gsc.ob = ob_gpencil;
/* Init snap context for geometry projection. */
- sctx = ED_transform_snap_object_context_create_view3d(scene, 0, region, CTX_wm_view3d(C));
+ sctx = ED_transform_snap_object_context_create(scene, 0);
}
/* Loop all frame range. */
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 1f31c60367e..90b6db82838 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -3758,7 +3758,6 @@ static int gpencil_strokes_reproject_exec(bContext *C, wmOperator *op)
bGPdata *gpd = ED_gpencil_data_get_active(C);
Scene *scene = CTX_data_scene(C);
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
- ARegion *region = CTX_wm_region(C);
int oldframe = (int)DEG_get_ctime(depsgraph);
const eGP_ReprojectModes mode = RNA_enum_get(op->ptr, "type");
const bool keep_original = RNA_boolean_get(op->ptr, "keep_original");
@@ -3767,7 +3766,7 @@ static int gpencil_strokes_reproject_exec(bContext *C, wmOperator *op)
/* Init snap context for geometry projection. */
SnapObjectContext *sctx = NULL;
- sctx = ED_transform_snap_object_context_create_view3d(scene, 0, region, CTX_wm_view3d(C));
+ sctx = ED_transform_snap_object_context_create(scene, 0);
bool changed = false;
/* Init space conversion stuff. */
diff --git a/source/blender/editors/gpencil/gpencil_mesh.c b/source/blender/editors/gpencil/gpencil_mesh.c
index 079089786d0..11e02b9832f 100644
--- a/source/blender/editors/gpencil/gpencil_mesh.c
+++ b/source/blender/editors/gpencil/gpencil_mesh.c
@@ -188,7 +188,6 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
Scene *scene = CTX_data_scene(C);
- ARegion *region = CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
ListBase ob_selected_list = {NULL, NULL};
@@ -262,7 +261,7 @@ static int gpencil_bake_mesh_animation_exec(bContext *C, wmOperator *op)
gsc.ob = ob_gpencil;
/* Init snap context for geometry projection. */
- sctx = ED_transform_snap_object_context_create_view3d(scene, 0, region, CTX_wm_view3d(C));
+ sctx = ED_transform_snap_object_context_create(scene, 0);
/* Tag all existing strokes to avoid reprojections. */
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index bb05b93ad81..d3640c6eebd 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -1292,6 +1292,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph,
depsgraph, region, v3d, xy, &ray_start[0], &ray_normal[0], true);
if (ED_transform_snap_object_project_ray(sctx,
depsgraph,
+ v3d,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
},
diff --git a/source/blender/editors/include/ED_gizmo_library.h b/source/blender/editors/include/ED_gizmo_library.h
index 357d5e10fa7..9bef5a17d12 100644
--- a/source/blender/editors/include/ED_gizmo_library.h
+++ b/source/blender/editors/include/ED_gizmo_library.h
@@ -257,8 +257,6 @@ void ED_gizmotypes_snap_3d_draw_util(struct RegionView3D *rv3d,
const uchar color_point[4],
const short snap_elem_type);
struct SnapObjectContext *ED_gizmotypes_snap_3d_context_ensure(struct Scene *scene,
- const struct ARegion *region,
- const struct View3D *v3d,
struct wmGizmo *gz);
typedef enum {
diff --git a/source/blender/editors/include/ED_transform_snap_object_context.h b/source/blender/editors/include/ED_transform_snap_object_context.h
index 42e73bbf744..c8e8513d104 100644
--- a/source/blender/editors/include/ED_transform_snap_object_context.h
+++ b/source/blender/editors/include/ED_transform_snap_object_context.h
@@ -83,11 +83,6 @@ struct SnapObjectParams {
typedef struct SnapObjectContext SnapObjectContext;
SnapObjectContext *ED_transform_snap_object_context_create(struct Scene *scene, int flag);
-SnapObjectContext *ED_transform_snap_object_context_create_view3d(struct Scene *scene,
- int flag,
- /* extra args for view3d */
- const struct ARegion *region,
- const struct View3D *v3d);
void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx);
/* callbacks to filter how snap works */
@@ -100,6 +95,7 @@ void ED_transform_snap_object_context_set_editmesh_callbacks(
bool ED_transform_snap_object_project_ray_ex(struct SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@@ -112,6 +108,7 @@ bool ED_transform_snap_object_project_ray_ex(struct SnapObjectContext *sctx,
float r_obmat[4][4]);
bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_origin[3],
const float ray_direction[3],
@@ -121,6 +118,7 @@ bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx,
bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@@ -130,6 +128,8 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
short ED_transform_snap_object_project_view3d_ex(struct SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
+ const ARegion *region,
+ const View3D *v3d,
const unsigned short snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@@ -142,6 +142,8 @@ short ED_transform_snap_object_project_view3d_ex(struct SnapObjectContext *sctx,
float r_obmat[4][4]);
bool ED_transform_snap_object_project_view3d(struct SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
+ const ARegion *region,
+ const View3D *v3d,
const unsigned short snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@@ -153,6 +155,8 @@ bool ED_transform_snap_object_project_view3d(struct SnapObjectContext *sctx,
bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx,
struct Depsgraph *depsgraph,
+ const ARegion *region,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float mval[2],
float ray_depth,
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index c6a8e771362..97303117dd3 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -1701,8 +1701,8 @@ void EDBM_project_snap_verts(
ED_view3d_init_mats_rv3d(obedit, region->regiondata);
- struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
- CTX_data_scene(C), 0, region, CTX_wm_view3d(C));
+ struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create(
+ CTX_data_scene(C), 0);
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
@@ -1711,6 +1711,8 @@ void EDBM_project_snap_verts(
V3D_PROJ_RET_OK) {
if (ED_transform_snap_object_project_view3d(snap_context,
depsgraph,
+ region,
+ CTX_wm_view3d(C),
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_NOT_ACTIVE,
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 6f51d740e55..302862b1a8f 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -5099,14 +5099,15 @@ void ED_view3d_cursor3d_position_rotation(bContext *C,
float ray_no[3];
float ray_co[3];
- struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
- scene, 0, region, v3d);
+ struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create(scene, 0);
float obmat[4][4];
Object *ob_dummy = NULL;
float dist_px = 0;
if (ED_transform_snap_object_project_view3d_ex(snap_context,
CTX_data_ensure_evaluated_depsgraph(C),
+ region,
+ v3d,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c
index f8278edbcae..573f5348b5e 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_ruler.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_ruler.c
@@ -356,8 +356,7 @@ static bool view3d_ruler_item_mousemove(struct Depsgraph *depsgraph,
if (do_thickness && inter->co_index != 1) {
Scene *scene = DEG_get_input_scene(depsgraph);
View3D *v3d = ruler_info->area->spacedata.first;
- SnapObjectContext *snap_context = ED_gizmotypes_snap_3d_context_ensure(
- scene, ruler_info->region, v3d, snap_gizmo);
+ SnapObjectContext *snap_context = ED_gizmotypes_snap_3d_context_ensure(scene, snap_gizmo);
const float mval_fl[2] = {UNPACK2(mval)};
float ray_normal[3];
float ray_start[3];
@@ -367,6 +366,8 @@ static bool view3d_ruler_item_mousemove(struct Depsgraph *depsgraph,
if (ED_transform_snap_object_project_view3d(snap_context,
depsgraph,
+ ruler_info->region,
+ v3d,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
@@ -382,6 +383,7 @@ static bool view3d_ruler_item_mousemove(struct Depsgraph *depsgraph,
madd_v3_v3v3fl(ray_start, co, ray_normal, eps_bias);
ED_transform_snap_object_project_ray(snap_context,
depsgraph,
+ v3d,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
.edit_mode_type = SNAP_GEOM_CAGE,
diff --git a/source/blender/editors/space_view3d/view3d_navigate_walk.c b/source/blender/editors/space_view3d/view3d_navigate_walk.c
index 1ac241013ed..83b8c04acb6 100644
--- a/source/blender/editors/space_view3d/view3d_navigate_walk.c
+++ b/source/blender/editors/space_view3d/view3d_navigate_walk.c
@@ -423,6 +423,7 @@ static bool walk_floor_distance_get(RegionView3D *rv3d,
ret = ED_transform_snap_object_project_ray(
walk->snap_context,
walk->depsgraph,
+ walk->v3d,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
/* Avoid having to convert the edit-mesh to a regular mesh. */
@@ -464,6 +465,7 @@ static bool walk_ray_cast(RegionView3D *rv3d,
ret = ED_transform_snap_object_project_ray(walk->snap_context,
walk->depsgraph,
+ walk->v3d,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
},
@@ -602,8 +604,7 @@ static bool initWalkInfo(bContext *C, WalkInfo *walk, wmOperator *op)
walk->rv3d->rflag |= RV3D_NAVIGATING;
- walk->snap_context = ED_transform_snap_object_context_create_view3d(
- walk->scene, 0, walk->region, walk->v3d);
+ walk->snap_context = ED_transform_snap_object_context_create(walk->scene, 0);
walk->v3d_camera_control = ED_view3d_cameracontrol_acquire(
walk->depsgraph, walk->scene, walk->v3d, walk->rv3d);
diff --git a/source/blender/editors/space_view3d/view3d_placement.c b/source/blender/editors/space_view3d/view3d_placement.c
index aa3bf46d2e5..6cd6d85d204 100644
--- a/source/blender/editors/space_view3d/view3d_placement.c
+++ b/source/blender/editors/space_view3d/view3d_placement.c
@@ -306,6 +306,8 @@ static bool idp_snap_normal_from_gizmo(wmGizmo *gz, float r_normal[3])
*/
static bool idp_poject_surface_normal(SnapObjectContext *snap_context,
struct Depsgraph *depsgraph,
+ ARegion *region,
+ View3D *v3d,
const float mval_fl[2],
const float mat_fallback[3][3],
const float normal_fallback[3],
@@ -320,6 +322,8 @@ static bool idp_poject_surface_normal(SnapObjectContext *snap_context,
if (ED_transform_snap_object_project_view3d_ex(snap_context,
depsgraph,
+ region,
+ v3d,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
@@ -885,11 +889,9 @@ static void view3d_interactive_add_calc_plane(bContext *C,
/* Set the orientation. */
if ((plane_orient == PLACE_ORIENT_SURFACE) || (plane_depth == PLACE_DEPTH_SURFACE)) {
- snap_context = (snap_gizmo ?
- ED_gizmotypes_snap_3d_context_ensure(scene, region, v3d, snap_gizmo) :
- NULL);
+ snap_context = (snap_gizmo ? ED_gizmotypes_snap_3d_context_ensure(scene, snap_gizmo) : NULL);
if (snap_context == NULL) {
- snap_context = ED_transform_snap_object_context_create_view3d(scene, 0, region, v3d);
+ snap_context = ED_transform_snap_object_context_create(scene, 0);
snap_context_free = true;
}
}
@@ -908,6 +910,8 @@ static void view3d_interactive_add_calc_plane(bContext *C,
if ((snap_context != NULL) &&
idp_poject_surface_normal(snap_context,
CTX_data_ensure_evaluated_depsgraph(C),
+ region,
+ v3d,
mval_fl,
use_normal_fallback ? r_matrix_orient : NULL,
use_normal_fallback ? normal_fallback : NULL,
@@ -938,6 +942,8 @@ static void view3d_interactive_add_calc_plane(bContext *C,
if ((snap_context != NULL) &&
ED_transform_snap_object_project_view3d(snap_context,
CTX_data_ensure_evaluated_depsgraph(C),
+ region,
+ v3d,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 39a70f5477e..b8a35cb51e3 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -374,6 +374,8 @@ void applyProject(TransInfo *t)
if (ED_transform_snap_object_project_view3d(
t->tsnap.object_context,
t->depsgraph,
+ t->region,
+ t->view,
SCE_SNAP_MODE_FACE,
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
@@ -671,8 +673,7 @@ static void initSnappingMode(TransInfo *t)
if (t->spacetype == SPACE_VIEW3D) {
if (t->tsnap.object_context == NULL) {
t->tsnap.use_backface_culling = snap_use_backface_culling(t);
- t->tsnap.object_context = ED_transform_snap_object_context_create_view3d(
- t->scene, 0, t->region, t->view);
+ t->tsnap.object_context = ED_transform_snap_object_context_create(t->scene, 0);
if (t->data_type == TC_MESH_VERTS) {
/* Ignore elements being transformed. */
@@ -1245,6 +1246,8 @@ short snapObjectsTransform(
return ED_transform_snap_object_project_view3d_ex(
t->tsnap.object_context,
t->depsgraph,
+ t->region,
+ t->view,
t->settings->snap_mode,
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
@@ -1280,6 +1283,8 @@ bool peelObjectsTransform(TransInfo *t,
ED_transform_snap_object_project_all_view3d_ex(
t->tsnap.object_context,
t->depsgraph,
+ t->region,
+ t->view,
&(const struct SnapObjectParams){
.snap_select = t->tsnap.modeSelect,
.edit_mode_type = (t->flag & T_EDIT) != 0 ? SNAP_GEOM_EDIT : SNAP_GEOM_FINAL,
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 883a89b8467..5f9250e87f7 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -69,17 +69,6 @@ enum eViewProj {
VIEW_PROJ_PERSP = -1,
};
-typedef struct SnapData {
- float mval[2];
- float pmat[4][4]; /* perspective matrix */
- float win_size[2]; /* win x and y */
- enum eViewProj view_proj;
- float clip_plane[MAX_CLIPPLANE_LEN][4];
- short clip_plane_len;
- short snap_to_flag;
- bool has_occlusion_plane; /* Ignore plane of occlusion in curves. */
-} SnapData;
-
typedef struct SnapObjectData {
enum {
SNAP_MESH = 1,
@@ -113,14 +102,6 @@ struct SnapObjectContext {
int flag;
- /* Optional: when performing screen-space projection.
- * otherwise this doesn't take viewport into account. */
- bool use_v3d;
- struct {
- const struct View3D *v3d;
- const struct ARegion *region;
- } v3d_data;
-
/* Object -> SnapObjectData map */
struct {
GHash *object_map;
@@ -138,6 +119,21 @@ struct SnapObjectContext {
void *user_data;
} edit_mesh;
} callbacks;
+
+ struct {
+ Depsgraph *depsgraph;
+ const ARegion *region;
+ const View3D *v3d;
+
+ float mval[2];
+ float pmat[4][4]; /* perspective matrix */
+ float win_size[2]; /* win x and y */
+ enum eViewProj view_proj;
+ float clip_plane[MAX_CLIPPLANE_LEN][4];
+ short clip_plane_len;
+ short snap_to_flag;
+ bool has_occlusion_plane; /* Ignore plane of occlusion in curves. */
+ } runtime;
};
/** \} */
@@ -457,27 +453,25 @@ typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx,
* Walks through all objects in the scene to create the list of objects to snap.
*/
static void iter_snap_objects(SnapObjectContext *sctx,
- Depsgraph *depsgraph,
const struct SnapObjectParams *params,
IterSnapObjsCallback sob_callback,
void *data)
{
- ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
- const View3D *v3d = sctx->v3d_data.v3d;
+ ViewLayer *view_layer = DEG_get_input_view_layer(sctx->runtime.depsgraph);
const eSnapSelect snap_select = params->snap_select;
const eSnapEditType edit_mode_type = params->edit_mode_type;
const bool use_backface_culling = params->use_backface_culling;
Base *base_act = view_layer->basact;
if (snap_select == SNAP_ONLY_ACTIVE) {
- Object *obj_eval = DEG_get_evaluated_object(depsgraph, base_act->object);
+ Object *obj_eval = DEG_get_evaluated_object(sctx->runtime.depsgraph, base_act->object);
sob_callback(
sctx, obj_eval, obj_eval->obmat, edit_mode_type, use_backface_culling, true, data);
return;
}
for (Base *base = view_layer->object_bases.first; base != NULL; base = base->next) {
- if (!BASE_VISIBLE(v3d, base)) {
+ if (!BASE_VISIBLE(sctx->runtime.v3d, base)) {
continue;
}
@@ -500,9 +494,9 @@ static void iter_snap_objects(SnapObjectContext *sctx,
}
}
- Object *obj_eval = DEG_get_evaluated_object(depsgraph, base->object);
+ Object *obj_eval = DEG_get_evaluated_object(sctx->runtime.depsgraph, base->object);
if (obj_eval->transflag & OB_DUPLI || BKE_object_has_geometry_set_instances(obj_eval)) {
- ListBase *lb = object_duplilist(depsgraph, sctx->scene, obj_eval);
+ ListBase *lb = object_duplilist(sctx->runtime.depsgraph, sctx->scene, obj_eval);
for (DupliObject *dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) {
BLI_assert(DEG_is_evaluated_object(dupli_ob->ob));
sob_callback(sctx,
@@ -1031,12 +1025,6 @@ static void raycast_obj_fn(SnapObjectContext *sctx,
bool retval = false;
if (use_occlusion_test) {
- if ((edit_mode_type == SNAP_GEOM_EDIT) && sctx->use_v3d &&
- XRAY_FLAG_ENABLED(sctx->v3d_data.v3d)) {
- /* Use of occlude geometry in editing mode disabled. */
- return;
- }
-
if (ELEM(ob_eval->dt, OB_BOUNDBOX, OB_WIRE)) {
/* Do not hit objects that are in wire or bounding box
* display mode. */
@@ -1147,6 +1135,7 @@ static void raycast_obj_fn(SnapObjectContext *sctx,
*/
static bool raycastObjects(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_dir[3],
@@ -1162,6 +1151,14 @@ static bool raycastObjects(SnapObjectContext *sctx,
float r_obmat[4][4],
ListBase *r_hit_list)
{
+ if (v3d && (params->edit_mode_type == SNAP_GEOM_EDIT) && XRAY_FLAG_ENABLED(v3d)) {
+ /* Use of occlude geometry in editing mode disabled. */
+ return false;
+ }
+
+ sctx->runtime.depsgraph = depsgraph;
+ sctx->runtime.v3d = v3d;
+
struct RaycastObjUserData data = {
.ray_start = ray_start,
.ray_dir = ray_dir,
@@ -1177,7 +1174,7 @@ static bool raycastObjects(SnapObjectContext *sctx,
.ret = false,
};
- iter_snap_objects(sctx, depsgraph, params, raycast_obj_fn, &data);
+ iter_snap_objects(sctx, params, raycast_obj_fn, &data);
return data.ret;
}
@@ -1554,7 +1551,6 @@ static void cb_snap_tri_verts(void *userdata,
* \{ */
static short snap_mesh_polygon(SnapObjectContext *sctx,
- SnapData *snapdata,
Object *ob_eval,
const float obmat[4][4],
bool use_backface_culling,
@@ -1568,16 +1564,16 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
short elem = 0;
float lpmat[4][4];
- mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+ mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat);
struct DistProjectedAABBPrecalc neasrest_precalc;
dist_squared_to_projected_aabb_precalc(
- &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval);
+ &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval);
float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4];
transpose_m4_m4(tobmat, obmat);
- for (int i = snapdata->clip_plane_len; i--;) {
- mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]);
+ for (int i = sctx->runtime.clip_plane_len; i--;) {
+ mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]);
}
BVHTreeNearest nearest = {
@@ -1590,14 +1586,14 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
Nearest2dUserData nearest2d;
nearest2d_data_init(
- sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
+ sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
if (sod->type == SNAP_MESH) {
BVHTreeFromMesh *treedata = &sod->treedata_mesh;
const MPoly *mp = &sod->poly[*r_index];
const MLoop *ml = &treedata->loop[mp->loopstart];
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) {
elem = SCE_SNAP_MODE_EDGE;
BLI_assert(treedata->edge != NULL);
for (int i = mp->totloop; i--; ml++) {
@@ -1605,7 +1601,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
ml->e,
&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest);
}
}
@@ -1616,7 +1612,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
ml->v,
&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest);
}
}
@@ -1629,7 +1625,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
BMFace *f = BM_face_at_index(em->bm, *r_index);
BMLoop *l_iter, *l_first;
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) {
elem = SCE_SNAP_MODE_EDGE;
BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_EDGE);
BM_mesh_elem_table_ensure(em->bm, BM_VERT | BM_EDGE);
@@ -1638,7 +1634,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
BM_elem_index_get(l_iter->e),
&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest);
} while ((l_iter = l_iter->next) != l_first);
}
@@ -1651,7 +1647,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
BM_elem_index_get(l_iter->v),
&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest);
} while ((l_iter = l_iter->next) != l_first);
}
@@ -1680,7 +1676,6 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
}
static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
- SnapData *snapdata,
Object *ob_eval,
const float obmat[4][4],
float original_dist_px,
@@ -1704,7 +1699,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
Nearest2dUserData nearest2d;
nearest2d_data_init(
- sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
+ sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
int vindex[2];
nearest2d.get_edge_verts_index(*r_index, nearest2d.userdata, vindex);
@@ -1716,10 +1711,10 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
struct DistProjectedAABBPrecalc neasrest_precalc;
{
float lpmat[4][4];
- mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+ mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat);
dist_squared_to_projected_aabb_precalc(
- &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval);
+ &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval);
}
BVHTreeNearest nearest = {
@@ -1736,7 +1731,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
/* do nothing */
}
else {
- short snap_to_flag = snapdata->snap_to_flag;
+ short snap_to_flag = sctx->runtime.snap_to_flag;
int e_mode_len = ((snap_to_flag & SCE_SNAP_MODE_EDGE) != 0) +
((snap_to_flag & SCE_SNAP_MODE_VERTEX) != 0) +
((snap_to_flag & SCE_SNAP_MODE_EDGE_MIDPOINT) != 0);
@@ -1785,7 +1780,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
}
}
- if (prev_co && (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE_PERPENDICULAR)) {
+ if (prev_co && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE_PERPENDICULAR)) {
float v_near[3], va_g[3], vb_g[3];
mul_v3_m4v3(va_g, obmat, v_pair[0]);
@@ -1797,7 +1792,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
if (len_squared_v3v3(prev_co, v_near) > FLT_EPSILON) {
dist_squared_to_projected_aabb_precalc(
- &neasrest_precalc, snapdata->pmat, snapdata->win_size, snapdata->mval);
+ &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval);
if (test_projected_vert_dist(&neasrest_precalc,
NULL,
@@ -1828,7 +1823,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
return elem;
}
-static short snapArmature(SnapData *snapdata,
+static short snapArmature(SnapObjectContext *sctx,
Object *ob_eval,
const float obmat[4][4],
/* read/write args */
@@ -1840,35 +1835,39 @@ static short snapArmature(SnapData *snapdata,
{
short retval = 0;
- if (snapdata->snap_to_flag == SCE_SNAP_MODE_FACE) { /* Currently only edge and vert */
+ if (sctx->runtime.snap_to_flag == SCE_SNAP_MODE_FACE) { /* Currently only edge and vert */
return retval;
}
float lpmat[4][4], dist_px_sq = square_f(*dist_px);
- mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+ mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat);
struct DistProjectedAABBPrecalc neasrest_precalc;
dist_squared_to_projected_aabb_precalc(
- &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval);
+ &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval);
bool use_obedit = ((bArmature *)ob_eval->data)->edbo != NULL;
if (use_obedit == false) {
/* Test BoundBox */
BoundBox *bb = BKE_armature_boundbox_get(ob_eval);
- if (bb && !snap_bound_box_check_dist(
- bb->vec[0], bb->vec[6], lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) {
+ if (bb && !snap_bound_box_check_dist(bb->vec[0],
+ bb->vec[6],
+ lpmat,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
+ dist_px_sq)) {
return retval;
}
}
float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4];
transpose_m4_m4(tobmat, obmat);
- for (int i = snapdata->clip_plane_len; i--;) {
- mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]);
+ for (int i = sctx->runtime.clip_plane_len; i--;) {
+ mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]);
}
- bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP;
+ bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP;
bArmature *arm = ob_eval->data;
if (arm->edbo) {
@@ -1878,17 +1877,17 @@ static short snapArmature(SnapData *snapdata,
if ((eBone->flag & (BONE_HIDDEN_A | BONE_ROOTSEL | BONE_TIPSEL)) == 0) {
bool has_vert_snap = false;
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) {
has_vert_snap = test_projected_vert_dist(&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
is_persp,
eBone->head,
&dist_px_sq,
r_loc);
has_vert_snap |= test_projected_vert_dist(&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
is_persp,
eBone->tail,
&dist_px_sq,
@@ -1898,10 +1897,10 @@ static short snapArmature(SnapData *snapdata,
retval = SCE_SNAP_MODE_VERTEX;
}
}
- if (!has_vert_snap && snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
+ if (!has_vert_snap && sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) {
if (test_projected_edge_dist(&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
is_persp,
eBone->head,
eBone->tail,
@@ -1923,17 +1922,17 @@ static short snapArmature(SnapData *snapdata,
const float *head_vec = pchan->pose_head;
const float *tail_vec = pchan->pose_tail;
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) {
has_vert_snap = test_projected_vert_dist(&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
is_persp,
head_vec,
&dist_px_sq,
r_loc);
has_vert_snap |= test_projected_vert_dist(&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
is_persp,
tail_vec,
&dist_px_sq,
@@ -1943,10 +1942,10 @@ static short snapArmature(SnapData *snapdata,
retval = SCE_SNAP_MODE_VERTEX;
}
}
- if (!has_vert_snap && snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
+ if (!has_vert_snap && sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) {
if (test_projected_edge_dist(&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
is_persp,
head_vec,
tail_vec,
@@ -1972,7 +1971,7 @@ static short snapArmature(SnapData *snapdata,
return 0;
}
-static short snapCurve(SnapData *snapdata,
+static short snapCurve(SnapObjectContext *sctx,
Object *ob_eval,
const float obmat[4][4],
bool use_obedit,
@@ -1986,7 +1985,7 @@ static short snapCurve(SnapData *snapdata,
bool has_snap = false;
/* only vertex snapping mode (eg control points and handles) supported for now) */
- if ((snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) == 0) {
+ if ((sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) == 0) {
return 0;
}
@@ -1994,19 +1993,23 @@ static short snapCurve(SnapData *snapdata,
float dist_px_sq = square_f(*dist_px);
float lpmat[4][4];
- mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+ mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat);
struct DistProjectedAABBPrecalc neasrest_precalc;
dist_squared_to_projected_aabb_precalc(
- &neasrest_precalc, lpmat, snapdata->win_size, snapdata->mval);
+ &neasrest_precalc, lpmat, sctx->runtime.win_size, sctx->runtime.mval);
use_obedit = use_obedit && BKE_object_is_in_editmode(ob_eval);
if (use_obedit == false) {
/* Test BoundBox */
BoundBox *bb = BKE_curve_boundbox_get(ob_eval);
- if (bb && !snap_bound_box_check_dist(
- bb->vec[0], bb->vec[6], lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) {
+ if (bb && !snap_bound_box_check_dist(bb->vec[0],
+ bb->vec[6],
+ lpmat,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
+ dist_px_sq)) {
return 0;
}
}
@@ -2014,10 +2017,10 @@ static short snapCurve(SnapData *snapdata,
float tobmat[4][4];
transpose_m4_m4(tobmat, obmat);
- float(*clip_planes)[4] = snapdata->clip_plane;
- int clip_plane_len = snapdata->clip_plane_len;
+ float(*clip_planes)[4] = sctx->runtime.clip_plane;
+ int clip_plane_len = sctx->runtime.clip_plane_len;
- if (snapdata->has_occlusion_plane) {
+ if (sctx->runtime.has_occlusion_plane) {
/* We snap to vertices even if occluded. */
clip_planes++;
clip_plane_len--;
@@ -2028,11 +2031,11 @@ static short snapCurve(SnapData *snapdata,
mul_v4_m4v4(clip_planes_local[i], tobmat, clip_planes[i]);
}
- bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP;
+ bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP;
for (Nurb *nu = (use_obedit ? cu->editnurb->nurbs.first : cu->nurb.first); nu; nu = nu->next) {
for (int u = 0; u < nu->pntsu; u++) {
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) {
if (use_obedit) {
if (nu->bezt) {
/* don't snap to selected (moving) or hidden */
@@ -2123,7 +2126,7 @@ static short snapCurve(SnapData *snapdata,
}
/* may extend later (for now just snaps to empty center) */
-static short snap_object_center(SnapData *snapdata,
+static short snap_object_center(const SnapObjectContext *sctx,
Object *ob_eval,
const float obmat[4][4],
/* read/write args */
@@ -2140,24 +2143,24 @@ static short snap_object_center(SnapData *snapdata,
}
/* for now only vertex supported */
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) {
struct DistProjectedAABBPrecalc neasrest_precalc;
dist_squared_to_projected_aabb_precalc(
- &neasrest_precalc, snapdata->pmat, snapdata->win_size, snapdata->mval);
+ &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval);
float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4];
transpose_m4_m4(tobmat, obmat);
- for (int i = snapdata->clip_plane_len; i--;) {
- mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]);
+ for (int i = sctx->runtime.clip_plane_len; i--;) {
+ mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]);
}
- bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP;
+ bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP;
float dist_px_sq = square_f(*dist_px);
float co[3];
copy_v3_v3(co, obmat[3]);
if (test_projected_vert_dist(&neasrest_precalc,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
is_persp,
co,
&dist_px_sq,
@@ -2179,7 +2182,6 @@ static short snap_object_center(SnapData *snapdata,
}
static short snapCamera(const SnapObjectContext *sctx,
- SnapData *snapdata,
Object *object,
float obmat[4][4],
/* read/write args */
@@ -2193,7 +2195,7 @@ static short snapCamera(const SnapObjectContext *sctx,
Scene *scene = sctx->scene;
- bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP;
+ bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP;
float dist_px_sq = square_f(*dist_px);
float orig_camera_mat[4][4], orig_camera_imat[4][4], imat[4][4];
@@ -2201,7 +2203,7 @@ static short snapCamera(const SnapObjectContext *sctx,
MovieTracking *tracking;
if (clip == NULL) {
- return snap_object_center(snapdata, object, obmat, dist_px, r_loc, r_no, r_index);
+ return snap_object_center(sctx, object, obmat, dist_px, r_loc, r_no, r_index);
}
if (object->transflag & OB_DUPLI) {
return retval;
@@ -2214,10 +2216,10 @@ static short snapCamera(const SnapObjectContext *sctx,
invert_m4_m4(orig_camera_imat, orig_camera_mat);
invert_m4_m4(imat, obmat);
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) {
struct DistProjectedAABBPrecalc neasrest_precalc;
dist_squared_to_projected_aabb_precalc(
- &neasrest_precalc, snapdata->pmat, snapdata->win_size, snapdata->mval);
+ &neasrest_precalc, sctx->runtime.pmat, sctx->runtime.win_size, sctx->runtime.mval);
MovieTrackingObject *tracking_object;
for (tracking_object = tracking->objects.first; tracking_object;
@@ -2252,8 +2254,8 @@ static short snapCamera(const SnapObjectContext *sctx,
mul_m4_v3(vertex_obmat, bundle_pos);
if (test_projected_vert_dist(&neasrest_precalc,
- snapdata->clip_plane,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane,
+ sctx->runtime.clip_plane_len,
is_persp,
bundle_pos,
&dist_px_sq,
@@ -2277,7 +2279,6 @@ static short snapCamera(const SnapObjectContext *sctx,
}
static short snapMesh(SnapObjectContext *sctx,
- SnapData *snapdata,
Object *ob_eval,
Mesh *me_eval,
const float obmat[4][4],
@@ -2290,23 +2291,24 @@ static short snapMesh(SnapObjectContext *sctx,
float r_no[3],
int *r_index)
{
- BLI_assert(snapdata->snap_to_flag != SCE_SNAP_MODE_FACE);
+ BLI_assert(sctx->runtime.snap_to_flag != SCE_SNAP_MODE_FACE);
if (me_eval->totvert == 0) {
return 0;
}
- if (me_eval->totedge == 0 && !(snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX)) {
+ if (me_eval->totedge == 0 && !(sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX)) {
return 0;
}
float lpmat[4][4];
- mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+ mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat);
float dist_px_sq = square_f(*dist_px);
/* Test BoundBox */
BoundBox *bb = BKE_mesh_boundbox_get(ob_eval);
- if (bb && !snap_bound_box_check_dist(
- bb->vec[0], bb->vec[6], lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) {
+ if (bb &&
+ !snap_bound_box_check_dist(
+ bb->vec[0], bb->vec[6], lpmat, sctx->runtime.win_size, sctx->runtime.mval, dist_px_sq)) {
return 0;
}
@@ -2330,7 +2332,7 @@ static short snapMesh(SnapObjectContext *sctx,
treedata_tmp.looptri_allocated));
}
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) {
if (sod->has_loose_vert && sod->bvhtree[1] == NULL) {
sod->bvhtree[1] = BKE_bvhtree_from_mesh_get(
&treedata_tmp, me_eval, BVHTREE_FROM_LOOSEVERTS, 2);
@@ -2353,7 +2355,7 @@ static short snapMesh(SnapObjectContext *sctx,
Nearest2dUserData nearest2d;
nearest2d_data_init(
- sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
+ sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
BVHTreeNearest nearest = {
.index = -1,
@@ -2364,18 +2366,18 @@ static short snapMesh(SnapObjectContext *sctx,
float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4];
transpose_m4_m4(tobmat, obmat);
- for (int i = snapdata->clip_plane_len; i--;) {
- mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]);
+ for (int i = sctx->runtime.clip_plane_len; i--;) {
+ mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]);
}
- if (sod->bvhtree[1] && (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX)) {
+ if (sod->bvhtree[1] && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX)) {
/* snap to loose verts */
BLI_bvhtree_find_nearest_projected(sod->bvhtree[1],
lpmat,
- snapdata->win_size,
- snapdata->mval,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest,
cb_snap_vert,
&nearest2d);
@@ -2383,15 +2385,15 @@ static short snapMesh(SnapObjectContext *sctx,
last_index = nearest.index;
}
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) {
if (sod->bvhtree[0]) {
/* snap to loose edges */
BLI_bvhtree_find_nearest_projected(sod->bvhtree[0],
lpmat,
- snapdata->win_size,
- snapdata->mval,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest,
cb_snap_edge,
&nearest2d);
@@ -2401,10 +2403,10 @@ static short snapMesh(SnapObjectContext *sctx,
/* snap to looptris */
BLI_bvhtree_find_nearest_projected(treedata->tree,
lpmat,
- snapdata->win_size,
- snapdata->mval,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest,
cb_snap_tri_edges,
&nearest2d);
@@ -2415,15 +2417,15 @@ static short snapMesh(SnapObjectContext *sctx,
}
}
else {
- BLI_assert(snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX);
+ BLI_assert(sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX);
if (sod->bvhtree[0]) {
/* snap to loose edge verts */
BLI_bvhtree_find_nearest_projected(sod->bvhtree[0],
lpmat,
- snapdata->win_size,
- snapdata->mval,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest,
cb_snap_edge_verts,
&nearest2d);
@@ -2433,10 +2435,10 @@ static short snapMesh(SnapObjectContext *sctx,
/* snap to looptri verts */
BLI_bvhtree_find_nearest_projected(treedata->tree,
lpmat,
- snapdata->win_size,
- snapdata->mval,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest,
cb_snap_tri_verts,
&nearest2d);
@@ -2468,7 +2470,6 @@ static short snapMesh(SnapObjectContext *sctx,
}
static short snapEditMesh(SnapObjectContext *sctx,
- SnapData *snapdata,
Object *ob_eval,
BMEditMesh *em,
const float obmat[4][4],
@@ -2480,9 +2481,9 @@ static short snapEditMesh(SnapObjectContext *sctx,
float r_no[3],
int *r_index)
{
- BLI_assert(snapdata->snap_to_flag != SCE_SNAP_MODE_FACE);
+ BLI_assert(sctx->runtime.snap_to_flag != SCE_SNAP_MODE_FACE);
- if ((snapdata->snap_to_flag & ~SCE_SNAP_MODE_FACE) == SCE_SNAP_MODE_VERTEX) {
+ if ((sctx->runtime.snap_to_flag & ~SCE_SNAP_MODE_FACE) == SCE_SNAP_MODE_VERTEX) {
if (em->bm->totvert == 0) {
return 0;
}
@@ -2494,7 +2495,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
}
float lpmat[4][4];
- mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+ mul_m4_m4m4(lpmat, sctx->runtime.pmat, obmat);
float dist_px_sq = square_f(*dist_px);
@@ -2504,11 +2505,11 @@ static short snapEditMesh(SnapObjectContext *sctx,
/* was BKE_boundbox_ray_hit_check, see: cf6ca226fa58 */
if (!snap_bound_box_check_dist(
- sod->min, sod->max, lpmat, snapdata->win_size, snapdata->mval, dist_px_sq)) {
+ sod->min, sod->max, lpmat, sctx->runtime.win_size, sctx->runtime.mval, dist_px_sq)) {
return 0;
}
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX) {
BVHTreeFromEditMesh treedata = {.tree = sod->bvhtree[0]};
if (treedata.tree == NULL) {
@@ -2540,7 +2541,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
}
}
- if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
+ if (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE) {
BVHTreeFromEditMesh treedata = {.tree = sod->bvhtree[1]};
if (treedata.tree == NULL) {
@@ -2574,7 +2575,7 @@ static short snapEditMesh(SnapObjectContext *sctx,
Nearest2dUserData nearest2d;
nearest2d_data_init(
- sod, snapdata->view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
+ sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, use_backface_culling, &nearest2d);
BVHTreeNearest nearest = {
.index = -1,
@@ -2585,35 +2586,35 @@ static short snapEditMesh(SnapObjectContext *sctx,
float tobmat[4][4], clip_planes_local[MAX_CLIPPLANE_LEN][4];
transpose_m4_m4(tobmat, obmat);
- for (int i = snapdata->clip_plane_len; i--;) {
- mul_v4_m4v4(clip_planes_local[i], tobmat, snapdata->clip_plane[i]);
+ for (int i = sctx->runtime.clip_plane_len; i--;) {
+ mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]);
}
- if (sod->bvhtree[0] && (snapdata->snap_to_flag & SCE_SNAP_MODE_VERTEX)) {
+ if (sod->bvhtree[0] && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_VERTEX)) {
BM_mesh_elem_table_ensure(em->bm, BM_VERT);
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
BLI_bvhtree_find_nearest_projected(sod->bvhtree[0],
lpmat,
- snapdata->win_size,
- snapdata->mval,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest,
cb_snap_vert,
&nearest2d);
}
- if (sod->bvhtree[1] && (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE)) {
+ if (sod->bvhtree[1] && (sctx->runtime.snap_to_flag & SCE_SNAP_MODE_EDGE)) {
int last_index = nearest.index;
nearest.index = -1;
BM_mesh_elem_table_ensure(em->bm, BM_EDGE | BM_VERT);
BM_mesh_elem_index_ensure(em->bm, BM_EDGE | BM_VERT);
BLI_bvhtree_find_nearest_projected(sod->bvhtree[1],
lpmat,
- snapdata->win_size,
- snapdata->mval,
+ sctx->runtime.win_size,
+ sctx->runtime.mval,
clip_planes_local,
- snapdata->clip_plane_len,
+ sctx->runtime.clip_plane_len,
&nearest,
cb_snap_edge,
&nearest2d);
@@ -2650,7 +2651,6 @@ static short snapEditMesh(SnapObjectContext *sctx,
}
struct SnapObjUserData {
- SnapData *snapdata;
/* read/write args */
float *dist_px;
/* return args */
@@ -2686,7 +2686,6 @@ static void snap_obj_fn(SnapObjectContext *sctx,
/* Operators only update the editmesh looptris of the original mesh. */
BMEditMesh *em_orig = BKE_editmesh_from_object(DEG_get_original_object(ob_eval));
retval = snapEditMesh(sctx,
- dt->snapdata,
ob_eval,
em_orig,
obmat,
@@ -2703,7 +2702,6 @@ static void snap_obj_fn(SnapObjectContext *sctx,
}
retval = snapMesh(sctx,
- dt->snapdata,
ob_eval,
me_eval,
obmat,
@@ -2716,11 +2714,10 @@ static void snap_obj_fn(SnapObjectContext *sctx,
break;
}
case OB_ARMATURE:
- retval = snapArmature(
- dt->snapdata, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index);
+ retval = snapArmature(sctx, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index);
break;
case OB_CURVE:
- retval = snapCurve(dt->snapdata,
+ retval = snapCurve(sctx,
ob_eval,
obmat,
edit_mode_type == SNAP_GEOM_EDIT,
@@ -2734,7 +2731,6 @@ static void snap_obj_fn(SnapObjectContext *sctx,
Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval);
if (mesh_eval) {
retval |= snapMesh(sctx,
- dt->snapdata,
ob_eval,
mesh_eval,
obmat,
@@ -2751,11 +2747,10 @@ static void snap_obj_fn(SnapObjectContext *sctx,
case OB_GPENCIL:
case OB_LAMP:
retval = snap_object_center(
- dt->snapdata, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index);
+ sctx, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index);
break;
case OB_CAMERA:
- retval = snapCamera(
- sctx, dt->snapdata, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index);
+ retval = snapCamera(sctx, ob_eval, obmat, dt->dist_px, dt->r_loc, dt->r_no, dt->r_index);
break;
}
@@ -2796,8 +2791,6 @@ static void snap_obj_fn(SnapObjectContext *sctx,
* \param r_obmat: Object matrix (may not be #Object.obmat with dupli-instances).
*/
static short snapObjectsRay(SnapObjectContext *sctx,
- Depsgraph *depsgraph,
- SnapData *snapdata,
const struct SnapObjectParams *params,
/* read/write args */
/* Parameters below cannot be const, because they are assigned to a
@@ -2811,7 +2804,6 @@ static short snapObjectsRay(SnapObjectContext *sctx,
float r_obmat[4][4])
{
struct SnapObjUserData data = {
- .snapdata = snapdata,
.dist_px = dist_px,
.r_loc = r_loc,
.r_no = r_no,
@@ -2821,7 +2813,7 @@ static short snapObjectsRay(SnapObjectContext *sctx,
.ret = 0,
};
- iter_snap_objects(sctx, depsgraph, params, snap_obj_fn, &data);
+ iter_snap_objects(sctx, params, snap_obj_fn, &data);
return data.ret;
}
@@ -2848,21 +2840,6 @@ SnapObjectContext *ED_transform_snap_object_context_create(Scene *scene, int fla
return sctx;
}
-SnapObjectContext *ED_transform_snap_object_context_create_view3d(Scene *scene,
- int flag,
- /* extra args for view3d */
- const ARegion *region,
- const View3D *v3d)
-{
- SnapObjectContext *sctx = ED_transform_snap_object_context_create(scene, flag);
-
- sctx->use_v3d = true;
- sctx->v3d_data.region = region;
- sctx->v3d_data.v3d = v3d;
-
- return sctx;
-}
-
static void snap_object_data_free(void *sod_v)
{
SnapObjectData *sod = sod_v;
@@ -2896,6 +2873,7 @@ void ED_transform_snap_object_context_set_editmesh_callbacks(
bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@@ -2908,6 +2886,7 @@ bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx,
{
return raycastObjects(sctx,
depsgraph,
+ v3d,
params,
ray_start,
ray_normal,
@@ -2929,6 +2908,7 @@ bool ED_transform_snap_object_project_ray_ex(SnapObjectContext *sctx,
*/
bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@@ -2946,6 +2926,7 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
bool retval = raycastObjects(sctx,
depsgraph,
+ v3d,
params,
ray_start,
ray_normal,
@@ -2978,6 +2959,7 @@ bool ED_transform_snap_object_project_ray_all(SnapObjectContext *sctx,
*/
static bool transform_snap_context_project_ray_impl(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_start[3],
const float ray_normal[3],
@@ -2988,14 +2970,25 @@ static bool transform_snap_context_project_ray_impl(SnapObjectContext *sctx,
bool ret;
/* try snap edge, then face if it fails */
- ret = ED_transform_snap_object_project_ray_ex(
- sctx, depsgraph, params, ray_start, ray_normal, ray_depth, r_co, r_no, NULL, NULL, NULL);
+ ret = ED_transform_snap_object_project_ray_ex(sctx,
+ depsgraph,
+ v3d,
+ params,
+ ray_start,
+ ray_normal,
+ ray_depth,
+ r_co,
+ r_no,
+ NULL,
+ NULL,
+ NULL);
return ret;
}
bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float ray_origin[3],
const float ray_direction[3],
@@ -3010,12 +3003,14 @@ bool ED_transform_snap_object_project_ray(SnapObjectContext *sctx,
}
return transform_snap_context_project_ray_impl(
- sctx, depsgraph, params, ray_origin, ray_direction, ray_depth, r_co, r_no);
+ sctx, depsgraph, v3d, params, ray_origin, ray_direction, ray_depth, r_co, r_no);
}
static short transform_snap_context_project_view3d_mixed_impl(
SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const ARegion *region,
+ const View3D *v3d,
const ushort snap_to_flag,
const struct SnapObjectParams *params,
const float mval[2],
@@ -3042,21 +3037,18 @@ static short transform_snap_context_project_view3d_mixed_impl(
float obmat[4][4];
int index = -1;
- const ARegion *region = sctx->v3d_data.region;
const RegionView3D *rv3d = region->regiondata;
- bool use_occlusion_test = params->use_occlusion_test && !XRAY_ENABLED(sctx->v3d_data.v3d);
+ bool use_occlusion_test = params->use_occlusion_test && !XRAY_ENABLED(v3d);
+
+ sctx->runtime.depsgraph = depsgraph;
+ sctx->runtime.region = region;
+ sctx->runtime.v3d = v3d;
if (snap_to_flag & SCE_SNAP_MODE_FACE || use_occlusion_test) {
float ray_start[3], ray_normal[3];
- if (!ED_view3d_win_to_ray_clipped_ex(depsgraph,
- sctx->v3d_data.region,
- sctx->v3d_data.v3d,
- mval,
- NULL,
- ray_normal,
- ray_start,
- true)) {
+ if (!ED_view3d_win_to_ray_clipped_ex(
+ depsgraph, region, v3d, mval, NULL, ray_normal, ray_start, true)) {
return 0;
}
@@ -3064,6 +3056,7 @@ static short transform_snap_context_project_view3d_mixed_impl(
has_hit = raycastObjects(sctx,
depsgraph,
+ v3d,
params,
ray_start,
ray_normal,
@@ -3099,24 +3092,28 @@ static short transform_snap_context_project_view3d_mixed_impl(
short elem_test, elem = 0;
float dist_px_tmp = *dist_px;
- SnapData snapdata;
- copy_m4_m4(snapdata.pmat, rv3d->persmat);
- snapdata.win_size[0] = region->winx;
- snapdata.win_size[1] = region->winy;
- copy_v2_v2(snapdata.mval, mval);
- snapdata.view_proj = rv3d->is_persp ? VIEW_PROJ_PERSP : VIEW_PROJ_ORTHO;
+ copy_m4_m4(sctx->runtime.pmat, rv3d->persmat);
+ sctx->runtime.win_size[0] = region->winx;
+ sctx->runtime.win_size[1] = region->winy;
+ copy_v2_v2(sctx->runtime.mval, mval);
+ sctx->runtime.view_proj = rv3d->is_persp ? VIEW_PROJ_PERSP : VIEW_PROJ_ORTHO;
/* First snap to edge instead of middle or perpendicular. */
- snapdata.snap_to_flag = snap_to_flag & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE);
+ sctx->runtime.snap_to_flag = snap_to_flag & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE);
if (snap_to_flag & (SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR)) {
- snapdata.snap_to_flag |= SCE_SNAP_MODE_EDGE;
+ sctx->runtime.snap_to_flag |= SCE_SNAP_MODE_EDGE;
}
- planes_from_projmat(
- snapdata.pmat, NULL, NULL, NULL, NULL, snapdata.clip_plane[0], snapdata.clip_plane[1]);
+ planes_from_projmat(sctx->runtime.pmat,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ sctx->runtime.clip_plane[0],
+ sctx->runtime.clip_plane[1]);
- snapdata.clip_plane_len = 2;
- snapdata.has_occlusion_plane = false;
+ sctx->runtime.clip_plane_len = 2;
+ sctx->runtime.has_occlusion_plane = false;
/* By convention we only snap to the original elements of a curve. */
if (has_hit && ob_eval->type != OB_CURVE) {
@@ -3124,7 +3121,7 @@ static short transform_snap_context_project_view3d_mixed_impl(
float new_clipplane[4];
BLI_ASSERT_UNIT_V3(no);
plane_from_point_normal_v3(new_clipplane, loc, no);
- if (dot_v3v3(snapdata.clip_plane[0], new_clipplane) > 0.0f) {
+ if (dot_v3v3(sctx->runtime.clip_plane[0], new_clipplane) > 0.0f) {
/* The plane is facing the wrong direction. */
negate_v4(new_clipplane);
}
@@ -3133,30 +3130,22 @@ static short transform_snap_context_project_view3d_mixed_impl(
new_clipplane[3] += 0.01f;
/* Try to snap only to the polygon. */
- elem_test = snap_mesh_polygon(sctx,
- &snapdata,
- ob_eval,
- obmat,
- params->use_backface_culling,
- &dist_px_tmp,
- loc,
- no,
- &index);
+ elem_test = snap_mesh_polygon(
+ sctx, ob_eval, obmat, params->use_backface_culling, &dist_px_tmp, loc, no, &index);
if (elem_test) {
elem = elem_test;
}
/* Add the new clip plane to the beginning of the list. */
- for (int i = snapdata.clip_plane_len; i != 0; i--) {
- copy_v4_v4(snapdata.clip_plane[i], snapdata.clip_plane[i - 1]);
+ for (int i = sctx->runtime.clip_plane_len; i != 0; i--) {
+ copy_v4_v4(sctx->runtime.clip_plane[i], sctx->runtime.clip_plane[i - 1]);
}
- copy_v4_v4(snapdata.clip_plane[0], new_clipplane);
- snapdata.clip_plane_len++;
- snapdata.has_occlusion_plane = true;
+ copy_v4_v4(sctx->runtime.clip_plane[0], new_clipplane);
+ sctx->runtime.clip_plane_len++;
+ sctx->runtime.has_occlusion_plane = true;
}
- elem_test = snapObjectsRay(
- sctx, depsgraph, &snapdata, params, &dist_px_tmp, loc, no, &index, &ob_eval, obmat);
+ elem_test = snapObjectsRay(sctx, params, &dist_px_tmp, loc, no, &index, &ob_eval, obmat);
if (elem_test) {
elem = elem_test;
}
@@ -3164,9 +3153,8 @@ static short transform_snap_context_project_view3d_mixed_impl(
if ((elem == SCE_SNAP_MODE_EDGE) &&
(snap_to_flag & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE_MIDPOINT |
SCE_SNAP_MODE_EDGE_PERPENDICULAR))) {
- snapdata.snap_to_flag = snap_to_flag;
+ sctx->runtime.snap_to_flag = snap_to_flag;
elem = snap_mesh_edge_verts_mixed(sctx,
- &snapdata,
ob_eval,
obmat,
*dist_px,
@@ -3204,6 +3192,8 @@ static short transform_snap_context_project_view3d_mixed_impl(
short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const ARegion *region,
+ const View3D *v3d,
const ushort snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@@ -3217,6 +3207,8 @@ short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx,
{
return transform_snap_context_project_view3d_mixed_impl(sctx,
depsgraph,
+ region,
+ v3d,
snap_to,
params,
mval,
@@ -3244,6 +3236,8 @@ short ED_transform_snap_object_project_view3d_ex(SnapObjectContext *sctx,
*/
bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const ARegion *region,
+ const View3D *v3d,
const ushort snap_to,
const struct SnapObjectParams *params,
const float mval[2],
@@ -3254,6 +3248,8 @@ bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx,
{
return ED_transform_snap_object_project_view3d_ex(sctx,
depsgraph,
+ region,
+ v3d,
snap_to,
params,
mval,
@@ -3271,6 +3267,8 @@ bool ED_transform_snap_object_project_view3d(SnapObjectContext *sctx,
*/
bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx,
Depsgraph *depsgraph,
+ const ARegion *region,
+ const View3D *v3d,
const struct SnapObjectParams *params,
const float mval[2],
float ray_depth,
@@ -3279,19 +3277,13 @@ bool ED_transform_snap_object_project_all_view3d_ex(SnapObjectContext *sctx,
{
float ray_start[3], ray_normal[3];
- if (!ED_view3d_win_to_ray_clipped_ex(depsgraph,
- sctx->v3d_data.region,
- sctx->v3d_data.v3d,
- mval,
- NULL,
- ray_normal,
- ray_start,
- true)) {
+ if (!ED_view3d_win_to_ray_clipped_ex(
+ depsgraph, region, v3d, mval, NULL, ray_normal, ray_start, true)) {
return false;
}
return ED_transform_snap_object_project_ray_all(
- sctx, depsgraph, params, ray_start, ray_normal, ray_depth, sort, r_hit_list);
+ sctx, depsgraph, v3d, params, ray_start, ray_normal, ray_depth, sort, r_hit_list);
}
/** \} */
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 3e292ea89e2..543d69842be 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -154,6 +154,7 @@ static void rna_Scene_ray_cast(Scene *scene,
bool ret = ED_transform_snap_object_project_ray_ex(sctx,
depsgraph,
+ NULL,
&(const struct SnapObjectParams){
.snap_select = SNAP_ALL,
},