Commit: 304253bb64e15c212b3397eaf29672febcafb2f7
Author: Julian Eisel
Date:   Wed Jul 13 20:50:12 2016 +0200
Branches: soc-2016-layer_manager
https://developer.blender.org/rB304253bb64e15c212b3397eaf29672febcafb2f7

Add/use iterator for visible bases

It's basically used in all occurences in which BKE_BASES_ITER_START was used 
with additional base visibility checks. These places now also check for layer 
visibility.

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

M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/intern/object.c
M       source/blender/editors/animation/anim_filter.c
M       source/blender/editors/screen/screen_context.c
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/space_view3d/view3d_edit.c
M       source/blender/editors/space_view3d/view3d_select.c
M       source/blender/editors/space_view3d/view3d_view.c
M       source/blender/editors/transform/transform_conversions.c
M       source/blender/editors/transform/transform_orientations.c
M       source/blender/editors/transform/transform_snap_object.c
M       source/blender/editors/uvedit/uvedit_draw.c
M       source/blender/render/intern/source/envmap.c

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

diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index 0a76294..82ac8d7 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -277,20 +277,30 @@ bool BKE_object_modifier_update_subframe(struct Scene 
*scene, struct Object *ob,
                Base *base_name = oblayer->bases[idx_name];
 #define BKE_OBJECTLAYER_BASES_ITER_END } (void)0
 
-/* Use this if BKE_BASES_ITER_START doesn't give enough control over variable 
names.*/
-#define BKE_BASES_ITER_START_EX(scene, layeridx_name, litem_name, 
oblayer_name, baseidx_name, base_name) \
+/* Use this if BKE_BASES_ITER_START doesn't give enough control over variable 
names.
+ * Doesn't do layer visibility-bit check, even with skip_hidden is true. */
+#define BKE_BASES_ITER_START_EX(scene, layeridx_name, litem_name, 
oblayer_name, baseidx_name, base_name, skip_hidden) \
        BKE_LAYERTREE_ITER_START(scene->object_layers, 0, layeridx_name, 
litem_name) \
        { \
-               if (litem_name->type->type == LAYER_ITEMTYPE_LAYER) { \
+               if ((litem_name->type->type == LAYER_ITEMTYPE_LAYER) && \
+                   (!skip_hidden || BKE_layeritem_is_visible(litem))) \
+               { \
                        LayerTypeObject *oblayer_name = (LayerTypeObject 
*)litem_name; \
-                       BKE_OBJECTLAYER_BASES_ITER_START(oblayer_name, 
baseidx_name, base_name)
+                       BKE_OBJECTLAYER_BASES_ITER_START(oblayer_name, 
baseidx_name, base_name) \
+                               if (skip_hidden && 
(base_name->object->restrictflag & OB_RESTRICT_VIEW)) \
+                                       continue;
 
-/* Start iterating over all bases of the scene. This is basically a wrapper 
around layer
- * tree and object layer iterator to make access a bit easier. Uses default 
variable names. */
+/* Start iterating over all bases of the scene, ignoring visibility. This is 
basically a wrapper around
+ * layer tree and object layer iterator to make access a bit easier. Uses 
default variable names. */
 #define BKE_BASES_ITER_START(scene) \
-       BKE_BASES_ITER_START_EX(scene, i, litem, oblayer, j, base)
+       BKE_BASES_ITER_START_EX(scene, i, litem, oblayer, j, base, false)
 
-/* End BKE_BASES_ITER_START or BKE_BASES_ITER_START_EX. */
+/* Version of BKE_BASES_ITER_START that skips invisible layers and
+ * invisible objects. Doesn't do layer visibility-bit check.*/
+#define BKE_BASES_ITER_VISIBLE_START(scene) \
+       BKE_BASES_ITER_START_EX(scene, i, litem, oblayer, j, base, true)
+
+/* End BKE_BASES_ITER_ */
 #define BKE_BASES_ITER_END \
                        BKE_OBJECTLAYER_BASES_ITER_END; \
                } \
diff --git a/source/blender/blenkernel/intern/object.c 
b/source/blender/blenkernel/intern/object.c
index 8767490..3322f2f 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3392,6 +3392,9 @@ LinkNode *BKE_object_relational_superset(struct Scene 
*scene, eObjectSet objectS
                        obrel_list_add(&links, ob);
                }
                else {
+                       if (objectSet == OB_SET_VISIBLE && 
!BKE_layeritem_is_visible(litem))
+                               break; /* breaks base iteration, continues with 
next layer */
+
                        if ((objectSet == OB_SET_SELECTED && 
TESTBASELIB_BGMODE(((View3D *)NULL), scene, base)) ||
                            (objectSet == OB_SET_VISIBLE  && 
BASE_EDITABLE_BGMODE(((View3D *)NULL), scene, base)))
                        {
@@ -3422,7 +3425,7 @@ LinkNode *BKE_object_relational_superset(struct Scene 
*scene, eObjectSet objectS
                                /* child relationship */
                                if (includeFilter & (OB_REL_CHILDREN | 
OB_REL_CHILDREN_RECURSIVE)) {
                                        /* FIXME O(n^2) */
-                                       BKE_BASES_ITER_START_EX(scene, k, 
local_litem, local_oblayer, l, local_base)
+                                       BKE_BASES_ITER_START_EX(scene, k, 
local_litem, local_oblayer, l, local_base, true)
                                        {
                                                if 
(BASE_EDITABLE_BGMODE(((View3D *)NULL), scene, local_base)) {
                                                        Object *child = 
local_base->object;
diff --git a/source/blender/editors/animation/anim_filter.c 
b/source/blender/editors/animation/anim_filter.c
index afdec59..381987f 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -1667,6 +1667,8 @@ static size_t animdata_filter_gpencil(bAnimContext *ac, 
ListBase *anim_data, voi
                                 *        try to add the channels)
                                 */
                                if ((filter_mode & ANIMFILTER_DATA_VISIBLE) && 
!(ads->filterflag & ADS_FILTER_INCL_HIDDEN)) {
+                                       if 
(!BKE_layeritem_is_visible(base->layer)) break; /* continue with next layer */
+
                                        /* layer visibility - we check both 
object and base, since these may not be in sync yet */
                                        if ((scene->lay & (ob->lay | 
base->lay)) == 0) continue;
                                        
diff --git a/source/blender/editors/screen/screen_context.c 
b/source/blender/editors/screen/screen_context.c
index eb73158..455e3e2 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -117,9 +117,9 @@ int ed_screen_context(const bContext *C, const char 
*member, bContextDataResult
                const unsigned int lay = context_layers(sc, scene, sa);
                int visible_objects = CTX_data_equals(member, 
"visible_objects");
 
-               BKE_BASES_ITER_START(scene)
+               BKE_BASES_ITER_VISIBLE_START(scene)
                {
-                       if (((base->object->restrictflag & OB_RESTRICT_VIEW) == 
0) && (base->lay & lay)) {
+                       if (base->lay & lay) {
                                if (visible_objects)
                                        CTX_data_id_list_add(result, 
&base->object->id);
                                else
@@ -134,15 +134,13 @@ int ed_screen_context(const bContext *C, const char 
*member, bContextDataResult
                const unsigned int lay = context_layers(sc, scene, sa);
                int selectable_objects = CTX_data_equals(member, 
"selectable_objects");
 
-               BKE_BASES_ITER_START(scene)
+               BKE_BASES_ITER_VISIBLE_START(scene)
                {
-                       if (base->lay & lay) {
-                               if ((base->object->restrictflag & 
OB_RESTRICT_VIEW) == 0 && (base->object->restrictflag & OB_RESTRICT_SELECT) == 
0) {
-                                       if (selectable_objects)
-                                               CTX_data_id_list_add(result, 
&base->object->id);
-                                       else
-                                               CTX_data_list_add(result, 
&scene->id, &RNA_ObjectBase, base);
-                               }
+                       if (base->lay & lay && (base->object->restrictflag & 
OB_RESTRICT_SELECT) == 0) {
+                               if (selectable_objects)
+                                       CTX_data_id_list_add(result, 
&base->object->id);
+                               else
+                                       CTX_data_list_add(result, &scene->id, 
&RNA_ObjectBase, base);
                        }
                }
                BKE_BASES_ITER_END;
@@ -170,16 +168,14 @@ int ed_screen_context(const bContext *C, const char 
*member, bContextDataResult
                const unsigned int lay = context_layers(sc, scene, sa);
                int selected_editable_objects = CTX_data_equals(member, 
"selected_editable_objects");
 
-               BKE_BASES_ITER_START(scene)
+               BKE_BASES_ITER_VISIBLE_START(scene)
                {
                        if ((base->flag & SELECT) && (base->lay & lay)) {
-                               if ((base->object->restrictflag & 
OB_RESTRICT_VIEW) == 0) {
-                                       if (0 == 
BKE_object_is_libdata(base->object)) {
-                                               if (selected_editable_objects)
-                                                       
CTX_data_id_list_add(result, &base->object->id);
-                                               else
-                                                       
CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base);
-                                       }
+                               if (0 == BKE_object_is_libdata(base->object)) {
+                                       if (selected_editable_objects)
+                                               CTX_data_id_list_add(result, 
&base->object->id);
+                                       else
+                                               CTX_data_list_add(result, 
&scene->id, &RNA_ObjectBase, base);
                                }
                        }
                }
@@ -192,9 +188,9 @@ int ed_screen_context(const bContext *C, const char 
*member, bContextDataResult
                int editable_objects = CTX_data_equals(member, 
"editable_objects");
 
                /* Visible + Editable, but not necessarily selected */
-               BKE_BASES_ITER_START(scene)
+               BKE_BASES_ITER_VISIBLE_START(scene)
                {
-                       if (((base->object->restrictflag & OB_RESTRICT_VIEW) == 
0) && (base->lay & lay)) {
+                       if (base->lay & lay) {
                                if (0 == BKE_object_is_libdata(base->object)) {
                                        if (editable_objects)
                                                CTX_data_id_list_add(result, 
&base->object->id);
diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index f90ebda..a42c4b2 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -1291,15 +1291,13 @@ static int view3d_context(const bContext *C, const char 
*member, bContextDataRes
                const unsigned int lay = v3d ? v3d->lay : scene->lay;
                const bool selected_objects = CTX_data_equals(member, 
"selected_objects");
 
-               BKE_BASES_ITER_START(scene)
+               BKE_BASES_ITER_VISIBLE_START(scene)
                {
                        if ((base->flag & SELECT) && (base->lay & lay)) {
-                               if ((base->object->restrictflag & 
OB_RESTRICT_VIEW) == 0) {
-                                       if (selected_objects)
-                                               CTX_data_id_list_add(result, 
&base->object->id);
-                                       else
-                                               CTX_data_list_add(result, 
&scene->id, &RNA_ObjectBase, base);
-                               }
+                               if (selected_objects)
+                                       CTX_data_id_list_add(result, 
&base->object->id);
+                               else
+                                       CTX_data_list_add(result, &scene->id, 
&RNA_ObjectBase, base);
                        }
                }
                BKE_BASES_ITER_END;
@@ -1312,16 +1310,14 @@ static int view3d_context(const bContext *C, const char 
*member, bContextDataRes
                const unsigned int lay = v3d ? v3d->lay : scene->lay;
                const bool selected_editable_objects = CTX_data_equals(member, 
"selected_editable_objects");
 
-               BKE_BASES_ITER_START(scene)
+               BKE_BASES_ITER_VISIBLE_START(scene)
                {
                        if ((base->flag & SELECT) && (base->lay & lay)) {
-                               if ((base->object->restrictflag & 
OB_RESTRICT_VIEW) == 0) {
-                                       if (0 == 
BKE_object_is_libdata(base->object)) {
-                                               if (selected_editable_objects)
-                                                       
CTX_data_id_list_add(result, &base->object->id);
-                                               else
-                                                       
CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base);
-                                       }
+                               if (0 == BKE_object_is_libdata(base->object)) {
+                                       if (selected_editable_objects)
+                                               CTX_data_id_list_add(result, 
&base->object->id);
+                                       else
+                                               CTX_data_list_add(result, 
&scene->id, &RNA_ObjectBase, base);
                                }
                        }
                }
@@ -1335,15 +1331,13 @@ static int view3d_context(const bContext *C, const char 
*member, bContextDataRes
                const unsigned int lay = v3d ? v3d->lay : scene->lay;
                const bool visible_objects = CTX_data_equals(member, 
"visible_objects");
 
-               BKE_BASES_ITER_START(scene)
+               BKE_BASES_ITER_VISIBLE_START(scene)
                {
                        if (base->lay & lay) {
-                               if ((base->object->restrictflag & 
OB_RESTRICT_VIEW) == 0) {
-                                       if (visible_objects)
-                                               CTX_data_id_list_add(result, 
&base->object->id);
-                                       else
-                                               CTX_data_list_add(result, 
&scene->id, &RNA_ObjectBase, base);
-                               }
+                               if (visible_objects)
+                                       CTX_data_id_list_add(r

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