[Bf-blender-cvs] [58a365746f] snap_system_clip_planes: Cleanup

Germano Cavalcante noreply at git.blender.org
Sun Feb 26 14:00:40 CET 2017


Commit: 58a365746fe22d030b43fcbeb0a6e8a838de237d
Author: Germano Cavalcante
Date:   Fri Feb 24 18:14:38 2017 -0300
Branches: snap_system_clip_planes
https://developer.blender.org/rB58a365746fe22d030b43fcbeb0a6e8a838de237d

Cleanup

Change name and organize position of functions

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

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 84ea0f8344..6637d869df 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -309,6 +309,31 @@ MINLINE bool snp_is_in_front_all_planes(
 	return true;
 }
 
+/**
+ * Check if a AABB is:
+ * - BEHIND_A_PLANE     (0),
+ * - ISECT_CLIP_PLANE   (1),
+ * - IN_FRONT_ALL_PLANES(2)
+*/
+static short snp_isect_aabb_planes_v3(
+        float(*planes)[4], int totplane, const float bbmin[3], const float bbmax[3])
+{
+	short ret = IN_FRONT_ALL_PLANES;
+
+	float bb_near[3], bb_afar[3];
+	for (int i = 0; i < totplane; i++) {
+		aabb_get_near_far_from_plane(planes[i], bbmin, bbmax, bb_near, bb_afar);
+		if (plane_point_side_v3(planes[i], bb_afar) < 0.0f) {
+			return BEHIND_A_PLANE;
+		}
+		else if ((ret != ISECT_CLIP_PLANE) && (plane_point_side_v3(planes[i], bb_near) < 0.0f)) {
+			ret = ISECT_CLIP_PLANE;
+		}
+	}
+
+	return ret;
+}
+
 static void *snp_clipplanes_calc_local(
         const float(*clip)[4], const short clip_num, float obmat[4][4])
 {
@@ -571,19 +596,20 @@ static bool snap_segment_v3v3(
 	bool ret = false;
 
 	if (snap_to & SCE_SELECT_EDGE) {
+		/* TODO (Germano): Compensate object scale */
 		dist_squared_ray_to_seg_v3(localdata->ray_orig, localdata->ray_dir, va, vb, tmp_co, &lambda, &depth);
 
-		if ((snap_to & SCE_SELECT_VERTEX) && (lambda < 0.25f || 0.75f < lambda)) {
-			/* Use rv3d clip segments: `rv3d->clip` */
-			ret = snap_point_v3(
+		if ((snap_to & SCE_SELECT_VERTEX) && (lambda < 0.25f || 0.75f < lambda) &&
+			snap_point_v3(
 			        depth_range, mval, lambda < 0.5f ? va : vb, localdata->pmat, win_half, is_persp,
-			        flag, localdata->clip.plane, localdata->clip.plane_num, dist_px_sq, r_co);
+			        flag, localdata->clip.plane, localdata->clip.plane_num, dist_px_sq, r_co))
+		{
+			ret = true;
 		}
-
-		if (!ret) {
+		else {
 			ret = snap_point_v3(
-		        depth_range, mval, tmp_co, localdata->pmat, win_half, is_persp,
-		        flag, localdata->clip.plane, localdata->clip.plane_num, dist_px_sq, r_co);
+			        depth_range, mval, tmp_co, localdata->pmat, win_half, is_persp,
+			        flag, localdata->clip.plane, localdata->clip.plane_num, dist_px_sq, r_co);
 		}
 	}
 	else {
@@ -598,31 +624,6 @@ static bool snap_segment_v3v3(
 	return ret;
 }
 
-/**
- * Check if a AABB is:
- * - BEHIND_A_PLANE     (0),
- * - ISECT_CLIP_PLANE   (1),
- * - IN_FRONT_ALL_PLANES(2)
- */
-static short snp_isect_aabb_planes_v3(
-	float(*planes)[4], int totplane, const float bbmin[3], const float bbmax[3])
-{
-	short ret = IN_FRONT_ALL_PLANES;
-
-	float bb_near[3], bb_afar[3];
-	for (int i = 0; i < totplane; i++) {
-		aabb_get_near_far_from_plane(planes[i], bbmin, bbmax, bb_near, bb_afar);
-		if (plane_point_side_v3(planes[i], bb_afar) < 0.0f) {
-			return BEHIND_A_PLANE;
-		}
-		else if ((ret != ISECT_CLIP_PLANE) && (plane_point_side_v3(planes[i], bb_near) < 0.0f)) {
-			ret = ISECT_CLIP_PLANE;
-		}
-	}
-
-	return ret;
-}
-
 typedef struct SnapNearest2dPrecalc {
 	SnapNearestLocalData *local;
 
@@ -827,7 +828,7 @@ static float snp_dist_squared_to_projected_aabb(
 	return rdist;
 }
 
-static bool snp_snap_boundbox_nearest_test(
+static bool snap_boundbox_nearest_test(
         SnapData *snpdt, SnapNearestLocalData *localdata, BoundBox *bb, float dist_px)
 {
 	struct SnapNearest2dPrecalc data;
@@ -878,17 +879,20 @@ static float dist_aabb_to_plane(
 /** \Utilities for DerivedMeshes and EditMeshes
 * \{ */
 
-static void object_dm_final_get(Scene *scn, Object *ob, DerivedMesh **dm)
+static DerivedMesh *object_dm_final_get(Scene *scn, Object *ob)
 {
-	/* in this case we want the mesh from the editmesh, avoids stale data. see: T45978.
-	 * still set the 'em' to NULL, since we only want the 'dm'. */
+	DerivedMesh *dm;
+
+	/* in this case we want the mesh from the editmesh, avoids stale data. see: T45978 */
 	BMEditMesh *em = BKE_editmesh_from_object(ob);
 	if (em) {
-		editbmesh_get_derived_cage_and_final(scn, ob, em, CD_MASK_BAREMESH, dm);
+		editbmesh_get_derived_cage_and_final(scn, ob, em, CD_MASK_BAREMESH, &dm);
 	}
 	else {
-		*dm = mesh_get_derived_final(scn, ob, CD_MASK_BAREMESH);
+		dm = mesh_get_derived_final(scn, ob, CD_MASK_BAREMESH);
 	}
+
+	return dm;
 }
 
 static void dm_get_vert_co_cb(const int index, const float **co, const BVHTreeFromMesh *data)
@@ -1614,9 +1618,9 @@ static bool snapDerivedMesh(
 		}
 	}
 	else {
-		/* In vertex and edges you need to get the pixel distance from mval to BoundBox, see T46816. */
+		/* In vertex and edges you need to get the pixel distance from mval to BoundBox, see T46816 */
 		snp_nearest_local_data_get(&localdata.nearest, snpdt, obmat);
-		if (bb && !snp_snap_boundbox_nearest_test(snpdt, &localdata.nearest, bb, *dist_px)) {
+		if (bb && !snap_boundbox_nearest_test(snpdt, &localdata.nearest, bb, *dist_px)) {
 			snp_free_nearestdata(&localdata.nearest);
 			return retval;
 		}
@@ -1634,8 +1638,7 @@ static bool snapDerivedMesh(
 		sod->has_loose_vert = sod->has_loose_edge = sod->has_looptris = true;
 	}
 
-	DerivedMesh *dm;
-	object_dm_final_get(sctx->scene, ob, &dm);
+	DerivedMesh *dm = object_dm_final_get(sctx->scene, ob);
 
 	if (dm->getNumVerts(dm) == 0) {
 		return retval;
@@ -1993,7 +1996,7 @@ static bool snapEditMesh(
 		else {
 			BVHTreeRayHit hit = {.index = -1, .dist = raycastlocaldata.depth};
 
-			if (BLI_bvhtree_ray_cast(
+			if (treedata->tree && BLI_bvhtree_ray_cast(
 			        treedata->tree, raycastlocaldata.ray_start, raycastlocaldata.ray_dir, 0.0f,
 			        &hit, treedata->raycast_callback, treedata) != -1)
 			{
@@ -2451,8 +2454,7 @@ bool ED_transform_snap_object_project_ray_ex(
 			sod = *sod_p;
 			if (sod->type == SNAP_MESH) {
 
-				DerivedMesh *dm;
-				object_dm_final_get(sctx->scene, *r_ob, &dm);
+				DerivedMesh *dm = object_dm_final_get(sctx->scene, *r_ob);
 
 				const int *index_mp_to_orig = dm->getPolyDataArray(dm, CD_ORIGINDEX);
 				*r_index = index_mp_to_orig ? index_mp_to_orig[*r_index] : *r_index;
@@ -2630,8 +2632,7 @@ static bool transform_snap_context_project_view3d_mixed_impl(
 					const MLoop *mloop = ((SnapObjectData_Mesh *)sod)->treedata.loop;
 					const MVert *mvert = ((SnapObjectData_Mesh *)sod)->treedata.vert;
 
-					DerivedMesh *dm;
-					object_dm_final_get(sctx->scene, obj, &dm);
+					DerivedMesh *dm = object_dm_final_get(sctx->scene, obj);
 
 					bool poly_allocated;
 					MPoly *mpoly = DM_get_poly_array(dm, &poly_allocated);
@@ -2694,7 +2695,6 @@ static bool transform_snap_context_project_view3d_mixed_impl(
 				snpdt->clip.plane[snpdt->clip.plane_num - 1][3] += 0.000005;
 
 #endif
-//				print_v4("new_clip_plane", snpdt->clip.plane[0]);
 			}
 		}




More information about the Bf-blender-cvs mailing list