[Bf-blender-cvs] [f5c4cc877eb] blender2.8: Spin Tool: option (disabled) for gizmos to follow selection
Campbell Barton
noreply at git.blender.org
Wed Sep 26 06:22:37 CEST 2018
Commit: f5c4cc877eb7fd6383f160a8d371dab93b36632d
Author: Campbell Barton
Date: Wed Sep 26 14:31:57 2018 +1000
Branches: blender2.8
https://developer.blender.org/rBf5c4cc877eb7fd6383f160a8d371dab93b36632d
Spin Tool: option (disabled) for gizmos to follow selection
Disable since this causes multiple axis to overlap too often.
It's also glitchy since we don't have a good way to detect
changes to selection.
===================================================================
M source/blender/editors/mesh/editmesh_extrude_spin.c
M source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
===================================================================
diff --git a/source/blender/editors/mesh/editmesh_extrude_spin.c b/source/blender/editors/mesh/editmesh_extrude_spin.c
index c1187da38d5..fc7e3c6d39d 100644
--- a/source/blender/editors/mesh/editmesh_extrude_spin.c
+++ b/source/blender/editors/mesh/editmesh_extrude_spin.c
@@ -203,3 +203,5 @@ void MESH_OT_spin(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
#endif
}
+
+/** \} */
diff --git a/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
index 002620b2b60..326a5c025e7 100644
--- a/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
+++ b/source/blender/editors/mesh/editmesh_extrude_spin_gizmo.c
@@ -48,6 +48,16 @@
#include "ED_gizmo_library.h"
#include "ED_undo.h"
+/**
+ * Orient the handles towards the selection (can be slow with high-poly mesh!).
+ */
+// Disable for now, issues w/ refresh and '+' icons overlap.
+// #define USE_SELECT_CENTER
+
+#ifdef USE_SELECT_CENTER
+# include "BKE_editmesh.h"
+#endif
+
static const float dial_angle_partial = M_PI / 2;
static const float dial_angle_partial_margin = 0.92f;
@@ -71,6 +81,11 @@ typedef struct GizmoGroupData_SpinInit {
wmOperatorType *ot_spin;
PropertyRNA *ot_spin_gizmo_axis_prop;
float orient_mat[3][3];
+#ifdef USE_SELECT_CENTER
+ float select_center[3];
+ float select_center_ortho_axis[3][3];
+ bool use_select_center;
+#endif
} data;
} GizmoGroupData_SpinInit;
@@ -295,8 +310,19 @@ static void gizmo_mesh_spin_init_refresh(const bContext *C, wmGizmoGroup *gzgrou
ED_transform_calc_orientation_from_type(C, ggd->data.orient_mat);
for (int i = 0; i < 3; i++) {
const int axis_ortho = (i + 2) % 3;
+ const float *axis_ortho_vec = ggd->data.orient_mat[axis_ortho];
+#ifdef USE_SELECT_CENTER
+ if (ggd->data.use_select_center) {
+ float delta[3];
+ sub_v3_v3v3(delta, ggd->data.select_center, ggd->gizmos.xyz_view[0]->matrix_basis[3]);
+ project_plane_normalized_v3_v3v3(ggd->data.select_center_ortho_axis[i], delta, ggd->data.orient_mat[i]);
+ if (normalize_v3(ggd->data.select_center_ortho_axis[i]) != 0.0f) {
+ axis_ortho_vec = ggd->data.select_center_ortho_axis[i];
+ }
+ }
+#endif
gizmo_mesh_spin_init_refresh_axis_orientation(
- gzgroup, i, ggd->data.orient_mat[i], ggd->data.orient_mat[axis_ortho]);
+ gzgroup, i, ggd->data.orient_mat[i], axis_ortho_vec);
}
{
@@ -304,11 +330,51 @@ static void gizmo_mesh_spin_init_refresh(const bContext *C, wmGizmoGroup *gzgrou
gzgroup, 3, rv3d->viewinv[2], NULL);
}
+
+#ifdef USE_SELECT_CENTER
+ {
+ Object *obedit = CTX_data_edit_object(C);
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ float select_center[3] = {0};
+ int totsel = 0;
+
+ BMesh *bm = em->bm;
+ BMVert *eve;
+ BMIter iter;
+
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+ totsel++;
+ add_v3_v3(select_center, eve->co);
+ }
+ }
+ }
+ if (totsel) {
+ mul_v3_fl(select_center, 1.0f / totsel);
+ mul_m4_v3(obedit->obmat, select_center);
+ copy_v3_v3(ggd->data.select_center, select_center);
+ ggd->data.use_select_center = true;
+ }
+ else {
+ ggd->data.use_select_center = false;
+ }
+ }
+#endif
+
for (int i = 0; i < ARRAY_SIZE(ggd->gizmos.icon_button); i++) {
const int axis_ortho = (i + 2) % 3;
+ const float *axis_ortho_vec = ggd->data.orient_mat[axis_ortho];
float offset = INIT_SCALE_BASE / INIT_SCALE_BUTTON;
float offset_vec[3];
- mul_v3_v3fl(offset_vec, ggd->data.orient_mat[axis_ortho], offset);
+
+#ifdef USE_SELECT_CENTER
+ if (ggd->data.use_select_center && !is_zero_v3(ggd->data.select_center_ortho_axis[i])) {
+ axis_ortho_vec = ggd->data.select_center_ortho_axis[i];
+ }
+#endif
+
+ mul_v3_v3fl(offset_vec, axis_ortho_vec, offset);
for (int j = 0; j < 2; j++) {
wmGizmo *gz = ggd->gizmos.icon_button[i][j];
float mat3[3][3];
More information about the Bf-blender-cvs
mailing list