[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56281] trunk/blender/source/blender/ editors/screen/screen_edit.c: Fix crash going to a scene with no camera, with an inactive 3D viewport space.

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Apr 25 01:09:23 CEST 2013


Revision: 56281
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56281
Author:   blendix
Date:     2013-04-24 23:09:22 +0000 (Wed, 24 Apr 2013)
Log Message:
-----------
Fix crash going to a scene with no camera, with an inactive 3D viewport space.

The regions of the space are stored in a different place depending if it is
active or if another space is in use. The code here was iterating over both
but it should be only one because the other might contain regions of another
space.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/screen/screen_edit.c

Modified: trunk/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_edit.c	2013-04-24 23:09:19 UTC (rev 56280)
+++ trunk/blender/source/blender/editors/screen/screen_edit.c	2013-04-24 23:09:22 UTC (rev 56281)
@@ -1448,6 +1448,36 @@
 		BKE_libblock_free(&bmain->screen, sc);
 }
 
+static void ed_screen_set_3dview_camera(Scene *scene, bScreen *sc, ScrArea *sa, View3D *v3d)
+{
+	/* fix any cameras that are used in the 3d view but not in the scene */
+	BKE_screen_view3d_sync(v3d, scene);
+
+	if (!v3d->camera || !BKE_scene_base_find(scene, v3d->camera)) {
+		v3d->camera = BKE_scene_camera_find(sc->scene);
+		// XXX if (sc == curscreen) handle_view3d_lock();
+		if (!v3d->camera) {
+			ARegion *ar;
+			ListBase *regionbase;
+			
+			/* regionbase is in different place depending if space is active */
+			if (v3d == sa->spacedata.first)
+				regionbase = &sa->regionbase;
+			else
+				regionbase = &v3d->regionbase;
+				
+			for (ar = regionbase->first; ar; ar = ar->next) {
+				if (ar->regiontype == RGN_TYPE_WINDOW) {
+					RegionView3D *rv3d = ar->regiondata;
+					if (rv3d->persp == RV3D_CAMOB) {
+						rv3d->persp = RV3D_PERSP;
+					}
+				}
+			}
+		}
+	}
+}
+
 /* only call outside of area/region loops */
 void ED_screen_set_scene(bContext *C, bScreen *screen, Scene *scene)
 {
@@ -1487,28 +1517,8 @@
 				while (sl) {
 					if (sl->spacetype == SPACE_VIEW3D) {
 						View3D *v3d = (View3D *) sl;
+						ed_screen_set_3dview_camera(scene, sc, sa, v3d);
 
-						BKE_screen_view3d_sync(v3d, scene);
-
-						if (!v3d->camera || !BKE_scene_base_find(scene, v3d->camera)) {
-							v3d->camera = BKE_scene_camera_find(sc->scene);
-							// XXX if (sc == curscreen) handle_view3d_lock();
-							if (!v3d->camera) {
-								ListBase *regionbase[] = {&sa->regionbase, &v3d->regionbase, NULL};
-								int i;
-								for (i = 0; regionbase[i]; i++) {
-									ARegion *ar;
-									for (ar = regionbase[i]->first; ar; ar = ar->next) {
-										if (ar->regiontype == RGN_TYPE_WINDOW) {
-											RegionView3D *rv3d = ar->regiondata;
-											if (rv3d->persp == RV3D_CAMOB) {
-												rv3d->persp = RV3D_PERSP;
-											}
-										}
-									}
-								}
-							}
-						}
 					}
 					sl = sl->next;
 				}




More information about the Bf-blender-cvs mailing list