BGE fix: 3DDview not redrawing when exiting BGE
[blender.git] / source / blender / editors / space_view3d / view3d_view.c
index fab511f048c4a4e960d689b267160a18ba1d69db..bbf728d31c00773b5c6d5eb594bd4124f08b70cd 100644 (file)
@@ -297,7 +297,7 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
                        if(rv3d->smooth_timer)
                                WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), rv3d->smooth_timer);
                        /* TIMER1 is hardcoded in keymap */
-                       rv3d->smooth_timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER1, 1.0/30.0);  /* max 30 frs/sec */
+                       rv3d->smooth_timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER1, 1.0/100.0); /* max 30 frs/sec */
                        
                        return;
                }
@@ -395,6 +395,7 @@ void VIEW3D_OT_smoothview(wmOperatorType *ot)
 static void setcameratoview3d(View3D *v3d, RegionView3D *rv3d, Object *ob)
 {
        float dvec[3];
+       float mat3[3][3];
        
        dvec[0]= rv3d->dist*rv3d->viewinv[2][0];
        dvec[1]= rv3d->dist*rv3d->viewinv[2][1];
@@ -404,7 +405,10 @@ static void setcameratoview3d(View3D *v3d, RegionView3D *rv3d, Object *ob)
        sub_v3_v3v3(ob->loc, ob->loc, rv3d->ofs);
        rv3d->viewquat[0]= -rv3d->viewquat[0];
 
-       quat_to_eul( ob->rot,rv3d->viewquat);
+       // quat_to_eul( ob->rot,rv3d->viewquat); // in 2.4x for xyz eulers only
+       quat_to_mat3(mat3, rv3d->viewquat);
+       object_mat3_to_rot(ob, mat3, 0);
+
        rv3d->viewquat[0]= -rv3d->viewquat[0];
        
        ob->recalc= OB_RECALC_OB;
@@ -1304,6 +1308,74 @@ static unsigned int free_localbit(void)
        return 0;
 }
 
