[Bf-blender-cvs] [2d6bfb5b63c] blender2.8: Transform: Improve the hierarchy in the choice of snapped elements in the mixed snap.

Germano noreply at git.blender.org
Fri May 18 16:41:21 CEST 2018


Commit: 2d6bfb5b63cdb92422e6b6d8e2ff58f844b7ed94
Author: Germano
Date:   Fri May 18 11:40:32 2018 -0300
Branches: blender2.8
https://developer.blender.org/rB2d6bfb5b63cdb92422e6b6d8e2ff58f844b7ed94

Transform: Improve the hierarchy in the choice of snapped elements in the mixed snap.

To snap to small edges in 3d_view is no longer obfuscated by vertices if then is also enabled.

===================================================================

M	source/blender/editors/transform/transform_snap_object.c

===================================================================

diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index c24f3bf01f8..26288b162f7 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -80,7 +80,7 @@ enum eViewProj {
 };
 
 typedef struct SnapData {
-	short snap_to;
+	short snap_to_flag;
 	float mval[2];
 	float pmat[4][4]; /* perspective matrix */
 	float win_size[2];/* win x and y */
@@ -933,128 +933,6 @@ static bool test_projected_edge_dist(
 	        is_persp, near_co, dist_px_sq, r_co);
 }
 
