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

Campbell Barton noreply at git.blender.org
Tue Sep 26 14:33:05 CEST 2017


Commit: d6800c1a81501cf37f5f5fae45beb5566a48b44d
Author: Campbell Barton
Date:   Tue Sep 26 22:45:42 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBd6800c1a81501cf37f5f5fae45beb5566a48b44d

Merge branch 'master' into blender2.8

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



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

diff --cc source/blender/editors/transform/transform_manipulator.c
index 500820956ca,9a362ee609f..72c3bbfcf79
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@@ -107,321 -107,16 +107,321 @@@
  #define TW_AXIS_DOT_MIN 0.02f
  #define TW_AXIS_DOT_MAX 0.1f
  
 +/* axes as index */
 +enum {
 +	MAN_AXIS_TRANS_X = 0,
 +	MAN_AXIS_TRANS_Y,
 +	MAN_AXIS_TRANS_Z,
 +	MAN_AXIS_TRANS_C,
 +
 +	MAN_AXIS_TRANS_XY,
 +	MAN_AXIS_TRANS_YZ,
 +	MAN_AXIS_TRANS_ZX,
 +#define MAN_AXIS_RANGE_TRANS_START MAN_AXIS_TRANS_X
 +#define MAN_AXIS_RANGE_TRANS_END (MAN_AXIS_TRANS_ZX + 1)
 +
 +	MAN_AXIS_ROT_X,
 +	MAN_AXIS_ROT_Y,
 +	MAN_AXIS_ROT_Z,
 +	MAN_AXIS_ROT_C,
 +	MAN_AXIS_ROT_T, /* trackball rotation */
 +#define MAN_AXIS_RANGE_ROT_START MAN_AXIS_ROT_X
 +#define MAN_AXIS_RANGE_ROT_END (MAN_AXIS_ROT_T + 1)
 +
 +	MAN_AXIS_SCALE_X,
 +	MAN_AXIS_SCALE_Y,
 +	MAN_AXIS_SCALE_Z,
 +	MAN_AXIS_SCALE_C,
 +	MAN_AXIS_SCALE_XY,
 +	MAN_AXIS_SCALE_YZ,
 +	MAN_AXIS_SCALE_ZX,
 +#define MAN_AXIS_RANGE_SCALE_START MAN_AXIS_SCALE_X
 +#define MAN_AXIS_RANGE_SCALE_END (MAN_AXIS_SCALE_ZX + 1)
 +
 +	MAN_AXIS_LAST = MAN_AXIS_RANGE_SCALE_END,
 +};
 +
 +/* axis types */
 +enum {
 +	MAN_AXES_ALL = 0,
 +	MAN_AXES_TRANSLATE,
 +	MAN_AXES_ROTATE,
 +	MAN_AXES_SCALE,
 +};
 +
 +typedef struct ManipulatorGroup {
 +	bool all_hidden;
 +
 +	struct wmManipulator *manipulators[MAN_AXIS_LAST];
 +} ManipulatorGroup;
 +
