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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to