[Bf-blender-cvs] [61ac773] workspaces: Find correct scene from screen in RNA callbacks

Julian Eisel noreply at git.blender.org
Wed Dec 21 03:53:12 CET 2016


Commit: 61ac773ac1d50e4fd3294534b45c278e0f592de7
Author: Julian Eisel
Date:   Wed Dec 21 03:26:20 2016 +0100
Branches: workspaces
https://developer.blender.org/rB61ac773ac1d50e4fd3294534b45c278e0f592de7

Find correct scene from screen in RNA callbacks

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

M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/screen_edit.c
M	source/blender/makesrna/intern/rna_space.c
M	source/blender/makesrna/intern/rna_space_api.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index b38a3b7..eb80340 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -119,6 +119,7 @@ void    ED_screen_full_restore(struct bContext *C, ScrArea *sa);
 struct ScrArea *ED_screen_state_toggle(struct bContext *C, struct wmWindow *win, struct ScrArea *sa, const short state);
 void    ED_screens_header_tools_menu_create(struct bContext *C, struct uiLayout *layout, void *arg);
 bool    ED_screen_stereo3d_required(const struct bScreen *screen, const struct Scene *scene);
+Scene   *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm);
 void    ED_screen_preview_render(const struct bScreen *screen, int size_x, int size_y, unsigned int *r_rect) ATTR_NONNULL();
 
 /* workspaces */
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index ef5eecc..dadd808 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1841,3 +1841,19 @@ bool ED_screen_stereo3d_required(const bScreen *screen, const Scene *scene)
 
 	return false;
 }
