Commit: ecee478ef86b634c12fa88a901ee8cc9ef73ae25
Author: Julian Eisel
Date:   Wed Jul 27 17:28:50 2016 +0200
Branches: temp_localview_split
https://developer.blender.org/rBecee478ef86b634c12fa88a901ee8cc9ef73ae25

Start using separate bitfield for local view visibility

Uses BKE macros to centralize things a bit.

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

M       source/blender/blenkernel/BKE_utildefines.h
M       source/blender/editors/object/object_add.c
M       source/blender/editors/object/object_edit.c
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/makesdna/DNA_object_types.h
M       source/blender/makesdna/DNA_view3d_types.h

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

diff --git a/source/blender/blenkernel/BKE_utildefines.h 
b/source/blender/blenkernel/BKE_utildefines.h
index 7c1e0e9..7ef515d 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -38,6 +38,23 @@ extern "C" {
        else      (value) &= ~flag;             \
 } (void)0
 
+/**
+ * Local view utility macros.
+ *
+ * Even though it's possible to access LocalView DNA structs directly,
+ * please only access using these macros (or extend it if needed).
+ */
+
+/* visibility check */
+#define BKE_LOCALVIEW_IS_OBJECT_VISIBLE(v3d, ob) \
+       (((v3d)->localviewd == NULL) || (((v3d)->localviewd->viewbits & 
(ob)->localview.viewbits) != 0))
+
+/* Adjust local view info of ob to be visible if v3d is in local view */
+#define BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, ob) \
+       if ((v3d)->localviewd) { \
+               (ob)->localview.viewbits = (v3d)->localviewd->viewbits; \
+       } (void)0
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/editors/object/object_add.c 
b/source/blender/editors/object/object_add.c
index 98a69a2..5dae51a 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -88,6 +88,7 @@
 #include "BKE_screen.h"
 #include "BKE_speaker.h"
 #include "BKE_texture.h"
+#include "BKE_utildefines.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -341,11 +342,6 @@ bool ED_object_add_generic_get_opts(bContext *C, 
wmOperator *op, const char view
                        }
                        RNA_property_boolean_set_array(op->ptr, prop, 
layer_values);
                }
-
-               /* in local view we additionally add local view layers,
-                * not part of operator properties */
-               if (v3d && v3d->localviewd)
-                       *layer |= v3d->lay;
        }
 
        /* Location! */
@@ -407,6 +403,7 @@ Object *ED_object_add_type(
 {
        Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
+       View3D *v3d = CTX_wm_view3d(C);
        Object *ob;
 
        /* for as long scene has editmode... */
@@ -419,6 +416,11 @@ Object *ED_object_add_type(
        /* editor level activate, notifiers */
        ED_base_object_activate(C, BASACT);
 
+       /* Add to local view if needed */
+       if (v3d) {
+               BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, ob);
+       }
+
        /* more editor stuff */
        ED_object_base_init_transform(C, BASACT, loc, rot);
 
diff --git a/source/blender/editors/object/object_edit.c 
b/source/blender/editors/object/object_edit.c
index 3dc7d8e..d884bbb 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -82,6 +82,7 @@
 #include "BKE_modifier.h"
 #include "BKE_editmesh.h"
 #include "BKE_report.h"
+#include "BKE_utildefines.h"
 
 #include "ED_armature.h"
 #include "ED_curve.h"
@@ -143,12 +144,15 @@ static int object_hide_view_clear_exec(bContext *C, 
wmOperator *UNUSED(op))
        
        /* XXX need a context loop to handle such cases */
        for (base = FIRSTBASE; base; base = base->next) {
-               if ((base->lay & v3d->lay) && base->object->restrictflag & 
OB_RESTRICT_VIEW) {
+               if ((base->lay & v3d->lay) &&
+                   BKE_LOCALVIEW_IS_OBJECT_VISIBLE(v3d, base->object) &&
+                   (base->object->restrictflag & OB_RESTRICT_VIEW))
+               {
                        if (!(base->object->restrictflag & OB_RESTRICT_SELECT)) 
{
                                base->flag |= SELECT;
                        }
                        base->object->flag = base->flag;
-                       base->object->restrictflag &= ~OB_RESTRICT_VIEW; 
+                       base->object->restrictflag &= ~OB_RESTRICT_VIEW;
                        changed = true;
                }
        }
@@ -478,9 +482,17 @@ void ED_object_editmode_enter(bContext *C, int flag)
        if ((flag & EM_IGNORE_LAYER) == 0) {
                base = CTX_data_active_base(C); /* active layer checked here 
for view3d */
 
-               if (base == NULL) return;
-               else if (v3d && (base->lay & v3d->lay) == 0) return;
-               else if (!v3d && (base->lay & scene->lay) == 0) return;
+               if (base == NULL) {
+                       return;
+               }
+               else if (v3d) {
+                       if ((base->lay & v3d->lay) == 0 || 
!BKE_LOCALVIEW_IS_OBJECT_VISIBLE(v3d, base->object)) {
+                               return;
+                       }
+               }
+               else if ((base->lay & scene->lay) == 0) {
+                       return;
+               }
        }
        else {
                base = scene->basact;
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index 89cb704..37d8faf 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -67,6 +67,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_unit.h"
+#include "BKE_utildefines.h"
 #include "BKE_movieclip.h"
 
 #include "RE_engine.h"
@@ -2829,8 +2830,7 @@ static void view3d_draw_objects(
                for (base = scene->base.first; base; base = base->next) {
                        lay_used |= base->lay;
 
-                       if (v3d->lay & base->lay) {
-
+                       if (v3d->lay & base->lay && 
BKE_LOCALVIEW_IS_OBJECT_VISIBLE(v3d, base->object)) {
                                /* dupli drawing */
                                if (base->object->transflag & OB_DUPLI) {
                                        draw_dupli_objects(scene, ar, v3d, 
base);
diff --git a/source/blender/makesdna/DNA_object_types.h 
b/source/blender/makesdna/DNA_object_types.h
index 26424b0..a1a8215 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -37,6 +37,7 @@
 #include "DNA_listBase.h"
 #include "DNA_ID.h"
 #include "DNA_action_types.h" /* bAnimVizSettings */
+#include "DNA_view3d_types.h" /* LocalViewInfo */
 
 #ifdef __cplusplus
 extern "C" {
@@ -112,10 +113,6 @@ typedef struct LodLevel {
        int obhysteresis;
 } LodLevel;
 
-typedef struct LocalViewInfo {
-       unsigned int viewbits; /* 32 bits to store up to 32 views (compared to 
LocalViewAreaData.viewbits) */
-} LocalViewInfo;
-
 typedef struct Object {
        ID id;
        struct AnimData *adt;           /* animation data (must be immediately 
after id for utilities to use it) */ 
diff --git a/source/blender/makesdna/DNA_view3d_types.h 
b/source/blender/makesdna/DNA_view3d_types.h
index c948fd4..e8c36c4 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -109,6 +109,13 @@ typedef struct LocalViewRegionData {
        float ofs[3];
 } LocalViewRegionData;
 
+/**
+ * An element that can be in local view has this (currently objects only).
+ */
+typedef struct LocalViewInfo {
+       unsigned int viewbits; /* 32 bits to store up to 32 views (compared to 
LocalViewAreaData.viewbits) */
+} LocalViewInfo;
+
 /* ********************************* */
 
 typedef struct RegionView3D {

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

Reply via email to