[Bf-blender-cvs] [cb49e77eb1f] temp-object-multi-mode: Initial proof of concept multi-mode

Campbell Barton noreply at git.blender.org
Fri Mar 9 13:33:08 CET 2018


Commit: cb49e77eb1f98605b09fdbc5869711ec6a107425
Author: Campbell Barton
Date:   Thu Mar 8 01:29:32 2018 +1100
Branches: temp-object-multi-mode
https://developer.blender.org/rBcb49e77eb1f98605b09fdbc5869711ec6a107425

Initial proof of concept multi-mode

Entering edit-mode uses all selected mesh objects.

- drawing.
- select (picking, circle, border).
- select mode vert/edge/face switching.
- handful of tools: subdivide, delete, select(all)
- uv project & unwrap.
- transform (uv's and vertices)
  (crazy-space and islands aren't currently working).

Almost nothing else works, this is a proof of concept.

Note, missing indentation in some added loops to reduce diff noise and merge conflicts.

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/bmesh/intern/bmesh_mesh.h
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/editors/include/ED_mesh.h
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/include/ED_uvedit.h
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/mesh/editmesh_select.c
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/mesh/editmesh_utils.c
M	source/blender/editors/mesh/mesh_data.c
M	source/blender/editors/mesh/meshtools.c
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_hook.c
M	source/blender/editors/object/object_modes.c
M	source/blender/editors/object/object_relations.c
M	source/blender/editors/object/object_select.c
M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/editors/transform/transform_conversions.c
M	source/blender/editors/transform/transform_generics.c
M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/editors/uvedit/uvedit_ops.c
M	source/blender/editors/uvedit/uvedit_unwrap_ops.c
M	source/blender/makesrna/intern/rna_object.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 59aec53aa1e..f69575efdbd 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -187,10 +187,20 @@ void BKE_visible_objects_iterator_begin(BLI_Iterator *iter, void *data_in);
 void BKE_visible_objects_iterator_next(BLI_Iterator *iter);
 void BKE_visible_objects_iterator_end(BLI_Iterator *iter);
 
+struct ObjectsInModeIteratorData {
+	int object_mode;
+	struct ViewLayer *view_layer;
+	struct Base *base_active;
+};
+
 void BKE_renderable_objects_iterator_begin(BLI_Iterator *iter, void *data_in);
 void BKE_renderable_objects_iterator_next(BLI_Iterator *iter);
 void BKE_renderable_objects_iterator_end(BLI_Iterator *iter);
 
+void BKE_view_layer_objects_in_mode_iterator_begin(BLI_Iterator *iter, void *data_in);
+void BKE_view_layer_objects_in_mode_iterator_next(BLI_Iterator *iter);
+void BKE_view_layer_objects_in_mode_iterator_end(BLI_Iterator *iter);
+
 void BKE_selected_bases_iterator_begin(BLI_Iterator *iter, void *data_in);
 void BKE_selected_bases_iterator_next(BLI_Iterator *iter);
 void BKE_selected_bases_iterator_end(BLI_Iterator *iter);
@@ -217,6 +227,43 @@ void BKE_visible_bases_iterator_end(BLI_Iterator *iter);
 #define FOREACH_VISIBLE_OBJECT_END                                            \
 	ITER_END
 
+
+#define FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _object_mode, _instance)     \
+{ \
+	struct ObjectsInModeIteratorData data_ = {                                \
+		.object_mode = _object_mode,                                          \
+		.view_layer = _view_layer,                                            \
+		.base_active = _view_layer->basact,                                   \
+	};                                                                        \
+	ITER_BEGIN(BKE_view_layer_objects_in_mode_iterator_begin,                 \
+	           BKE_view_layer_objects_in_mode_iterator_next,                  \
+	           BKE_view_layer_objects_in_mode_iterator_end,                   \
+	           &data_, Base *, _instance)
+
+#define FOREACH_BASE_IN_MODE_END                                              \
+	ITER_END;                                                                 \
+} ((void)0)
+
+#define FOREACH_BASE_IN_EDIT_MODE_BEGIN(_view_layer, _instance)               \
+	FOREACH_BASE_IN_MODE_BEGIN(_view_layer, OB_MODE_EDIT, _instance)
+
+#define FOREACH_BASE_IN_EDIT_MODE_END                                         \
+	FOREACH_BASE_IN_MODE_END
+
+#define FOREACH_OBJECT_IN_MODE_BEGIN(_view_layer, _object_mode, _instance)    \
+	FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _object_mode, _base) {            \
+		Object *_instance = _base->object;
+
+#define FOREACH_OBJECT_IN_MODE_END                                            \
+	} FOREACH_BASE_IN_MODE_END
+
+#define FOREACH_OBJECT_IN_EDIT_MODE_BEGIN(_view_layer, _instance)             \
+	FOREACH_BASE_IN_EDIT_MODE_BEGIN(_view_layer, _base) {                     \
+		Object *_instance = _base->object;
+
+#define FOREACH_OBJECT_IN_EDIT_MODE_END                                        \
+	} FOREACH_BASE_IN_EDIT_MODE_END
+
 #define FOREACH_SELECTED_BASE_BEGIN(view_layer, _instance)                     \
 	ITER_BEGIN(BKE_selected_bases_iterator_begin,                              \
 	           BKE_selected_bases_iterator_next,                               \
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 536b21e83ce..dacab0d76ed 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -85,7 +85,9 @@ void BKE_object_copy_proxy_drivers(struct Object *ob, struct Object *target);
 bool BKE_object_exists_check(struct Object *obtest);
 bool BKE_object_is_in_editmode(const struct Object *ob);
 bool BKE_object_is_in_editmode_vgroup(struct Object *ob);
+bool BKE_object_is_in_editmode_and_selected(const struct Object *ob);
 bool BKE_object_is_in_wpaint_select_vert(const struct Object *ob, eObjectMode object_mode);
+bool BKE_object_has_mode_data(const struct Object *ob, eObjectMode object_mode);
 
 typedef enum eObjectVisibilityCheck {
 	OB_VISIBILITY_CHECK_FOR_VIEWPORT,
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index cde256a0f14..cceefb4897f 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -41,6 +41,7 @@
 #include "BKE_main.h"
 #include "BKE_node.h"
 #include "BKE_workspace.h"
+#include "BKE_object.h"
 
 #include "DEG_depsgraph.h"
 
@@ -2220,6 +2221,59 @@ void BKE_renderable_objects_iterator_end(BLI_Iterator *UNUSED(iter))
 	/* Do nothing - iter->data was static allocated, we can't free it. */
 }
 
+/* --- */
+
+void BKE_view_layer_objects_in_mode_iterator_begin(BLI_Iterator *iter, void *data_in)
+{
+	struct ObjectsInModeIteratorData *data = data_in;
+	Base *base = data->base_active;
+
+	/* when there are no objects */
+	if (base ==  NULL) {
+		iter->valid = false;
+		return;
+	}
+	iter->data = data_in;
+	iter->current = base;
+}
+
+void BKE_view_layer_objects_in_mode_iterator_next(BLI_Iterator *iter)
+{
+	struct ObjectsInModeIteratorData *data = iter->data;
+	Base *base = iter->current;
+
+	if (base == data->base_active) {
+		/* first step */
+		base = data->view_layer->object_bases.first;
+		if (base == data->base_active) {
+			base = base->next;
+		}
+	}
+	else {
+		base = base->next;
+	}
+
+	while (base) {
+		if ((base->flag & BASE_SELECTED) != 0 &&
+		    (base->object->type == data->base_active->object->type) &&
+		    (base != data->base_active) &&
+		    (BKE_object_has_mode_data(base->object, data->object_mode) == true))
+		{
+			iter->current = base;
+			return;
+		}
+		base = base->next;
+	}
+	iter->valid = false;
+}
+
+void BKE_view_layer_objects_in_mode_iterator_end(BLI_Iterator *UNUSED(iter))
+{
+	/* do nothing */
+}
+
+/* --- */
+
 /* Evaluation  */
 
 /**
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 3e577e58ae3..adba95cde87 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -532,6 +532,15 @@ bool BKE_object_is_in_editmode(const Object *ob)
 	return false;
 }
 
+bool BKE_object_is_in_editmode_and_selected(const Object *ob)
+{
+	if ((ob->flag & SELECT) && (BKE_object_is_in_editmode(ob))) {
+		return true;
+	}
+	return false;
+}
+
+
 bool BKE_object_is_in_editmode_vgroup(Object *ob)
 {
 	return (OB_TYPE_SUPPORT_VGROUP(ob->type) &&
@@ -550,6 +559,31 @@ bool BKE_object_is_in_wpaint_select_vert(const Object *ob, eObjectMode object_mo
 	return false;
 }
 
+bool BKE_object_has_mode_data(const struct Object *ob, eObjectMode object_mode)
+{
+	if (object_mode & OB_MODE_EDIT) {
+		if (BKE_object_is_in_editmode(ob)) {
+			return true;
+		}
+	}
+	else if (object_mode & OB_MODE_VERTEX_PAINT) {
+		if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_VERTEX_PAINT)) {
+			return true;
+		}
+	}
+	else if (object_mode & OB_MODE_WEIGHT_PAINT) {
+		if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_WEIGHT_PAINT)) {
+			return true;
+		}
+	}
+	else if (object_mode & OB_MODE_SCULPT) {
+		if (ob->sculpt && (ob->sculpt->mode_type == OB_MODE_SCULPT)) {
+			return true;
+		}
+	}
+	return false;
+}
+
 /**
  * Return if the object is visible, as evaluated by depsgraph
  */
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index 9a927bd4701..728e2c93a8c 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -1160,7 +1160,7 @@ void bmesh_edit_end(BMesh *bm, BMOpTypeFlag type_flag)
 	}
 }
 