+ struct TransformBounds {
+ 	float center[3];		/* Center for transform widget. */
+ 	float min[3], max[3];	/* Boundbox of selection for transform widget. */
+ };
  
 +/* **************** Utilities **************** */
 +
 +/* loop over axes */
 +#define MAN_ITER_AXES_BEGIN(axis, axis_idx) \
 +	{ \
 +		wmManipulator *axis; \
 +		int axis_idx; \
 +		for (axis_idx = 0; axis_idx < MAN_AXIS_LAST; axis_idx++) { \
 +			axis = manipulator_get_axis_from_index(man, axis_idx);
 +
 +#define MAN_ITER_AXES_END \
 +		} \
 +	} ((void)0)
 +
 +static wmManipulator *manipulator_get_axis_from_index(const ManipulatorGroup *man, const short axis_idx)
 +{
 +	BLI_assert(IN_RANGE_INCL(axis_idx, (float)MAN_AXIS_TRANS_X, (float)MAN_AXIS_LAST));
 +	return man->manipulators[axis_idx];
 +}
 +
 +static short manipulator_get_axis_type(const int axis_idx)
 +{
 +	if (axis_idx >= MAN_AXIS_RANGE_TRANS_START && axis_idx < MAN_AXIS_RANGE_TRANS_END) {
 +		return MAN_AXES_TRANSLATE;
 +	}
 +	if (axis_idx >= MAN_AXIS_RANGE_ROT_START && axis_idx < MAN_AXIS_RANGE_ROT_END) {
 +		return MAN_AXES_ROTATE;
 +	}
 +	if (axis_idx >= MAN_AXIS_RANGE_SCALE_START && axis_idx < MAN_AXIS_RANGE_SCALE_END) {
 +		return MAN_AXES_SCALE;
 +	}
 +	BLI_assert(0);
 +	return -1;
 +}
 +
 +static uint manipulator_orientation_axis(const int axis_idx, bool *r_is_plane)
 +{
 +	switch (axis_idx) {
 +		case MAN_AXIS_TRANS_YZ:
 +		case MAN_AXIS_SCALE_YZ:
 +			if (r_is_plane) {
 +				*r_is_plane = true;
 +			}
 +			ATTR_FALLTHROUGH;
 +		case MAN_AXIS_TRANS_X:
 +		case MAN_AXIS_ROT_X:
 +		case MAN_AXIS_SCALE_X:
 +			return 0;
 +
 +		case MAN_AXIS_TRANS_ZX:
 +		case MAN_AXIS_SCALE_ZX:
 +			if (r_is_plane) {
 +				*r_is_plane = true;
 +			}
 +			ATTR_FALLTHROUGH;
 +		case MAN_AXIS_TRANS_Y:
 +		case MAN_AXIS_ROT_Y:
 +		case MAN_AXIS_SCALE_Y:
 +			return 1;
 +
 +		case MAN_AXIS_TRANS_XY:
 +		case MAN_AXIS_SCALE_XY:
 +			if (r_is_plane) {
 +				*r_is_plane = true;
 +			}
 +			ATTR_FALLTHROUGH;
 +		case MAN_AXIS_TRANS_Z:
 +		case MAN_AXIS_ROT_Z:
 +		case MAN_AXIS_SCALE_Z:
 +			return 2;
 +	}
 +	return 3;
 +}
 +
 +static bool manipulator_is_axis_visible(
 +        const View3D *v3d, const RegionView3D *rv3d,
 +        const float idot[3], const int axis_type, const int axis_idx)
 +{
 +	bool is_plane = false;
 +	const uint aidx_norm = manipulator_orientation_axis(axis_idx, &is_plane);
 +	/* don't draw axis perpendicular to the view */
 +	if (aidx_norm < 3) {
 +		float idot_axis = idot[aidx_norm];
 +		if (is_plane) {
 +			idot_axis = 1.0f - idot_axis;
 +		}
 +		if (idot_axis < TW_AXIS_DOT_MIN) {
 +			return false;
 +		}
 +	}
 +
 +	if ((axis_type == MAN_AXES_TRANSLATE && !(v3d->twtype & V3D_MANIP_TRANSLATE)) ||
 +	    (axis_type == MAN_AXES_ROTATE && !(v3d->twtype & V3D_MANIP_ROTATE)) ||
 +	    (axis_type == MAN_AXES_SCALE && !(v3d->twtype & V3D_MANIP_SCALE)))
 +	{
 +		return false;
 +	}
 +
 +	switch (axis_idx) {
 +		case MAN_AXIS_TRANS_X:
 +			return (rv3d->twdrawflag & MAN_TRANS_X);
 +		case MAN_AXIS_TRANS_Y:
 +			return (rv3d->twdrawflag & MAN_TRANS_Y);
 +		case MAN_AXIS_TRANS_Z:
 +			return (rv3d->twdrawflag & MAN_TRANS_Z);
 +		case MAN_AXIS_TRANS_C:
 +			return (rv3d->twdrawflag & MAN_TRANS_C);
 +		case MAN_AXIS_ROT_X:
 +			return (rv3d->twdrawflag & MAN_ROT_X);
 +		case MAN_AXIS_ROT_Y:
 +			return (rv3d->twdrawflag & MAN_ROT_Y);
 +		case MAN_AXIS_ROT_Z:
 +			return (rv3d->twdrawflag & MAN_ROT_Z);
 +		case MAN_AXIS_ROT_C:
 +		case MAN_AXIS_ROT_T:
 +			return (rv3d->twdrawflag & MAN_ROT_C);
 +		case MAN_AXIS_SCALE_X:
 +			return (rv3d->twdrawflag & MAN_SCALE_X);
 +		case MAN_AXIS_SCALE_Y:
 +			return (rv3d->twdrawflag & MAN_SCALE_Y);
 +		case MAN_AXIS_SCALE_Z:
 +			return (rv3d->twdrawflag & MAN_SCALE_Z);
 +		case MAN_AXIS_SCALE_C:
 +			return (rv3d->twdrawflag & MAN_SCALE_C && (v3d->twtype & V3D_MANIP_TRANSLATE) == 0);
 +		case MAN_AXIS_TRANS_XY:
 +			return (rv3d->twdrawflag & MAN_TRANS_X &&
 +			        rv3d->twdrawflag & MAN_TRANS_Y &&
 +			        (v3d->twtype & V3D_MANIP_ROTATE) == 0);
 +		case MAN_AXIS_TRANS_YZ:
 +			return (rv3d->twdrawflag & MAN_TRANS_Y &&
 +			        rv3d->twdrawflag & MAN_TRANS_Z &&
 +			        (v3d->twtype & V3D_MANIP_ROTATE) == 0);
 +		case MAN_AXIS_TRANS_ZX:
 +			return (rv3d->twdrawflag & MAN_TRANS_Z &&
 +			        rv3d->twdrawflag & MAN_TRANS_X &&
 +			        (v3d->twtype & V3D_MANIP_ROTATE) == 0);
 +		case MAN_AXIS_SCALE_XY:
 +			return (rv3d->twdrawflag & MAN_SCALE_X &&
 +			        rv3d->twdrawflag & MAN_SCALE_Y &&
 +			        (v3d->twtype & V3D_MANIP_TRANSLATE) == 0 &&
 +			        (v3d->twtype & V3D_MANIP_ROTATE) == 0);
 +		case MAN_AXIS_SCALE_YZ:
 +			return (rv3d->twdrawflag & MAN_SCALE_Y &&
 +			        rv3d->twdrawflag & MAN_SCALE_Z &&
 +			        (v3d->twtype & V3D_MANIP_TRANSLATE) == 0 &&
 +			        (v3d->twtype & V3D_MANIP_ROTATE) == 0);
 +		case MAN_AXIS_SCALE_ZX:
 +			return (rv3d->twdrawflag & MAN_SCALE_Z &&
 +			        rv3d->twdrawflag & MAN_SCALE_X &&
 +			        (v3d->twtype & V3D_MANIP_TRANSLATE) == 0 &&
 +			        (v3d->twtype & V3D_MANIP_ROTATE) == 0);
 +	}
 +	return false;
 +}
 +
 +static void manipulator_get_axis_color(
 +        const int axis_idx, const float idot[3],
 +        float r_col[4], float r_col_hi[4])
 +{
 +	/* alpha values for normal/highlighted states */
 +	const float alpha = 0.6f;
 +	const float alpha_hi = 1.0f;
 +	float alpha_fac;
 +
 +	bool is_plane = false;
 +	const int axis_idx_norm = manipulator_orientation_axis(axis_idx, &is_plane);
 +	/* get alpha fac based on axis angle, to fade axis out when hiding it because it points towards view */
 +	if (axis_idx_norm < 3) {
 +		float idot_axis = idot[axis_idx_norm];
 +		if (is_plane) {
 +			idot_axis = 1.0f - idot_axis;
 +		}
 +		alpha_fac = (idot_axis > TW_AXIS_DOT_MAX) ?
 +		        1.0f : (idot_axis < TW_AXIS_DOT_MIN) ?
 +		        0.0f : ((idot_axis - TW_AXIS_DOT_MIN) / (TW_AXIS_DOT_MAX - TW_AXIS_DOT_MIN));
 +	}
 +	else {
 +		/* trackball rotation axis is a special case, we only draw a slight overlay */
 +		alpha_fac = (axis_idx == MAN_AXIS_ROT_T) ? 0.1f : 1.0f;
 +	}
 +
 +	switch (axis_idx) {
 +		case MAN_AXIS_TRANS_X:
 +		case MAN_AXIS_ROT_X:
 +		case MAN_AXIS_SCALE_X:
 +		case MAN_AXIS_TRANS_YZ:
 +		case MAN_AXIS_SCALE_YZ:
 +			UI_GetThemeColor4fv(TH_AXIS_X, r_col);
 +			break;
 +		case MAN_AXIS_TRANS_Y:
 +		case MAN_AXIS_ROT_Y:
 +		case MAN_AXIS_SCALE_Y:
 +		case MAN_AXIS_TRANS_ZX:
 +		case MAN_AXIS_SCALE_ZX:
 +			UI_GetThemeColor4fv(TH_AXIS_Y, r_col);
 +			break;
 +		case MAN_AXIS_TRANS_Z:
 +		case MAN_AXIS_ROT_Z:
 +		case MAN_AXIS_SCALE_Z:
 +		case MAN_AXIS_TRANS_XY:
 +		case MAN_AXIS_SCALE_XY:
 +			UI_GetThemeColor4fv(TH_AXIS_Z, r_col);
 +			break;
 +		case MAN_AXIS_TRANS_C:
 +		case MAN_AXIS_ROT_C:
 +		case MAN_AXIS_SCALE_C:
 +		case MAN_AXIS_ROT_T:
 +			copy_v4_fl(r_col, 1.0f);
 +			break;
 +	}
 +
 +	copy_v4_v4(r_col_hi, r_col);
 +
 +	r_col[3] = alpha * alpha_fac;
 +	r_col_hi[3] = alpha_hi * alpha_fac;
 +}
 +
 +static void manipulator_get_axis_constraint(const int axis_idx, int r_axis[3])
 +{
 +	zero_v3_int(r_axis);
 +
 +	switch (axis_idx) {
 +		case MAN_AXIS_TRANS_X:
 +		case MAN_AXIS_ROT_X:
 +		case MAN_AXIS_SCALE_X:
 +			r_axis[0] = 1;
 +			break;
 +		case MAN_AXIS_TRANS_Y:
 +		case MAN_AXIS_ROT_Y:
 +		case MAN_AXIS_SCALE_Y:
 +			r_axis[1] = 1;
 +			break;
 +		case MAN_AXIS_TRANS_Z:
 +		case MAN_AXIS_ROT_Z:
 +		case MAN_AXIS_SCALE_Z:
 +			r_axis[2] = 1;
 +			break;
 +		case MAN_AXIS_TRANS_XY:
 +		case MAN_AXIS_SCALE_XY:
 +			r_axis[0] = r_axis[1] = 1;
 +			break;
 +		case MAN_AXIS_TRANS_YZ:
 +		case MAN_AXIS_SCALE_YZ:
 +			r_axis[1] = r_axis[2] = 1;
 +			break;
 +		case MAN_AXIS_TRANS_ZX:
 +		case MAN_AXIS_SCALE_ZX:
 +			r_axis[2] = r_axis[0] = 1;
 +			break;
 +		default:
 +			break;
 +	}
 +}
 +
 +
 +/* **************** Preparation Stuff **************** */
 +
  /* transform widget center calc helper for below */
