[Bf-blender-cvs] [20634fd433b] blender2.8: Tool System: use preselect highlight w/ poly-build

Campbell Barton noreply at git.blender.org
Mon Sep 10 06:26:11 CEST 2018


Commit: 20634fd433b07bbd90358a625792292e9581a0f6
Author: Campbell Barton
Date:   Sun Sep 9 16:11:02 2018 +1000
Branches: blender2.8
https://developer.blender.org/rB20634fd433b07bbd90358a625792292e9581a0f6

Tool System: use preselect highlight w/ poly-build

- Poly build now uses a new gizmo for pre-selection
  which has the same behavior as loop-cut.

  This replaces hack where mouse-move set the active element
  which was no longer working properly because of missing
  depsgraph updates.

- Multi-object support for poly-build.

- Support for deformed cage.

- Fix error where changing active object wasn't properly
  refreshing the preselect gizmo (for loopcut too).

Currently holding Alt to select non-boundary element's isn't working.

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

M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/include/ED_mesh.h
M	source/blender/editors/mesh/CMakeLists.txt
M	source/blender/editors/mesh/editmesh_polybuild.c
A	source/blender/editors/mesh/editmesh_preselect_elem.c
M	source/blender/editors/mesh/editmesh_select.c
M	source/blender/editors/mesh/mesh_ops.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/space_view3d/view3d_gizmo_preselect.c
M	source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
M	source/blender/editors/space_view3d/view3d_intern.h

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

diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index f65a77ce3bf..293c7ecb975 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -572,7 +572,7 @@ class _defs_edit_mesh:
         return dict(
             text="Poly Build",
             icon="ops.mesh.polybuild_hover",
-            widget=None,
+            widget="VIEW3D_GGT_mesh_preselect_elem",
             keymap=(
                 ("mesh.polybuild_face_at_cursor_move",
                  dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
@@ -581,8 +581,6 @@ class _defs_edit_mesh:
                  dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
                  dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
                 ("mesh.polybuild_dissolve_at_cursor", dict(), dict(type='ACTIONMOUSE', value='CLICK', alt=True)),
-                ("mesh.polybuild_hover", dict(use_boundary=False), dict(type='MOUSEMOVE', value='ANY', alt=True)),
-                ("mesh.polybuild_hover", dict(use_boundary=True), dict(type='MOUSEMOVE', value='ANY', any=True)),
             ),
         )
 
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index c084033bbb6..92338aa508f 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -52,6 +52,7 @@ struct Mesh;
 struct UvVertMap;
 struct UvMapVert;
 struct BMEditMesh;
+struct BMElem;
 struct BMesh;
 struct BMVert;
 struct BMLoop;
@@ -177,6 +178,14 @@ bool EDBM_unified_findnearest(
         struct BMEdge **r_eed,
         struct BMFace **r_efa);
 
+bool EDBM_unified_findnearest_from_raycast(
+        struct ViewContext *vc,
+        bool use_boundary,
+        struct Base **r_base,
+        struct BMVert **r_eve,
+        struct BMEdge **r_eed,
+        struct BMFace **r_efa);
+
 bool EDBM_select_pick(struct bContext *C, const int mval[2], bool extend, bool deselect, bool toggle);
 
 void EDBM_selectmode_set(struct BMEditMesh *em);
@@ -210,6 +219,16 @@ void EDBM_preselect_edgering_update_from_edge(
         struct EditMesh_PreSelEdgeRing *psel,
         struct BMesh *bm, struct BMEdge *eed_start, int previewlines, const float (*coords)[3]);
 
+/* editmesh_preselect_elem.c */
+struct EditMesh_PreSelElem;
+struct EditMesh_PreSelElem *EDBM_preselect_elem_create(void);
+void EDBM_preselect_elem_destroy(struct EditMesh_PreSelElem *psel);
+void EDBM_preselect_elem_clear(struct EditMesh_PreSelElem *psel);
+void EDBM_preselect_elem_draw(struct EditMesh_PreSelElem *psel, const float matrix[4][4]);
+void EDBM_preselect_elem_update_from_single(
+        struct EditMesh_PreSelElem *psel,
+        struct BMesh *bm, struct BMElem *ele, const float (*coords)[3]);
+
 /* mesh_ops.c */
 void        ED_operatortypes_mesh(void);
 void        ED_operatormacros_mesh(void);
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 4784f07c297..43360af9e18 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -58,6 +58,7 @@ set(SRC
 	editmesh_path.c
 	editmesh_polybuild.c
 	editmesh_preselect.c
+	editmesh_preselect_elem.c
 	editmesh_rip.c
 	editmesh_rip_edge.c
 	editmesh_select.c
diff --git a/source/blender/editors/mesh/editmesh_polybuild.c b/source/blender/editors/mesh/editmesh_polybuild.c
index 9b7d460973a..adf5802cdcf 100644
--- a/source/blender/editors/mesh/editmesh_polybuild.c
+++ b/source/blender/editors/mesh/editmesh_polybuild.c
@@ -25,6 +25,8 @@
  * an experimental tool for quickly constructing/manipulating faces.
  */
 
+#include "MEM_guardedalloc.h"
+
 #include "DNA_object_types.h"
 
 #include "BLI_math.h"
@@ -33,10 +35,13 @@
 #include "BKE_report.h"
 #include "BKE_editmesh.h"
 #include "BKE_mesh.h"
+#include "BKE_layer.h"
 
 #include "WM_types.h"
 
+#include "ED_object.h"
 #include "ED_mesh.h"
+#include "ED_scene.h"
 #include "ED_screen.h"
 #include "ED_transform.h"
 #include "ED_view3d.h"
@@ -50,6 +55,8 @@
 
 #include "WM_api.h"
 
+#include "DEG_depsgraph.h"
+
 /* -------------------------------------------------------------------- */
 /** \name Local Utilities
  * \{ */
@@ -63,6 +70,98 @@ static void edbm_selectmode_ensure(Scene *scene, BMEditMesh *em, short selectmod
 	}
 }
 
+/* Could make public, for now just keep here. */
+static void edbm_flag_disable_all_multi(ViewLayer *view_layer, const char hflag)
+{
+	uint objects_len = 0;
+	Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+	for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+		Object *ob_iter = objects[ob_index];
+		BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
+		BMesh *bm_iter = em_iter->bm;
+		if (bm_iter->totvertsel) {
+			EDBM_flag_disable_all(em_iter, hflag);
+			if (hflag & BM_ELEM_SELECT) {
+				BM_select_history_clear(em_iter->bm);
+			}
+			DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
+		}
+	}
+	MEM_freeN(objects);
+}
+
+/* When accessed as a tool, get the active edge from the preselection gizmo. */
+static bool edbm_preselect_or_active(
+        bContext *C,
+        Base **r_base,
+        BMElem **r_ele)
+{
+	ViewLayer *view_layer = CTX_data_view_layer(C);
+	ARegion *ar = CTX_wm_region(C);
+	wmGizmoMap *gzmap = ar->gizmo_map;
+	wmGizmoGroup *gzgroup = gzmap ? WM_gizmomap_group_find(gzmap, "VIEW3D_GGT_mesh_preselect_elem") : NULL;
+	if (gzgroup != NULL) {
+		wmGizmo *gz = gzgroup->gizmos.first;
+		const int object_index = RNA_int_get(gz->ptr, "object_index");
+
+		/* weak, allocate an array just to access the index. */
+		Base *base = NULL;
+		Object *obedit = NULL;
+		{
+			uint bases_len;
+			Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(view_layer, &bases_len);
+			if (object_index < bases_len) {
+				base = bases[object_index];
+				obedit = base->object;
+			}
+			MEM_freeN(bases);
+		}
+
+		*r_base = base;
+		*r_ele = NULL;
+
+		if (obedit) {
+			BMEditMesh *em = BKE_editmesh_from_object(obedit);
+			BMesh *bm = em->bm;
+			const int vert_index = RNA_int_get(gz->ptr, "vert_index");
+			const int edge_index = RNA_int_get(gz->ptr, "edge_index");
+			const int face_index = RNA_int_get(gz->ptr, "face_index");
+			if (vert_index != -1) {
+				*r_ele = (BMElem *)BM_vert_at_index_find(bm, vert_index);
+			}
+			else if (edge_index != -1) {
+				*r_ele = (BMElem *)BM_edge_at_index_find(bm, edge_index);
+			}
+			else if (face_index != -1) {
+				*r_ele = (BMElem *)BM_face_at_index_find(bm, face_index);
+			}
+		}
+	}
+	else {
+		Base *base = view_layer->basact;
+		Object *obedit = base->object;
+		BMEditMesh *em = BKE_editmesh_from_object(obedit);
+		BMesh *bm = em->bm;
+		*r_base = base;
+		*r_ele = BM_mesh_active_elem_get(bm);
+	}
+	return (*r_ele != NULL);
+}
+
+static bool edbm_preselect_or_active_init_viewcontext(
+        bContext *C,
+        ViewContext *vc,
+        Base **r_base,
+        BMElem **r_ele)
+{
+	em_setup_viewcontext(C, vc);
+	bool ok = edbm_preselect_or_active(C, r_base, r_ele);
+	if (ok) {
+		ED_view3d_viewcontext_init_object(vc, (*r_base)->object);
+	}
+	return ok;
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -72,15 +171,15 @@ static void edbm_selectmode_ensure(Scene *scene, BMEditMesh *em, short selectmod
 static int edbm_polybuild_face_at_cursor_invoke(
         bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
 {
-	ViewContext vc;
 	float center[3];
 	bool changed = false;
 
-	em_setup_viewcontext(C, &vc);
-	Object *obedit = CTX_data_edit_object(C);
-	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	ViewContext vc;
+	Base *basact = NULL;
+	BMElem *ele_act = NULL;
+	edbm_preselect_or_active_init_viewcontext(C, &vc, &basact, &ele_act);
+	BMEditMesh *em = vc.em;
 	BMesh *bm = em->bm;
-	BMElem *ele_act = BM_mesh_active_elem_get(bm);
 
 	invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
 	ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
@@ -95,7 +194,7 @@ static int edbm_polybuild_face_at_cursor_invoke(
 		mul_m4_v3(vc.obedit->imat, center);
 
 		BMVert *v_new = BM_vert_create(bm, center, NULL, BM_CREATE_NOP);
-		EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+		edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
 		BM_vert_select_set(bm, v_new, true);
 		changed = true;
 	}
@@ -118,7 +217,7 @@ static int edbm_polybuild_face_at_cursor_invoke(
 		// BMFace *f_new =
 		BM_face_create_verts(bm, v_tri, 3, f_reference, BM_CREATE_NOP, true);
 
-		EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+		edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
 		BM_vert_select_set(bm, v_tri[2], true);
 		changed = true;
 	}
@@ -169,7 +268,7 @@ static int edbm_polybuild_face_at_cursor_invoke(
 			// BMFace *f_new =
 			BM_face_create_verts(bm, v_quad, 4, f_reference, BM_CREATE_NOP, true);
 
-			EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+			edbm_flag_disable_all_multi(vc.view_layer, BM_ELEM_SELECT);
 			BM_vert_select_set(bm, v_quad[2], true);
 			changed = true;
 		}
@@ -188,11 +287,13 @@ static int edbm_polybuild_face_at_cursor_invoke(
 	}
 
 	if (changed) {
-		BM_select_history_clear(bm);
-
 		EDBM_mesh_normals_update(em);
 		EDBM_update_generic(em, true, true);
 
+		if (vc.view_layer->basact != basact) {
+			ED_object_base_activate(C, basact);
+		}
+
 		WM_event_add_mousemove(C);
 
 		return OPERATOR_FINISHED;
@@ -229,13 +330,14 @@ void MESH_OT_polybuild_face_at_cursor(wmOperatorType *ot)
 static int edbm_polybuild_split_at_cursor_invoke(
         bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
 {
-	ViewContext vc;
 	float center[3];
 	bool changed = false;
 
-	em_setup_viewcontext(C, &vc);
-	Object *obedit = CTX_data_edit_object(C);
-	BMEditMesh *em = BKE_editmesh_from_object(obedit);
+	ViewContext vc;
+	Base *basact = NULL;
+	BMElem *ele_act = NULL;
+	edbm_preselect_or_active_init_viewcontext(C, &vc, &basact, &ele_act);
+	BMEditMesh *em = vc.em;
 	BMesh *bm = em->bm;
 
 	invert_m4_m4(vc.obedit->imat, vc.obedit->obmat);
@@ -243,8 +345,6 @@ static int edbm_polybuild_split_at_cursor_invoke(
 
 	edbm_selectmode_ensure(vc.scene, vc.em, SC

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list