-static bool snapMeshPolygon(
-        SnapObjectContext *sctx, SnapData *snapdata,
-        Object *ob, float obmat[4][4],
-        /* read/write args */
-        float *dist_px,
-        /* return args */
-        float r_loc[3], float r_no[3], int *r_index)
-{
-	bool retval = false;
-
-	float lpmat[4][4], dist_px_sq = SQUARE(*dist_px);
-	mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
-
-	struct DistProjectedAABBPrecalc neasrest_precalc;
-	dist_squared_to_projected_aabb_precalc(
-	        &neasrest_precalc, lpmat, snapdata->win_size, snapdata->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]);
-	}
-
-	bool is_persp = snapdata->view_proj == VIEW_PROJ_PERSP;
-
-	SnapObjectData *sod = BLI_ghash_lookup(sctx->cache.object_map, ob);
-	BLI_assert(sod != NULL);
-
-	if (sod->type == SNAP_MESH) {
-		Mesh *me = ob->data;
-		MPoly *mp = &me->mpoly[*r_index];
-
-		const MLoop *ml = &me->mloop[mp->loopstart];
-		for (int i = mp->totloop; i--; ml++) {
-			if (snapdata->snap_to == SCE_SNAP_MODE_VERTEX) {
-				const MVert *vert = &me->mvert[ml->v];
-				if (test_projected_vert_dist(
-				        &neasrest_precalc,
-				        clip_planes_local, snapdata->clip_plane_len,
-				        is_persp, vert->co,
-				        &dist_px_sq, r_loc))
-				{
-					normal_short_to_float_v3(r_no, vert->no);
-					*r_index = ml->v;
-					retval = true;
-				}
-			}
-			else {
-				float co_pair[2][3];
-				const MEdge *edge = &me->medge[ml->e];
-				copy_v3_v3(co_pair[0], me->mvert[edge->v1].co);
-				copy_v3_v3(co_pair[1], me->mvert[edge->v2].co);
-				if (test_projected_edge_dist(
-				        &neasrest_precalc,
-				        clip_planes_local, snapdata->clip_plane_len,
-				        is_persp, co_pair[0], co_pair[1],
-				        &dist_px_sq, r_loc))
-				{
-					sub_v3_v3v3(r_no, co_pair[0], co_pair[1]);
-					*r_index = ml->e;
-					retval = true;
-				}
-			}
-		}
-	}
-	else {
-		BLI_assert(sod->type == SNAP_EDIT_MESH);
-
-		BMEditMesh *em = BKE_editmesh_from_object(ob);
-		BM_mesh_elem_table_ensure(em->bm, BM_FACE);
-		BMFace *f = BM_face_at_index(em->bm, *r_index);
-
-		BMLoop *l_iter, *l_first;
-		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-
-		do {
-			if (snapdata->snap_to == SCE_SNAP_MODE_VERTEX) {
-				const float *co = l_iter->v->co;
-				if (test_projected_vert_dist(
-				        &neasrest_precalc,
-				        clip_planes_local, snapdata->clip_plane_len,
-				        is_persp, co,
-				        &dist_px_sq, r_loc))
-				{
-					copy_v3_v3(r_no, l_iter->v->no);
-					*r_index = BM_elem_index_get(l_iter->v);
-					retval = true;
-				}
-			}
-			else {
-				float co_pair[2][3];
-				copy_v3_v3(co_pair[0], l_iter->e->v1->co);
-				copy_v3_v3(co_pair[1], l_iter->e->v2->co);
-				if (test_projected_edge_dist(
-				        &neasrest_precalc,
-				        clip_planes_local, snapdata->clip_plane_len,
-				        is_persp, co_pair[0], co_pair[1],
-				        &dist_px_sq, r_loc))
-				{
-					sub_v3_v3v3(r_no, co_pair[0], co_pair[1]);
-					*r_index = BM_elem_index_get(l_iter->e);
-					retval = true;
-				}
-			}
-		} while ((l_iter = l_iter->next) != l_first);
-	}
-
-	if (retval) {
-		float imat[4][4];
-		invert_m4_m4(imat, obmat);
-
-		mul_m4_v3(obmat, r_loc);
-		mul_transposed_mat3_m4_v3(obmat, r_no);
-		normalize_v3(r_no);
-
-		*dist_px = sqrtf(dist_px_sq);
-
-		return true;
-	}
-	return false;
-}
-
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -1069,7 +947,6 @@ typedef void (*Nearest2DCopyVertNoCallback)(const int index, float r_no[3], void
 
 typedef struct Nearest2dUserData {
 	bool is_persp;
-	short snap_to;
 
 	void *userdata;
 	Nearest2DGetVertCoCallback get_vert_co;
@@ -1081,7 +958,7 @@ typedef struct Nearest2dUserData {
 } Nearest2dUserData;
 
 
-static void cb_walk_leaf_snap_vert(
+static void cb_snap_vert(
         void *userdata, int index,
         const struct DistProjectedAABBPrecalc *precalc,
         const float (*clip_plane)[4], const int clip_plane_len,
@@ -1105,7 +982,7 @@ static void cb_walk_leaf_snap_vert(
 	}
 }
 
-static void cb_walk_leaf_snap_edge(
+static void cb_snap_edge(
         void *userdata, int index,
         const struct DistProjectedAABBPrecalc *precalc,
         const float (*clip_plane)[4], const int clip_plane_len,
@@ -1116,37 +993,68 @@ static void cb_walk_leaf_snap_edge(
 	int vindex[2];
 	data->get_edge_verts_index(index, vindex, data->userdata);
 
-	if (data->snap_to == SCE_SNAP_MODE_EDGE) {
-		const float *v_pair[2];
-		data->get_vert_co(vindex[0], &v_pair[0], data->userdata);
-		data->get_vert_co(vindex[1], &v_pair[1], data->userdata);
-
-		if (test_projected_edge_dist(
-		        precalc,
-		        clip_plane,
-		        clip_plane_len,
-		        data->is_persp,
-		        v_pair[0], v_pair[1],
-		        &nearest->dist_sq,
-		        nearest->co))
-		{
-			sub_v3_v3v3(nearest->no, v_pair[0], v_pair[1]);
-			nearest->index = index;
+	const float *v_pair[2];
+	data->get_vert_co(vindex[0], &v_pair[0], data->userdata);
+	data->get_vert_co(vindex[1], &v_pair[1], data->userdata);
+
+	if (test_projected_edge_dist(
+	        precalc,
+	        clip_plane,
+	        clip_plane_len,
+	        data->is_persp,
+	        v_pair[0], v_pair[1],
+	        &nearest->dist_sq,
+	        nearest->co))
+	{
+		sub_v3_v3v3(nearest->no, v_pair[0], v_pair[1]);
+		nearest->index = index;
+	}
+}
+
+static void cb_snap_edge_verts(
+        void *userdata, int index,
+        const struct DistProjectedAABBPrecalc *precalc,
+        const float (*clip_plane)[4], const int clip_plane_len,
+        BVHTreeNearest *nearest)
+{
+	struct Nearest2dUserData *data = userdata;
+
+	int vindex[2];
+	data->get_edge_verts_index(index, vindex, data->userdata);
+
+	for (int i = 2; i--;) {
+		if (vindex[i] == nearest->index) {
+			continue;
 		}
+		cb_snap_vert(
+		        userdata, vindex[i], precalc,
+		        clip_plane, clip_plane_len, nearest);
 	}
-	else {
-		for (int i = 0; i < 2; i++) {
-			if (vindex[i] == nearest->index) {
+}
+
+static void cb_snap_tri_edges(
+        void *userdata, int index,
+        const struct DistProjectedAABBPrecalc *precalc,
+        const float (*clip_plane)[4], const int clip_plane_len,
+        BVHTreeNearest *nearest)
+{
+	struct Nearest2dUserData *data = userdata;
+
+	int eindex[3];
+	data->get_tri_edges_index(index, eindex, data->userdata);
+	for (int i = 3; i--;) {
+		if (eindex[i] != -1) {
+			if (eindex[i] == nearest->index) {
 				continue;
 			}
-			cb_walk_leaf_snap_vert(
-			        userdata, vindex[i], precalc,
+			cb_snap_edge(
+			        userdata, eindex[i], precalc,
 			        clip_plane, clip_plane_len, nearest);
 		}
 	}
 }
 
-static void cb_walk_leaf_snap_tri(
+static void cb_snap_tri_verts(
         void *userdata, int index,
         const struct DistProjectedAABBPrecalc *precalc,
         const float (*clip_plane)[4], const int clip_plane_len,
@@ -1154,31 +1062,15 @@ static void cb_walk_leaf_snap_tri(
 {
 	struct Nearest2dUserData *data = userdata;
 
-	if (data->snap_to == SCE_SNAP_MODE_EDGE) {
-		int eindex[3];
-		data->get_tri_edges_index(index, eindex, data->userdata);
-		for (int i = 0; i < 3; i++) {
-			if (eindex[i] != -1) {
-				if (eindex[i] == nearest->index) {
-					continue;
-				}
-				cb_walk_leaf_snap_edge(
-				        userdata, eindex[i], precalc,
-				        clip_plane, clip_plane_len, nearest);
-			}
-		}
-	}
-	else {
-		int vindex[3];
-		data->get_tri_verts_index(index, vindex, data->userdata);
-		for (int i = 0; i < 3; i++) {
-			if (vindex[i] == nearest->index) {
-				continue;
-			}
-			cb_walk_leaf_snap_vert(
-			        userdata, vindex[i], precalc,
-			        clip_plane, clip_plane_len, nearest);
+	int vindex[3];
+	data->get_tri_verts_index(index, vindex, data->userdata);
+	for (int i = 3; i--;) {
+		if (vindex[i] == nearest->index) {
+			continue;
 		}
+		cb_snap_vert(
+		        userdata, vindex[i], precalc,
+		        clip_plane, clip_plane_len, nearest);
 	}
 }
 
@@ -1188,7 +1080,236 @@ static void cb_walk_leaf_snap_tri(
 /** \name Internal Object Snapping API
  * \{ */
 
-static bool snapArmature(
+static short snap_mesh_polygon(
+        SnapObjectContext *sctx, SnapData *snapdata,
+        Object *ob, float obmat[4][4],
+        /* read/write args */
+        float *dist_px,
+        /* return args */
+        float r_loc[3], float r_no[3], int *r_index)
+{
+	short elem = 0;
+
+	float lpmat[4][4];
+	mul_m4_m4m4(lpmat, snapdata->pmat, obmat);
+
+	struct DistProjectedAABBPrecalc neasrest_precalc;
+	dist_squared_to_projected_aabb_precalc(
+	        &neasrest_precalc, lpmat, snapdata->win_size, snapdata->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]);
+	}
+
+	Nearest2dUserData nearest2d = {
+		.is_persp = snapdata->view_proj == VIEW_PROJ_PERSP,
+	};
+
+	BVHTreeNearest nearest = {
+		.index = -1,
+		.dist_sq = SQUARE(*dist_px),
+	};
+
+	SnapObjectData *sod = BLI_ghash_lookup(sctx->cache.object_map, ob);
+	BLI_assert(sod != NULL);
+
+	if (sod->type == SNAP_MESH) {
+		BVHTreeFromMesh *treedata = &((SnapObjectData_Mesh *)sod)->treedata;
+
+		nearest2d.userdata             = treedata;
+		nearest2d.get_vert_co          = (Nearest2DGetVertCoCallback)cb_mvert_co_get;
+		nearest2d.get_edge_verts_index = (Nearest2DGetEdgeVertsCallback)cb_medge_verts_get;
+		nearest2d.copy_vert_no         = (Neares

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list