- static void calc_tw_center(Scene *scene, const float co[3])
+ static void calc_tw_center(struct TransformBounds *tbounds, const float co[3])
  {
- 	float *twcent = scene->twcent;
- 	float *min = scene->twmin;
- 	float *max = scene->twmax;
- 
- 	minmax_v3v3_v3(min, max, co);
- 	add_v3_v3(twcent, co);
+ 	minmax_v3v3_v3(tbounds->min, tbounds->max, co);
+ 	add_v3_v3(tbounds->center, co);
  }
  
  static void protectflag_to_drawflags(short protectflag, short *drawflags)
@@@ -587,9 -281,9 +587,9 @@@ static int calc_manipulator_stats(cons
  	rv3d->twdrawflag = 0xFFFF;
  
  	/* transform widget centroid/center */
- 	INIT_MINMAX(scene->twmin, scene->twmax);
- 	zero_v3(scene->twcent);
+ 	INIT_MINMAX(tbounds->min, tbounds->max);
+ 	zero_v3(tbounds->center);
 -
 +	
  	if (is_gp_edit) {
  		float diff_mat[4][4];
  		float fpt[3];
@@@ -636,7 -330,7 +636,7 @@@
  
  		/* selection center */
  		if (totsel) {
- 			mul_v3_fl(scene->twcent, 1.0f / (float)totsel);   /* centro

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list