[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