[Bf-blender-cvs] [523c931] temp_localview_split: Add more checks for new local view

Julian Eisel noreply at git.blender.org
Thu Aug 4 04:01:18 CEST 2016


Commit: 523c9315937554782224007b0799ddbda1ac70d8
Author: Julian Eisel
Date:   Thu Aug 4 04:00:20 2016 +0200
Branches: temp_localview_split
https://developer.blender.org/rB523c9315937554782224007b0799ddbda1ac70d8

Add more checks for new local view

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

M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/BKE_utildefines.h
M	source/blender/blenkernel/intern/screen.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/gpencil/gpencil_convert.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/render/render_internal.c
M	source/blender/editors/screen/screen_context.c
M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/render/intern/source/envmap.c

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

diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 14e978b..35cb8c9 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -292,13 +292,11 @@ struct ScrArea *BKE_screen_find_area_from_space(struct bScreen *sc, struct Space
 struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype, const short min);
 struct ScrArea *BKE_screen_find_area_xy(struct bScreen *sc, const int spacetype, int x, int y);
 
-unsigned int BKE_screen_view3d_layer_active_ex(
-        const struct View3D *v3d, const struct Scene *scene, bool use_localvd) ATTR_NONNULL(2);
-unsigned int BKE_screen_view3d_layer_active(
-        const struct View3D *v3d, const struct Scene *scene) ATTR_NONNULL(2);
-
+unsigned int BKE_screen_view3d_layer_active(const struct View3D *v3d, const struct Scene *scene) ATTR_NONNULL(2);
 unsigned int BKE_screen_view3d_layer_all(const struct bScreen *sc) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
 