+static void copy_view3d_lock_space(View3D *v3d, Scene *scene)
+{
+       int bit;
+       
+       if(v3d->scenelock && v3d->localvd==NULL) {
+               v3d->lay= scene->lay;
+               v3d->camera= scene->camera;
+               
+               if(v3d->camera==NULL) {
+                       ARegion *ar;
+                       
+                       for(ar=v3d->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;
+                               }
+                       }
+               }
+               
+               if((v3d->lay & v3d->layact) == 0) {
+                       for(bit= 0; bit<32; bit++) {
+                               if(v3d->lay & (1<<bit)) {
+                                       v3d->layact= 1<<bit;
+                                       break;
+                               }
+                       }
+               }
+       }
+}
+
+void ED_view3d_scene_layers_update(Main *bmain, Scene *scene)
+{
+       bScreen *sc;
+       ScrArea *sa;
+       SpaceLink *sl;
+       
+       /* from scene copy to the other views */
+       for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+               if(sc->scene!=scene)
+                       continue;
+               
+               for(sa=sc->areabase.first; sa; sa=sa->next)
+                       for(sl=sa->spacedata.first; sl; sl=sl->next)
+                               if(sl->spacetype==SPACE_VIEW3D)
+                                       copy_view3d_lock_space((View3D*)sl, scene);
+       }
+}
+
+int ED_view3d_scene_layer_set(int lay, const int *values)
+{
+       int i, tot= 0;
+       
+       /* ensure we always have some layer selected */
+       for(i=0; i<20; i++)
+               if(values[i])
+                       tot++;
+       
+       if(tot==0)
+               return lay;
+       
+       for(i=0; i<20; i++) {
+               if(values[i]) lay |= (1<<i);
+               else lay &= ~(1<<i);
+       }
+       
+       return lay;
+}
 
 static void initlocalview(Scene *scene, ScrArea *sa)
 {
@@ -1641,6 +1713,7 @@ static int game_engine_exec(bContext *C, wmOperator *unused)
        Scene *startscene = CTX_data_scene(C);
        ScrArea *sa, *prevsa= CTX_wm_area(C);
        ARegion *ar, *prevar= CTX_wm_region(C);
+       wmWindow *prevwin= CTX_wm_window(C);
        RegionView3D *rv3d;
        rcti cam_frame;
 
@@ -1674,11 +1747,15 @@ static int game_engine_exec(bContext *C, wmOperator *unused)
 
 
        SaveState(C);
+
        StartKetsjiShell(C, ar, &cam_frame, 1);
-       RestoreState(C);
        
+       /* restore context, in case it changed in the meantime, for
+          example by working in another window or closing it */
        CTX_wm_region_set(C, prevar);
+       CTX_wm_window_set(C, prevwin);
        CTX_wm_area_set(C, prevsa);
+       RestoreState(C);
 
        //XXX restore_all_scene_cfra(scene_cfra_store);
        set_scene_bg(startscene);
@@ -1841,7 +1918,7 @@ typedef struct FlyInfo {
 #define FLY_CANCEL             1
 #define FLY_CONFIRM            2
 
-int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
+static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
 {
        float upvec[3]; // tmp
        float mat[3][3];
@@ -1915,7 +1992,6 @@ int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
                mul_v3_fl(fly->rv3d->ofs, -1.0f); /*flip the vector*/
 
                fly->rv3d->dist=0.0;
-               fly->rv3d->viewbut=0;
 
                /* used for recording */
 //XXX2.5               if(v3d->camera->ipoflag & OB_ACTION_OB)
@@ -1955,7 +2031,7 @@ static int flyEnd(bContext *C, FlyInfo *fly)
        if (fly->state == FLY_CANCEL) {
        /* Revert to original view? */
                if (fly->persp_backup==RV3D_CAMOB) { /* a camera view */
-                       rv3d->viewbut=1;
+
                        VECCOPY(v3d->camera->loc, fly->ofs_backup);
                        VECCOPY(v3d->camera->rot, fly->rot_backup);
                        DAG_id_flush_update(&v3d->camera->id, OB_RECALC_OB);
@@ -1969,7 +2045,7 @@ static int flyEnd(bContext *C, FlyInfo *fly)
        else if (fly->persp_backup==RV3D_CAMOB) {       /* camera */
                float mat3[3][3];
                copy_m3_m4(mat3, v3d->camera->obmat);
-               mat3_to_compatible_eul( v3d->camera->rot, fly->rot_backup,mat3);
+               object_mat3_to_rot(v3d->camera, mat3, TRUE);
 
                DAG_id_flush_update(&v3d->camera->id, OB_RECALC_OB);
 #if 0 //XXX2.5
@@ -2006,9 +2082,9 @@ static int flyEnd(bContext *C, FlyInfo *fly)
        return OPERATOR_CANCELLED;
 }
 
-void flyEvent(FlyInfo *fly, wmEvent *event)
+static void flyEvent(FlyInfo *fly, wmEvent *event)
 {
-       if (event->type == TIMER) {
+       if (event->type == TIMER && event->customdata == fly->timer) {
                fly->redraw = 1;
        }
        else if (event->type == MOUSEMOVE) {
@@ -2129,7 +2205,7 @@ void flyEvent(FlyInfo *fly, wmEvent *event)
 }
 
 //int fly_exec(bContext *C, wmOperator *op)
-int flyApply(FlyInfo *fly)
+static int flyApply(FlyInfo *fly)
 {
        /*
        fly mode - Shift+F
@@ -2467,7 +2543,7 @@ static int fly_modal(bContext *C, wmOperator *op, wmEvent *event)
 
        flyEvent(fly, event);
 
-       if(event->type==TIMER)
+       if(event->type==TIMER && event->customdata == fly->timer)
                flyApply(fly);
 
        if(fly->redraw) {;