[Bf-blender-cvs] [6e5b573dc82] blender2.8: Merge branch 'master' into blender2.8

Bastien Montagne noreply at git.blender.org
Tue Dec 18 20:33:16 CET 2018


Commit: 6e5b573dc8288826f05fd3a0b0b6de2a9753ba8b
Author: Bastien Montagne
Date:   Tue Dec 18 20:33:04 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB6e5b573dc8288826f05fd3a0b0b6de2a9753ba8b

Merge branch 'master' into blender2.8

Conflicts:
	source/blender/editors/transform/transform_conversions.c

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



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

diff --cc source/blender/editors/transform/transform_conversions.c
index 1702fd8fcd3,e4e4af28451..0184e754305
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@@ -2635,254 -2477,251 +2640,261 @@@ static void VertsToTransData(TransInfo 
  
  static void createTransEditVerts(TransInfo *t)
  {
 -	TransData *tob = NULL;
 -	TransDataExtension *tx = NULL;
 -	BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
 -	Mesh *me = t->obedit->data;
 -	BMesh *bm = em->bm;
 -	BMVert *eve;
 -	BMIter iter;
 -	float (*mappedcos)[3] = NULL, (*quats)[4] = NULL;
 -	float mtx[3][3], smtx[3][3], (*defmats)[3][3] = NULL, (*defcos)[3] = NULL;
 -	float *dists = NULL;
 -	int a;
 -	const int prop_mode = (t->flag & T_PROP_EDIT) ? (t->flag & T_PROP_EDIT_ALL) : 0;
 -	int mirror = 0;
 -	int cd_vert_bweight_offset = -1;
 -	bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
 -
 -	struct TransIslandData *island_info = NULL;
 -	int island_info_tot;
 -	int *island_vert_map = NULL;
 -
 -	/* Snap rotation along normal needs a common axis for whole islands, otherwise one get random crazy results,
 -	 * see T59104. However, we do not want to use the island center for the pivot/translation reference... */
 -	const bool is_snap_rotate = ((t->mode == TFM_TRANSLATION) &&
 -	                             /* There is not guarantee that snapping is initialized yet at this point... */
 -	                             (usingSnappingNormal(t) || (t->settings->snap_flag & SCE_SNAP_ROTATE) != 0) &&
 -	                             (t->around != V3D_AROUND_LOCAL_ORIGINS));
 -	/* Even for translation this is needed because of island-orientation, see: T51651. */
 -	const bool is_island_center = (t->around == V3D_AROUND_LOCAL_ORIGINS) || is_snap_rotate;
 -	/* Original index of our connected vertex when connected distances are calculated.
 -	 * Optional, allocate if needed. */
 -	int *dists_index = NULL;
 -
 -	if (t->flag & T_MIRROR) {
 -		EDBM_verts_mirror_cache_begin(em, 0, false, (t->flag & T_PROP_EDIT) == 0, use_topology);
 -		mirror = 1;
 -	}
 -
 -	/**
 -	 * Quick check if we can transform.
 -	 *
 -	 * \note ignore modes here, even in edge/face modes, transform data is created by selected vertices.
 -	 * \note in prop mode we need at least 1 selected.
 -	 */
 -	if (bm->totvertsel == 0) {
 -		goto cleanup;
 -	}
 -
 -	if (t->mode == TFM_BWEIGHT) {
 -		BM_mesh_cd_flag_ensure(bm, BKE_mesh_from_object(t->obedit), ME_CDFLAG_VERT_BWEIGHT);
 -		cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
 -	}
 +	FOREACH_TRANS_DATA_CONTAINER (t, tc) {
- 
 +		TransData *tob = NULL;
 +		TransDataExtension *tx = NULL;
 +		BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
 +		Mesh *me = tc->obedit->data;
 +		BMesh *bm = em->bm;
 +		BMVert *eve;
 +		BMIter iter;
 +		float (*mappedcos)[3] = NULL, (*quats)[4] = NULL;
 +		float mtx[3][3], smtx[3][3], (*defmats)[3][3] = NULL, (*defcos)[3] = NULL;
 +		float *dists = NULL;
 +		int a;
 +		const int prop_mode = (t->flag & T_PROP_EDIT) ? (t->flag & T_PROP_EDIT_ALL) : 0;
 +		int mirror = 0;
 +		int cd_vert_bweight_offset = -1;
 +		bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
 +
 +		struct TransIslandData *island_info = NULL;
 +		int island_info_tot;
 +		int *island_vert_map = NULL;
 +
++		/* Snap rotation along normal needs a common axis for whole islands, otherwise one get random crazy results,
++		 * see T59104. However, we do not want to use the island center for the pivot/translation reference... */
++		const bool is_snap_rotate = ((t->mode == TFM_TRANSLATION) &&
++		                             /* There is not guarantee that snapping is initialized yet at this point... */
++		                             (usingSnappingNormal(t) || (t->settings->snap_flag & SCE_SNAP_ROTATE) != 0) &&
++		                             (t->around != V3D_AROUND_LOCAL_ORIGINS));
 +		/* Even for translation this is needed because of island-orientation, see: T51651. */
- 		const bool is_island_center = (t->around == V3D_AROUND_LOCAL_ORIGINS);
++		const bool is_island_center = (t->around == V3D_AROUND_LOCAL_ORIGINS) || is_snap_rotate;
 +		/* Original index of our connected vertex when connected distances are calculated.
 +		 * Optional, allocate if needed. */
 +		int *dists_index = NULL;
  
 -	if (prop_mode) {
 -		unsigned int count = 0;
 -		BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
 -			if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
 -				count++;
 +		if (t->flag & T_MIRROR) {
 +			/* TODO(campbell): xform: We need support for many mirror objects at once! */
 +			if (tc->is_active) {
 +				EDBM_verts_mirror_cache_begin(em, 0, false, (t->flag & T_PROP_EDIT) == 0, use_topology);
 +				mirror = 1;
  			}
  		}
  
 -		t->total = count;
 +		/**
 +		 * Quick check if we can transform.
 +		 *
 +		 * \note ignore modes here, even in edge/face modes, transform data is created by selected vertices.
 +		 * \note in prop mode we need at least 1 selected.
 +		 */
 +		if (bm->totvertsel == 0) {
 +			goto cleanup;
 +		}
  
 -		/* allocating scratch arrays */
 -		if (prop_mode & T_PROP_CONNECTED) {
 -			dists = MEM_mallocN(em->bm->totvert * sizeof(float), __func__);
 -			if (is_island_center) {
 -				dists_index =  MEM_mallocN(em->bm->totvert * sizeof(int), __func__);
 -			}
 +		if (t->mode == TFM_BWEIGHT) {
 +			BM_mesh_cd_flag_ensure(bm, BKE_mesh_from_object(tc->obedit), ME_CDFLAG_VERT_BWEIGHT);
 +			cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
  		}
 -	}
 -	else {
 -		t->total = bm->totvertsel;
 -	}
  
 -	tob = t->data = MEM_callocN(t->total * sizeof(TransData), "TransObData(Mesh EditMode)");
 -	if (ELEM(t->mode, TFM_SKIN_RESIZE, TFM_SHRINKFATTEN)) {
 -		/* warning, this is overkill, we only need 2 extra floats,
 -		 * but this stores loads of extra stuff, for TFM_SHRINKFATTEN its even more overkill
 -		 * since we may not use the 'alt' transform mode to maintain shell thickness,
 -		 * but with generic transform code its hard to lazy init vars */
 -		tx = t->ext = MEM_callocN(t->total * sizeof(TransDataExtension),
 -		                          "TransObData ext");
 -	}
 +		if (prop_mode) {
 +			unsigned int count = 0;
 +			BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
 +				if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
 +					count++;
 +				}
 +			}
  
 -	copy_m3_m4(mtx, t->obedit->obmat);
 -	/* we use a pseudoinverse so that when one of the axes is scaled to 0,
 -	 * matrix inversion still works and we can still moving along the other */
 -	pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON);
 +			tc->data_len = count;
  
 -	if (prop_mode & T_PROP_CONNECTED) {
 -		editmesh_set_connectivity_distance(em->bm, mtx, dists, dists_index);
 -	}
 +			/* allocating scratch arrays */
 +			if (prop_mode & T_PROP_CONNECTED) {
 +				dists = MEM_mallocN(em->bm->totvert * sizeof(float), __func__);
 +				if (is_island_center) {
 +					dists_index =  MEM_mallocN(em->bm->totvert * sizeof(int), __func__);
 +				}
 +			}
 +		}
 +		else {
 +			tc->data_len = bm->totvertsel;
 +		}
  
 -	if (is_island_center) {
 -		/* In this specific case, near-by vertices will need to know the island of the nearest connected vertex. */
 -		const bool calc_single_islands = (
 -		        (prop_mode & T_PROP_CONNECTED) &&
 -		        (t->around == V3D_AROUND_LOCAL_ORIGINS) &&
 -		        (em->selectmode & SCE_SELECT_VERTEX));
 +		tob = tc->data = MEM_callocN(tc->data_len * sizeof(TransData), "TransObData(Mesh EditMode)");
 +		if (ELEM(t->mode, TFM_SKIN_RESIZE, TFM_SHRINKFATTEN)) {
 +			/* warning, this is overkill, we only need 2 extra floats,
 +			 * but this stores loads of extra stuff, for TFM_SHRINKFATTEN its even more overkill
 +			 * since we may not use the 'alt' transform mode to maintain shell thickness,
 +			 * but with generic transform code its hard to lazy init vars */
 +			tx = tc->data_ext = MEM_callocN(tc->data_len * sizeof(TransDataExtension), "TransObData ext");
 +		}
  
 -		island_info = editmesh_islands_info_calc(em, &island_info_tot, &island_vert_map, calc_single_islands);
 -	}
 +		copy_m3_m4(mtx, tc->obedit->obmat);
 +		/* we use a pseudoinverse so that when one of the axes is scaled to 0,
 +		 * matrix inversion still works and we can still moving along the other */
 +		pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON);
  
 -	/* detect CrazySpace [tm] */
 -	if (modifiers_getCageIndex(t->scene, t->obedit, NULL, 1) != -1) {
 -		int totleft = -1;
 -		if (modifiers_isCorrectableDeformed(t->scene, t->obedit)) {
 -			/* check if we can use deform matrices for modifier from the
 -			 * start up to stack, they are more accurate than quats */
 -			totleft = BKE_crazyspace_get_first_deform_matrices_editbmesh(t->scene, t->obedit, em, &defmats, &defcos);
 +		if (prop_mode & T_PROP_CONNECTED) {
 +			editmesh_set_connectivity_distance(em->bm, mtx, dists, dists_index);
  		}
  
 -		/* if we still have more modifiers, also do crazyspace
 -		 * correction with quats, relative to the coordinates after
 -		 * the modifiers that support deform matrices (defcos) */
 +		if (is_island_center) {
 +			/* In this specific case, near-by vertices will need to know the island of the nearest connected vertex. */
 +			const bool calc_single_islands = (
 +			        (prop_mode & T_PROP_CONNECTED) &&
 +			        (t->around == V3D_AROUND_LOCAL_ORIGINS) &&
 +			        (em->selectmode & SCE_SELECT_VERTEX));
 +
 +			island_info = editmesh_islands_info_calc(em, &island_info_tot, &island_vert_map, calc_single_islands);
 +		}
 +
 +		/* detect CrazySpace [tm] */
 +		if (modifiers_getCageIndex(t->scene, tc->obedit, NULL, 1) != -1) {
 +			int totleft = -1;
 +			if (modifiers_isCorrectableDeformed(t->scene, tc->obedit)) {
 +				/* Use evaluated state because we need b-bone cache. */
 +				Scene *scene_eval = (Scene *)DEG_get_evaluated_id(t->depsgraph, &t->scene->id);
 +				Object *obedit_eval = (Object *)DEG_get_evaluated_id(t->depsgraph, &tc->obedit->id);
 +				BMEditMesh *em_eval = BKE_editmesh_from_object(obedit_eval);
 +				/* check if we can use deform matrices for modifier from the
 +				 * start up to stack, they are more accurate than quats */
 +				totleft = BKE_crazyspace_get_first_deform

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list