+
+/**
+ * Find the scene displayed in \a screen.
+ * \note Assumes \a screen to be visible/active!
+ */
+Scene *ED_screen_scene_find(const bScreen *screen, const wmWindowManager *wm)
+{
+	for (wmWindow *win = wm->windows.first; win; win = win->next) {
+		if (WM_window_get_active_screen(win) == screen) {
+			return WM_window_get_active_scene(win);
+		}
+	}
+
+	BLI_assert(0);
+	return NULL;
+}
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 7002518..30d1fe5 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -252,6 +252,7 @@ EnumPropertyItem rna_enum_file_sort_items[] = {
 #include "BKE_colortools.h"
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
+#include "BKE_global.h"
 #include "BKE_nla.h"
 #include "BKE_paint.h"
 #include "BKE_scene.h"
@@ -469,8 +470,10 @@ static void rna_SpaceView3D_lock_camera_and_layers_set(PointerRNA *ptr, int valu
 	v3d->scenelock = value;
 
 	if (value) {
+		Scene *scene = ED_screen_scene_find(sc, G.main->wm.first);
 		int bit;
-		v3d->lay = sc->scene->lay;
+
+		v3d->lay = scene->lay;
 		/* seek for layact */
 		bit = 0;
 		while (bit < 32) {
@@ -480,15 +483,15 @@ static void rna_SpaceView3D_lock_camera_and_layers_set(PointerRNA *ptr, int valu
 			}
 			bit++;
 		}
-		v3d->camera = sc->scene->camera;
+		v3d->camera = scene->camera;
 	}
 }
 
 static void rna_View3D_CursorLocation_get(PointerRNA *ptr, float *values)
 {
 	View3D *v3d = (View3D *)(ptr->data);
-	bScreen *sc = (bScreen *)ptr->id.data;
-	Scene *scene = (Scene *)sc->scene;
+	bScreen *screen = ptr->id.data;
+	Scene *scene = ED_screen_scene_find(screen, G.main->wm.first);
 	const float *loc = ED_view3d_cursor3d_get(scene, v3d);
 	
 	copy_v3_v3(values, loc);
@@ -497,8 +500,8 @@ static void rna_View3D_CursorLocation_get(PointerRNA *ptr, float *values)
 static void rna_View3D_CursorLocation_set(PointerRNA *ptr, const float *values)
 {
 	View3D *v3d = (View3D *)(ptr->data);
-	bScreen *sc = (bScreen *)ptr->id.data;
-	Scene *scene = (Scene *)sc->scene;
+	bScreen *screen = ptr->id.data;
+	Scene *scene = ED_screen_scene_find(screen, G.main->wm.first);
 	float *cursor = ED_view3d_cursor3d_get(scene, v3d);
 	
 	copy_v3_v3(cursor, values);
@@ -507,8 +510,8 @@ static void rna_View3D_CursorLocation_set(PointerRNA *ptr, const float *values)
 static float rna_View3D_GridScaleUnit_get(PointerRNA *ptr)
 {
 	View3D *v3d = (View3D *)(ptr->data);
-	bScreen *sc = (bScreen *)ptr->id.data;
-	Scene *scene = (Scene *)sc->scene;
+	bScreen *screen = ptr->id.data;
+	Scene *scene = ED_screen_scene_find(screen, G.main->wm.first);
 
 	return ED_view3d_grid_scale(scene, v3d, NULL);
 }
@@ -812,22 +815,27 @@ static int rna_SpaceImageEditor_show_uvedit_get(PointerRNA *ptr)
 {
 	SpaceImage *sima = (SpaceImage *)(ptr->data);
 	bScreen *sc = (bScreen *)ptr->id.data;
-	return ED_space_image_show_uvedit(sima, sc->scene->obedit);
+	Scene *scene = ED_screen_scene_find(sc, G.main->wm.first);
+
+	return ED_space_image_show_uvedit(sima, scene->obedit);
 }
 
 static int rna_SpaceImageEditor_show_maskedit_get(PointerRNA *ptr)
 {
 	SpaceImage *sima = (SpaceImage *)(ptr->data);
 	bScreen *sc = (bScreen *)ptr->id.data;
-	return ED_space_image_check_show_maskedit(sc->scene, sima);
+	Scene *scene = ED_screen_scene_find(sc, G.main->wm.first);
+
+	return ED_space_image_check_show_maskedit(scene, sima);
 }
 
 static void rna_SpaceImageEditor_image_set(PointerRNA *ptr, PointerRNA value)
 {
 	SpaceImage *sima = (SpaceImage *)(ptr->data);
 	bScreen *sc = (bScreen *)ptr->id.data;
+	Scene *scene = ED_screen_scene_find(sc, G.main->wm.first);
 
-	ED_space_image_set(sima, sc->scene, sc->scene->obedit, (Image *)value.data);
+	ED_space_image_set(sima, scene, scene->obedit, (Image *)value.data);
 }
 
 static void rna_SpaceImageEditor_mask_set(PointerRNA *ptr, PointerRNA value)
diff --git a/source/blender/makesrna/intern/rna_space_api.c b/source/blender/makesrna/intern/rna_space_api.c
index 3cfbd79..f6aaf81 100644
--- a/source/blender/makesrna/intern/rna_space_api.c
+++ b/source/blender/makesrna/intern/rna_space_api.c
@@ -31,6 +31,9 @@
 
 #ifdef RNA_RUNTIME
 
+#include "BKE_global.h"
+
+#include "ED_screen.h"
 #include "ED_text.h"
 
 static void rna_RegionView3D_update(ID *id, RegionView3D *rv3d)
@@ -43,11 +46,10 @@ static void rna_RegionView3D_update(ID *id, RegionView3D *rv3d)
 	area_region_from_regiondata(sc, rv3d, &sa, &ar);
 
 	if (sa && ar && sa->spacetype == SPACE_VIEW3D) {
-		View3D *v3d;
-
-		v3d = (View3D *)sa->spacedata.first;
+		View3D *v3d = sa->spacedata.first;
+		Scene *scene = ED_screen_scene_find(sc, G.main->wm.first);
 
-		ED_view3d_update_viewmat(sc->scene, v3d, ar, NULL, NULL);
+		ED_view3d_update_viewmat(scene, v3d, ar, NULL, NULL);
 	}
 }
 
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 001d1a6..6e31be9 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -485,6 +485,7 @@ void ED_view3d_shade_update(struct Main *bmain, struct Scene *scene, struct View
 void ED_node_shader_default(const struct bContext *C, struct ID *id) RET_NONE
 void ED_screen_animation_timer_update(struct bScreen *screen, int redraws, int refresh) RET_NONE
 struct bScreen *ED_screen_animation_playing(const struct wmWindowManager *wm) RET_NULL
+struct Scene *ED_screen_scene_find(const struct bScreen *screen, const struct wmWindowManager *wm) RET_NULL
 void ED_base_object_select(struct Base *base, short mode) RET_NONE
 bool ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Object *ob, struct ModifierData *md) RET_ZERO
 struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type) RET_ZERO




More information about the Bf-blender-cvs mailing list