[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