Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-03-13 02:41:12 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-03-13 02:52:25 +0300
commitaf0ab15e1dd84aadb32ee8d7a836a08fe6251474 (patch)
tree4eabb3847dc1a28e68d052837d74fa5d59bc177c /source/blender/makesrna/intern/rna_object_api.c
parent3ea7a5d8699c74ddf4ea7b359022145e44f62bc2 (diff)
Fix T62436: New added Torus won't appear in Local View
Add Object.local_view_get/set Alternate fix which supports removing from local view & checking if an object is in local view. Also avoids redundant refresh. Matches 2.7x Object.layer_local_view capabilities more closely, without exposing the flag directly.
Diffstat (limited to 'source/blender/makesrna/intern/rna_object_api.c')
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index eeeac010261..c8e84c07b5c 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -74,6 +74,7 @@ static const EnumPropertyItem space_items[] = {
#include "BKE_report.h"
#include "ED_object.h"
+#include "ED_screen.h"
#include "DNA_curve_types.h"
#include "DNA_mesh_types.h"
@@ -216,6 +217,61 @@ static bool rna_Object_indirect_only_get(Object *ob, bContext *C, ReportList *re
return ((base->flag & BASE_INDIRECT_ONLY) != 0);
}
+static Base *rna_Object_local_view_property_helper(bScreen *sc, View3D *v3d, Object *ob, ReportList *reports, Scene **r_scene)
+{
+ if (v3d->localvd == NULL) {
+ BKE_report(reports, RPT_ERROR, "Viewport not in local view");
+ return NULL;
+ }
+
+ wmWindow *win = ED_screen_window_find(sc, G_MAIN->wm.first);
+ ViewLayer *view_layer = WM_window_get_active_view_layer(win);
+ Base *base = BKE_view_layer_base_find(view_layer, ob);
+ if (base == NULL) {
+ BKE_reportf(reports,
+ RPT_WARNING,
+ "Object %s not in view layer %s",
+ ob->id.name + 2,
+ view_layer->name);
+
+ }
+ if (r_scene) {
+ *r_scene = win->scene;
+ }
+ return base;
+}
+
+static bool rna_Object_local_view_get(Object *ob, ReportList *reports, PointerRNA *v3d_ptr)
+{
+ bScreen *sc = v3d_ptr->id.data;
+ View3D *v3d = v3d_ptr->data;
+ Base *base = rna_Object_local_view_property_helper(sc, v3d, ob, reports, NULL);
+ if (base == NULL) {
+ return false; /* Error reported. */
+ }
+ return (base->local_view_bits & v3d->local_view_uuid) != 0;
+}
+
+static void rna_Object_local_view_set(Object *ob, ReportList *reports, PointerRNA *v3d_ptr, bool state)
+{
+ bScreen *sc = v3d_ptr->id.data;
+ View3D *v3d = v3d_ptr->data;
+ Scene *scene;
+ Base *base = rna_Object_local_view_property_helper(sc, v3d, ob, reports, &scene);
+ if (base == NULL) {
+ return; /* Error reported. */
+ }
+ const short local_view_bits_prev = base->local_view_bits;
+ SET_FLAG_FROM_TEST(base->local_view_bits, state, v3d->local_view_uuid);
+ if (local_view_bits_prev != base->local_view_bits) {
+ DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
+ ScrArea *sa = ED_screen_area_find_with_spacedata(sc, (SpaceLink *)v3d, true);
+ if (sa) {
+ ED_area_tag_redraw(sa);
+ }
+ }
+}
+
/* Convert a given matrix from a space to another (using the object and/or a bone as reference). */
static void rna_Object_mat_convert_space(Object *ob, ReportList *reports, bPoseChannel *pchan,
float *mat, float *mat_ret, int from, int to)
@@ -611,6 +667,23 @@ void RNA_api_object(StructRNA *srna)
parm = RNA_def_boolean(func, "result", 0, "", "Object indirect only");
RNA_def_function_return(func, parm);
+ /* Local View */
+ func = RNA_def_function(srna, "local_view_get", "rna_Object_local_view_get");
+ RNA_def_function_ui_description(func, "Get the local view state for this object");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm = RNA_def_pointer(func, "viewport", "SpaceView3D", "", "Viewport in local view");
+ RNA_def_parameter_flags(parm, 0, PARM_RNAPTR | PARM_REQUIRED);
+ parm = RNA_def_boolean(func, "result", 0, "", "Object local view state");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "local_view_set", "rna_Object_local_view_set");
+ RNA_def_function_ui_description(func, "Set the local view state for this object");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm = RNA_def_pointer(func, "viewport", "SpaceView3D", "", "Viewport in local view");
+ RNA_def_parameter_flags(parm, 0, PARM_RNAPTR | PARM_REQUIRED);
+ parm = RNA_def_boolean(func, "state", 0, "", "Local view state to define");
+ RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
+
/* Matrix space conversion */
func = RNA_def_function(srna, "convert_space", "rna_Object_mat_convert_space");
RNA_def_function_ui_description(func, "Convert (transform) the given matrix from one space to another");