[Bf-blender-cvs] [1d0077649da] blender2.8: Merge branch 'master' into blender2.8

Campbell Barton noreply at git.blender.org
Mon Mar 12 04:18:03 CET 2018


Commit: 1d0077649daaa16df5b5dc555d609222e53f7e45
Author: Campbell Barton
Date:   Mon Mar 12 14:25:20 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB1d0077649daaa16df5b5dc555d609222e53f7e45

Merge branch 'master' into blender2.8

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



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

diff --cc source/blender/editors/sculpt_paint/sculpt_uv.c
index 700b0969277,7b636530d61..6928610f280
--- a/source/blender/editors/sculpt_paint/sculpt_uv.c
+++ b/source/blender/editors/sculpt_paint/sculpt_uv.c
@@@ -650,9 -650,9 +650,9 @@@ static UvSculptData *uv_sculpt_stroke_i
  		/* we need to find the active island here */
  		if (do_island_optimization) {
  			UvElement *element;
- 			NearestHit hit;
+ 			UvNearestHit hit = UV_NEAREST_HIT_INIT;
  			Image *ima = CTX_data_edit_image(C);
- 			uv_find_nearest_vert(scene, ima, obedit, em, co, NULL, &hit);
 -			uv_find_nearest_vert(scene, ima, em, co, 0.0f, &hit);
++			uv_find_nearest_vert(scene, ima, obedit, co, 0.0f, &hit);
  
  			element = BM_uv_element_get(data->elementMap, hit.efa, hit.l);
  			island_index = element->island;
diff --cc source/blender/editors/uvedit/uvedit_intern.h
index eb92f17544f,b5ff46e9219..c5f16d6fb14
--- a/source/blender/editors/uvedit/uvedit_intern.h
+++ b/source/blender/editors/uvedit/uvedit_intern.h
@@@ -50,19 -51,31 +50,30 @@@ void  uv_poly_center(struct BMFace *f, 
  
  /* find nearest */
  
- typedef struct NearestHit {
+ typedef struct UvNearestHit {
+ 	/** Always set if we have a hit. */
  	struct BMFace *efa;
 -	struct MTexPoly *tf;
  	struct BMLoop *l;
  	struct MLoopUV *luv, *luv_next;
- 	int lindex;  /* index of loop within face */
- } NearestHit;
- 
- void uv_find_nearest_vert(
-         struct Scene *scene, struct Image *ima, struct Object *obedit, struct BMEditMesh *em,
-         const float co[2], const float penalty[2], struct NearestHit *hit);
- void uv_find_nearest_edge(
-         struct Scene *scene, struct Image *ima, struct Object *obedit, struct BMEditMesh *em,
-         const float co[2], struct NearestHit *hit);
+ 	/** Index of loop within face. */
+ 	int lindex;
+ 	/** Needs to be set before calling nearest functions. */
+ 	float dist_sq;
+ } UvNearestHit;
+ 
+ #define UV_NEAREST_HIT_INIT { .dist_sq = FLT_MAX, }
+ 
+ bool uv_find_nearest_vert(
 -        struct Scene *scene, struct Image *ima, struct BMEditMesh *em,
++        struct Scene *scene, struct Image *ima, struct Object *obedit,
+         const float co[2], const float penalty_dist, struct UvNearestHit *hit_final);
+ 
+ bool uv_find_nearest_edge(
 -        struct Scene *scene, struct Image *ima, struct BMEditMesh *em,
++        struct Scene *scene, struct Image *ima, struct Object *obedit,
+         const float co[2], struct UvNearestHit *hit_final);
+ 
+ bool uv_find_nearest_face(
 -        struct Scene *scene, struct Image *ima, struct BMEditMesh *em,
++        struct Scene *scene, struct Image *ima, struct Object *obedit,
+         const float co[2], struct UvNearestHit *hit_final);
  
  /* utility tool functions */
  
diff --cc source/blender/editors/uvedit/uvedit_ops.c
index 61e0004915d,1ee10268be5..1c54ea0ebc1
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@@ -707,35 -760,38 +707,35 @@@ bool ED_uvedit_center(Scene *scene, Ima
  
  /************************** find nearest ****************************/
  
- void uv_find_nearest_edge(Scene *scene, Image *ima, Object *obedit, BMEditMesh *em, const float co[2], NearestHit *hit)
+ bool uv_find_nearest_edge(
 -        Scene *scene, Image *ima, BMEditMesh *em, const float co[2],
++        Scene *scene, Image *ima, Object *obedit, const float co[2],
+         UvNearestHit *hit)
  {
 -	MTexPoly *tf;
++	BMEditMesh *em = BKE_editmesh_from_object(obedit);
  	BMFace *efa;
  	BMLoop *l;
  	BMIter iter, liter;
  	MLoopUV *luv, *luv_next;
- 	float mindist_squared, dist_squared;
  	int i;
+ 	bool found = false;
  
  	const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
 -	const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
  
- 	mindist_squared = 1e10f;
- 	memset(hit, 0, sizeof(*hit));
- 
  	BM_mesh_elem_index_ensure(em->bm, BM_VERT);
- 	
+ 
  	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- 		if (!uvedit_face_visible_test(scene, obedit, ima, efa))
 -		tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
 -		if (!uvedit_face_visible_test(scene, ima, efa, tf)) {
++		if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
  			continue;
- 		
+ 		}
  		BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
  			luv      = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
  			luv_next = BM_ELEM_CD_GET_VOID_P(l->next, cd_loop_uv_offset);
  
- 			dist_squared = dist_squared_to_line_segment_v2(co, luv->uv, luv_next->uv);
+ 			const float dist_test_sq = dist_squared_to_line_segment_v2(co, luv->uv, luv_next->uv);
  
- 			if (dist_squared < mindist_squared) {
+ 			if (dist_test_sq < hit->dist_sq) {
 -				hit->tf = tf;
  				hit->efa = efa;
- 				
+ 
  				hit->l = l;
  				hit->luv = luv;
  				hit->luv_next = luv_next;
@@@ -745,38 -802,51 +746,50 @@@
  			}
  		}
  	}
+ 	return found;
  }
  
- static void uv_find_nearest_face(
-         Scene *scene, Image *ima, Object *obedit, BMEditMesh *em, const float co[2], NearestHit *hit)
+ bool uv_find_nearest_face(
 -        Scene *scene, Image *ima, BMEditMesh *em, const float co[2],
++        Scene *scene, Image *ima, Object *obedit, const float co[2],
+         UvNearestHit *hit_final)
  {
- 	BMFace *efa;
- 	BMIter iter;
- 	float mindist, dist, cent[2];
++	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ 	bool found = false;
  
  	const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
 -	const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
  
- 	mindist = 1e10f;
- 	memset(hit, 0, sizeof(*hit));
+ 	/* this will fill in hit.vert1 and hit.vert2 */
+ 	float dist_sq_init = hit_final->dist_sq;
+ 	UvNearestHit hit = *hit_final;
 -	if (uv_find_nearest_edge(scene, ima, em, co, &hit)) {
++	if (uv_find_nearest_edge(scene, ima, obedit, co, &hit)) {
+ 		hit.dist_sq = dist_sq_init;
+ 		hit.l = NULL;
+ 		hit.luv = hit.luv_next = NULL;
  
- 	/*this will fill in hit.vert1 and hit.vert2*/
- 	uv_find_nearest_edge(scene, ima, obedit, em, co, hit);
- 	hit->l = NULL;
- 	hit->luv = hit->luv_next = NULL;
+ 		BMIter iter;
+ 		BMFace *efa;
  
- 	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- 		if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- 			continue;
+ 		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
 -			MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
 -			if (!uvedit_face_visible_test(scene, ima, efa, tf)) {
++			if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ 				continue;
+ 			}
  
- 		uv_poly_center(efa, cent, cd_loop_uv_offset);
+ 			float cent[2];
+ 			uv_poly_center(efa, cent, cd_loop_uv_offset);
  
- 		dist = len_manhattan_v2v2(co, cent);
+ 			const float dist_test_sq = len_squared_v2v2(co, cent);
  
- 		if (dist < mindist) {
- 			hit->efa = efa;
- 			mindist = dist;
+ 			if (dist_test_sq < hit.dist_sq) {
+ 				hit.efa = efa;
+ 				hit.dist_sq = dist_test_sq;
+ 				found = true;
+ 			}
  		}
  	}
+ 	if (found) {
+ 		*hit_final = hit;
+ 	}
+ 	return found;
  }
  
  static bool uv_nearest_between(const BMLoop *l, const float co[2],
@@@ -790,54 -860,65 +803,64 @@@
  	        (line_point_side_v2(uv_next, uv_curr, co) <= 0.0f));
  }
  
- void uv_find_nearest_vert(
-         Scene *scene, Image *ima, Object *obedit, BMEditMesh *em,
-         float const co[2], const float penalty[2], NearestHit *hit)
+ bool uv_find_nearest_vert(
 -        Scene *scene, Image *ima, BMEditMesh *em,
++        Scene *scene, Image *ima, Object *obedit,
+         float const co[2], const float penalty_dist, UvNearestHit *hit_final)
  {
- 	BMFace *efa;
- 	BMLoop *l;
- 	BMIter iter, liter;
- 	MLoopUV *luv;
- 	float mindist, dist;
- 	int i;
+ 	bool found = false;
  
- 	const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ 	/* this will fill in hit.vert1 and hit.vert2 */
+ 	float dist_sq_init = hit_final->dist_sq;
+ 	UvNearestHit hit = *hit_final;
 -	if (uv_find_nearest_edge(scene, ima, em, co, &hit)) {
++	if (uv_find_nearest_edge(scene, ima, obedit, co, &hit)) {
+ 		hit.dist_sq = dist_sq_init;
  
- 	/*this will fill in hit.vert1 and hit.vert2*/
- 	uv_find_nearest_edge(scene, ima, obedit, em, co, hit);
- 	hit->l = NULL;
- 	hit->luv = hit->luv_next = NULL;
+ 		hit.l = NULL;
+ 		hit.luv = hit.luv_next = NULL;
  
- 	mindist = 1e10f;
- 	memset(hit, 0, sizeof(*hit));
- 	
- 	BM_mesh_elem_index_ensure(em->bm, BM_VERT);
++		BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ 		BMFace *efa;
+ 		BMIter iter;
  
- 	BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- 		if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- 			continue;
+ 		BM_mesh_elem_index_ensure(em->bm, BM_VERT);
  
- 		BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
- 			luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
- 			if (penalty && uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
- 				dist = len_manhattan_v2v2(co, luv->uv) + len_manhattan_v2(penalty);
- 			else
- 				dist = len_manhattan_v2v2(co, luv->uv);
+ 		const int cd_loop_uv_offset  = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
 -		const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
  
- 			if (dist <= mindist) {
- 				if (dist == mindist) {
- 					if (!uv_nearest_between(l, co, cd_loop_uv_offset)) {
- 						continue;
- 					}
+ 		BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
 -			MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
 -			if (!uvedit_face_visible_test(scene, ima, efa, tf)) {
++			if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ 				continue;
+ 			}
+ 
+ 			BMIter liter;
+ 			BMLoop *l;
+ 			int i;
+ 			BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
+ 				float dist_test_sq;
+ 				MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ 				if (penalty_dist != 0.0f && uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
+ 					dist_test_sq = len_v2v2(co, luv->uv) + penalty_dist;
+ 					dist_test_sq = SQUARE(dist_test_sq);
+ 				}
+ 				else {
+ 					dist_test_sq = len_squared_v2v2(co, luv->uv);
  				}
  
- 				mindist = dist;
+ 				if (dist_test_sq <= hit.dist_sq) {
+ 					if (dist_test_sq == hit.dist_sq) {
+ 						if (!uv_nearest_between(l, co, cd_lo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list