-void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
+void BM_mesh_elem_index_ensure_ex(BMesh *bm, const char htype, int elem_offset[4])
 {
 	const char htype_needed = bm->elem_index_dirty & htype;
 
@@ -1177,11 +1177,14 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
 			BMIter iter;
 			BMElem *ele;
 
-			int index;
-			BM_ITER_MESH_INDEX (ele, &iter, bm, BM_VERTS_OF_MESH, index) {
-				BM_elem_index_set(ele, index); /* set_ok */
+			int index = elem_offset ? elem_offset[0] : 0;
+			BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
+				BM_elem_index_set(ele, index++); /* set_ok */
+			}
+			if (elem_offset) {
+				elem_offset[0] = index;
 			}
-			BLI_assert(index == bm->totvert);
+			BLI_assert(elem_offset || index == bm->totvert);
 		}
 		else {
 			// printf("%s: skipping vert index calc!\n", __func__);
@@ -1193,11 +1196,14 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
 			BMIter iter;
 			BMElem *ele;
 
-			int index;
-			BM_ITER_MESH_INDEX (ele, &iter, bm, BM_EDGES_OF_MESH, index) {
-				BM_elem_index_set(ele, index); /* set_ok */
+			int index = elem_offset ? elem_offset[1] : 0;
+			BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
+				BM_elem_index_set(ele, index++); /* set_ok */
+			}
+			if (elem_offset) {
+				elem_offset[1] = index;
 			}
-			BLI_assert(index == bm->totedge);
+			BLI_assert(elem_offset || index == bm->totedge);
 		}
 		else {
 			// printf("%s: skipping edge index calc!\n", __func__);
@@ -1212,12 +1218,12 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
 			const bool update_face = (htype & BM_FACE) && (bm->elem_index_dirty & BM_FACE);
 			const bool update_loop = (htype & BM_LOOP) && (bm->elem_index_dirty & BM_LOOP);
 
-			int index;
-			int index_loop = 0;
+			int index_loop = elem_offset ? elem_offset[2] : 0;
+			int index = elem_offset ? elem_offset[3] : 0;
 
-			BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, index) {
+			BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
 				if (update_face) {
-					BM_elem_index_set(ele, index); /* set_ok */
+					BM_elem_index_set(ele, index++); /* set_ok */
 				}
 
 				if (update_loop) {
@@ -1230,9 +1236,14 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
 				}
 			}
 
-			BLI_assert(index == bm->totface);
+			if (elem_offset) {
+				elem_offset[2] = index_loop;
+				elem_offset[3] = index;
+			}
+
+			BLI_assert(elem_offset || !update_face || index == bm->totface);
 			if (update_loop) {
-				BLI_assert(index_loop == bm->totloop);
+	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list