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:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-10-12 23:05:56 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-10-13 23:43:29 +0300
commit91c33c8b99520b6b094265a826cd391929a81716 (patch)
treead5f250137549de94c0ea4c93a5a5643ceaf3692 /source/blender/editors/transform
parent988b9bc40ce846cdce05961315dc0e2c1dd95e4b (diff)
Cleanup: Snap Context Refactor
Move runtime parameters out of context creation. Not being able to choose another region and v3d limits the use of the snap API.
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r--source/blender/editors/transform/transform_snap.c9
-rw-r--r--source/blender/editors/transform/transform_snap_object.c440
2 files changed, 223 insertions, 226 deletions
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);
}
/** \} */