[Bf-blender-cvs] [ecee478] temp_localview_split: Start using separate bitfield for local view visibility
Julian Eisel
noreply at git.blender.org
Wed Jul 27 18:09:52 CEST 2016
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 {
More information about the Bf-blender-cvs
mailing list