+struct LocalViewInfo BKE_screen_view3d_localview_all(const struct bScreen *sc) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
+
 void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene);
 void BKE_screen_view3d_scene_sync(struct bScreen *sc);
 void BKE_screen_view3d_main_sync(ListBase *screen_lb, struct Scene *scene);
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index 64605a6..a6587d7 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -51,6 +51,10 @@ extern "C" {
 #define BKE_LOCALVIEW_IS_OBJECT_VISIBLE(v3d, ob) \
 	(((v3d)->localviewd == NULL) || BKE_LOCALVIEW_INFO_CMP((v3d)->localviewd->info, (ob)->localview))
 
+/* Check if info defines a visible local view */
+#define BKE_LOCALVIEW_IS_VALID(info) \
+	((info).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) { \
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 5166123..cc33ac0 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -508,7 +508,7 @@ ScrArea *BKE_screen_find_area_xy(bScreen *sc, const int spacetype, int x, int y)
 /**
  * Utility function to get the active layer to use when adding new objects.
  */
-unsigned int BKE_screen_view3d_layer_active_ex(const View3D *v3d, const Scene *scene, bool use_localvd)
+unsigned int BKE_screen_view3d_layer_active(const View3D *v3d, const Scene *scene)
 {
 	unsigned int lay;
 	if ((v3d == NULL) || (v3d->scenelock && !v3d->localviewd)) {
@@ -518,18 +518,8 @@ unsigned int BKE_screen_view3d_layer_active_ex(const View3D *v3d, const Scene *s
 		lay = v3d->layact;
 	}
 
-	if (use_localvd) {
-		if (v3d && v3d->localviewd) {
-			lay |= v3d->lay;
-		}
-	}
-
 	return lay;
 }
-unsigned int BKE_screen_view3d_layer_active(const struct View3D *v3d, const struct Scene *scene)
-{
-	return BKE_screen_view3d_layer_active_ex(v3d, scene, true);
-}
 
 /**
  * Accumulate all visible layers on this screen.
@@ -548,6 +538,22 @@ unsigned int BKE_screen_view3d_layer_all(const bScreen *sc)
 	return lay;
 }
 
+LocalViewInfo BKE_screen_view3d_localview_all(const bScreen *sc)
+{
+	LocalViewInfo views = {0};
+
+	for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) {
+		if (sa->spacetype == SPACE_VIEW3D) {
+			View3D *v3d = sa->spacedata.first;
+			if (v3d->localviewd) {
+				views.viewbits |= v3d->localviewd->info.viewbits;
+			}
+		}
+	}
+
+	return views;
+}
+
 void BKE_screen_view3d_sync(View3D *v3d, struct Scene *scene)
 {
 	int bit;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 38db067..bbcf1c6 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -144,6 +144,7 @@
 #include "BKE_sequencer.h"
 #include "BKE_outliner_treehash.h"
 #include "BKE_sound.h"
+#include "BKE_utildefines.h"
 
 
 #include "NOD_common.h"
@@ -9665,6 +9666,12 @@ static void give_base_to_objects(Main *mainvar, Scene *scene, View3D *v3d, Libra
 				if (active_lay) {
 					ob->lay = active_lay;
 				}
+				/* Add to localview (only if FILE_ACTIVELAY, this is how it was
+				 * done when local view was using Object.lay bitfield) */
+				if (v3d && (flag & FILE_ACTIVELAY)) {
+					/* macro checks if v3d is in local view */
+					BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, ob);
+				}
 
 				base->lay = ob->lay;
 				base->object = ob;
@@ -9698,6 +9705,10 @@ static void give_base_to_groups(
 			ob = BKE_object_add_only_object(mainvar, OB_EMPTY, group->id.name + 2);
 			ob->type = OB_EMPTY;
 			ob->lay = active_lay;
+			if (v3d) {
+				/* Add to localview (macro checks if v3d is in local view) */
+				BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, ob);
+			}
 
 			/* assign the base */
 			base = BKE_scene_base_add(scene, ob);
@@ -9795,6 +9806,12 @@ static void link_object_postprocess(ID *id, Scene *scene, View3D *v3d, const sho
 		/* link at active layer (view3d if available in context, else scene one */
 		if (flag & FILE_ACTIVELAY) {
 			ob->lay = BKE_screen_view3d_layer_active(v3d, scene);
+			/* Add to localview (only if FILE_ACTIVELAY, this is how it was
+			 * done when local view was using Object.lay bitfield) */
+			if (v3d) {
+				/* macro checks if v3d is in local view */
+				BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, ob);
+			}
 		}
 
 		ob->mode = OB_MODE_OBJECT;
diff --git a/source/blender/editors/gpencil/gpencil_convert.c b/source/blender/editors/gpencil/gpencil_convert.c
index c47985e..8fc71ef 100644
--- a/source/blender/editors/gpencil/gpencil_convert.c
+++ b/source/blender/editors/gpencil/gpencil_convert.c
@@ -68,6 +68,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_tracking.h"
+#include "BKE_utildefines.h"
 
 #include "UI_interface.h"
 
@@ -1199,6 +1200,10 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG
 	/* set the layer and select */
 	base_new->lay  = ob->lay  = base_orig ? base_orig->lay : BKE_screen_view3d_layer_active(v3d, scene);
 	base_new->flag = ob->flag = base_new->flag | SELECT;
+	if (v3d) {
+		/* Add to localview (macro checks if v3d is in local view) */
+		BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, ob);
+	}
 }
 
 /* --- */
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 5dae51a..3a13b00 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -336,7 +336,7 @@ bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, const char view
 		}
 		else {
 			Scene *scene = CTX_data_scene(C);
-			*layer = BKE_screen_view3d_layer_active_ex(v3d, scene, false);
+			*layer = BKE_screen_view3d_layer_active(v3d, scene);
 			for (a = 0; a < 20; a++) {
 				layer_values[a] = (*layer & (1 << a)) != 0;
 			}
@@ -2261,6 +2261,10 @@ static int add_named_exec(bContext *C, wmOperator *op)
 
 	basen->lay = basen->object->lay = BKE_screen_view3d_layer_active(v3d, scene);
 	basen->object->restrictflag &= ~OB_RESTRICT_VIEW;
+	if (v3d) {
+		/* Add to localview (macro checks if v3d is in local view) */
+		BKE_LOCALVIEW_OBJECT_ASSIGN(v3d, basen->object);
+	}
 
 	if (event) {
 		ARegion *ar = CTX_wm_region(C);
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index ef980ce..1bb5270 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -65,6 +65,7 @@
 #include "BKE_sequencer.h"
 #include "BKE_screen.h"
 #include "BKE_scene.h"
+#include "BKE_utildefines.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -293,7 +294,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
 	View3D *v3d = CTX_wm_view3d(C);
 	Main *mainp = CTX_data_main(C);
 	LocalViewInfo *localview = (v3d && v3d->localviewd) ? &v3d->localviewd->info : NULL;
-	unsigned int lay_override;
+	const unsigned int lay_override = (v3d && v3d->lay != scene->lay) ? v3d->lay : 0;
 	const bool is_animation = RNA_boolean_get(op->ptr, "animation");
 	const bool is_write_still = RNA_boolean_get(op->ptr, "write_still");
 	struct Object *camera_override = v3d ? V3D_CAMERA_LOCAL(v3d) : NULL;
@@ -307,7 +308,6 @@ static int screen_render_exec(bContext *C, wmOperator *op)
 	}
 
 	re = RE_NewRender(scene->id.name);
-	lay_override = (v3d && v3d->lay != scene->lay) ? v3d->lay : 0;
 
 	G.is_break = false;
 	RE_test_break_cb(re, NULL, render_break);
@@ -782,7 +782,7 @@ static void screen_render_cancel(bContext *C, wmOperator *op)
 	WM_jobs_kill_type(wm, scene, WM_JOB_TYPE_RENDER);
 }
 
-static void clean_viewport_memory(Main *bmain, Scene *scene, int renderlay)
+static void clean_viewport_memory(Main *bmain, Scene *scene, LocalViewInfo *localview, int renderlay)
 {
 	Object *object;
 	Scene *sce_iter;
@@ -793,7 +793,7 @@ static void clean_viewport_memory(Main *bmain, Scene *scene, int renderlay)
 	}
 
 	for (SETLOOPER(scene, sce_iter, base)) {
-		if ((base->lay & renderlay) == 0) {
+		if ((base->lay & renderlay) == 0 || BKE_LOCALVIEW_INFO_CMP(*localview, base->object->localview) == 0) {
 			continue;
 		}
 		if (RE_allow_render_generic_object(base->object)) {
@@ -945,7 +945,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even
 		rj->interface_locked = true;
 
 		/* Clean memory used by viewport? */
-		clean_viewport_memory(rj->main, scene, renderlay);
+		clean_viewport_memory(rj->main, scene, &v3d->localviewd->info, renderlay);
 	}
 
 	/* setup job */
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index f61ad34..1dcd569 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -49,6 +49,7 @@
 #include "BKE_gpencil.h"
 #include "BKE_screen.h"
 #include "BKE_sequencer.h"
+#include "BKE_utildefines.h"
 
 #include "RNA_access.h"
 
@@ -72,6 +73,15 @@ static unsigned int context_layers(bScreen *sc, Scene *scene, ScrArea *sa_ctx)
 	return scene->lay;
 }
 
+static LocalViewInfo context_localviews(bScreen *sc, ScrArea

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list