Commit: 2b8705fa001fed6da1036b56a5fa6652a72df23c
Author: Julian Eisel
Date:   Thu Jul 28 17:18:02 2016 +0200
Branches: temp_localview_split
https://developer.blender.org/rB2b8705fa001fed6da1036b56a5fa6652a72df23c

Prepare local view OP to work without layer bitfields

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

M       source/blender/blenkernel/BKE_utildefines.h
M       source/blender/editors/space_view3d/view3d_view.c

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

diff --git a/source/blender/blenkernel/BKE_utildefines.h 
b/source/blender/blenkernel/BKE_utildefines.h
index 2a4c9f6..64605a6 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -45,9 +45,11 @@ extern "C" {
  * please only access using these macros (or extend it if needed).
  */
 
-/* visibility check */
+/* visibility checks */
+#define BKE_LOCALVIEW_INFO_CMP(a, b) \
+       ((a).viewbits & (b).viewbits)
 #define BKE_LOCALVIEW_IS_OBJECT_VISIBLE(v3d, ob) \
-       (((v3d)->localviewd == NULL) || (((v3d)->localviewd->info.viewbits & 
(ob)->localview.viewbits) != 0))
+       (((v3d)->localviewd == NULL) || 
BKE_LOCALVIEW_INFO_CMP((v3d)->localviewd->info, (ob)->localview))
 
 /* Adjust local view info of ob to be visible if v3d is in local view */
 #define BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, ob) \
diff --git a/source/blender/editors/space_view3d/view3d_view.c 
b/source/blender/editors/space_view3d/view3d_view.c
index 2ff8504..1e12c12 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -50,6 +50,7 @@
 #include "BKE_report.h"
 #include "BKE_scene.h"
 #include "BKE_screen.h"
+#include "BKE_utildefines.h"
 
 #include "BIF_gl.h"
 #include "BIF_glutil.h"
@@ -1285,7 +1286,6 @@ static bool view3d_localview_init(
         ReportList *reports)
 {
        View3D *v3d = sa->spacedata.first;
-       Base *base;
        float min[3], max[3], box[3], mid[3];
        float size = 0.0f;
        unsigned int locallay;
@@ -1306,18 +1306,14 @@ static bool view3d_localview_init(
                        BKE_object_minmax(scene->obedit, min, max, false);
                        
                        ok = true;
-               
-                       BASACT->lay |= locallay;
-                       scene->obedit->lay = BASACT->lay;
+
                        BASACT->object->localview.viewbits |= locallay;
                        scene->obedit->localview = BASACT->object->localview;
                }
                else {
-                       for (base = FIRSTBASE; base; base = base->next) {
+                       for (Base *base = FIRSTBASE; base; base = base->next) {
                                if (TESTBASE(v3d, base)) {
                                        BKE_object_minmax(base->object, min, 
max, false);
-                                       base->lay |= locallay;
-                                       base->object->lay = base->lay;
                                        base->object->localview.viewbits |= 
locallay;
                                        ok = true;
                                }
@@ -1329,8 +1325,6 @@ static bool view3d_localview_init(
        }
        
        if (ok == true) {
-               ARegion *ar;
-
                v3d->localviewd = MEM_callocN(sizeof(*v3d->localviewd), 
"localview area data");
                view3d_localview_area_data_init(v3d->localviewd, v3d);
 
@@ -1338,7 +1332,7 @@ static bool view3d_localview_init(
 
                copy_v3_v3(v3d->cursor, mid);
 
-               for (ar = sa->regionbase.first; ar; ar = ar->next) {
+               for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) {
                        if (ar->regiontype == RGN_TYPE_WINDOW) {
                                RegionView3D *rv3d = ar->regiondata;
                                bool ok_dist = true;
@@ -1379,20 +1373,20 @@ static bool view3d_localview_init(
                                                .dist = ok_dist ? &dist_new : 
NULL, .lens = &v3d->lens});
                        }
                }
-               
+
                v3d->localviewd->info.viewbits = locallay;
-               v3d->lay = locallay;
        }
        else {
                /* clear flags */ 
-               for (base = FIRSTBASE; base; base = base->next) {
+               for (Base *base = FIRSTBASE; base; base = base->next) {
                        Object *ob = base->object;
                        if (ob->localview.viewbits & locallay) {
-                               ob->localview.viewbits -= locallay;
+                               ob->localview.viewbits &= ~locallay;
                                if (ob != scene->obedit) {
                                        base->flag |= SELECT;
                                }
                        }
+                       /* local view used to work with object/base bitfields, 
check updates didn't break anything */
                        BLI_assert(ob->lay > 0 && ob->lay == base->lay);
                }
        }
@@ -1453,29 +1447,25 @@ static bool view3d_localview_exit(
         const int smooth_viewtx)
 {
        View3D *v3d = sa->spacedata.first;
-       struct Base *base;
-       unsigned int locallay;
+       LocalViewInfo localview = v3d->localviewd->info; /* store for use after 
v3d local view data is reset */
 
        BLI_assert(sa->spacetype == SPACE_VIEW3D && v3d->localviewd);
 
-       locallay = v3d->lay & 0xFF000000;
-
        view3d_localviewdata_restore(wm, win, bmain, scene, sa, smooth_viewtx);
 
-       /* for when in other window the layers have changed */
-       if (v3d->scenelock) v3d->lay = scene->lay;
-
-       for (base = FIRSTBASE; base; base = base->next) {
-               if (base->lay & locallay) {
-                       base->lay -= locallay;
-                       if (base->lay == 0) base->lay = v3d->layact;
+       for (Base *base = FIRSTBASE; base; base = base->next) {
+               if (BKE_LOCALVIEW_INFO_CMP(localview, base->object->localview)) 
{
+                       base->object->localview.viewbits &= ~localview.viewbits;
                        if (base->object != scene->obedit) {
                                base->flag |= SELECT;
                                base->object->flag |= SELECT;
                        }
-                       base->object->lay = base->lay;
                }
+               /* local view used to work with object/base bitfields, check 
updates didn't break anything */
+               BLI_assert(base->lay > 0 && base->lay == base->object->lay);
        }
+       BLI_assert(!v3d->scenelock || v3d->lay == scene->lay);
+
        DAG_on_visible_update(bmain, false);
 
        return true;

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

Reply via email to