Merging r57729 through r57815 from trunk into soc-2013-depsgraph_mt
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 27 Jun 2013 09:07:19 +0000 (09:07 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 27 Jun 2013 09:07:19 +0000 (09:07 +0000)
1  2 
release/scripts/startup/bl_ui/properties_render.py
source/blender/blenkernel/intern/mball.c
source/blender/blenloader/intern/readfile.c
source/blender/editors/render/render_internal.c
source/blender/windowmanager/intern/wm_event_system.c

index 23cec2642e78593204d32faff1a59635acb27626,799c109ae0cd0606ce2260c4dc6b786277538132..bf4975f2e43ab4f3b2f54e6cc41cc3a507a76e21
@@@ -70,7 -70,6 +70,7 @@@ class RENDER_PT_render(RenderButtonsPan
          row.operator("render.play_rendered_anim", text="Play", icon='PLAY')
  
          layout.prop(rd, "display_mode", text="Display")
 +        layout.prop(rd, "use_lock_interface")
  
  
  class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
@@@ -79,6 -78,7 +79,7 @@@
  
      _frame_rate_args_prev = None
      _preset_class = None
      @staticmethod
      def _draw_framerate_label(*args):
          # avoids re-creating text string each draw
@@@ -86,7 -86,7 +87,7 @@@
              return RENDER_PT_dimensions._frame_rate_ret
  
          fps, fps_base, preset_label = args
-         
          if fps_base == 1.0:
              fps_rate = round(fps)
          else:
index 140c4f55b055362cb050050b6f2a7b1ece3dfd67,8361f0c4f6c77ed5b622668ede583706fd48576d..afe1c0f24df952828e5d9fcff41a61dc44fc6842
@@@ -151,7 -151,7 +151,7 @@@ typedef struct process {        /* para
  
        /* what happens here? floats, I think. */
        /*  float (*function)(void);     */     /* implicit surface function */
-       float (*function)(struct process*, float, float, float);
+       float (*function)(struct process *, float, float, float);
        float size, delta;          /* cube size, normal delta */
        int bounds;                 /* cube range within lattice */
        CUBES *cubes;               /* active cubes */
@@@ -2269,7 -2269,7 +2269,7 @@@ static void mball_count(PROCESS *proces
        }
  }
  
 -void BKE_mball_polygonize(Scene *scene, Object *ob, ListBase *dispbase)
 +void BKE_mball_polygonize(Scene *scene, Object *ob, ListBase *dispbase, bool for_render)
  {
        MetaBall *mb;
        DispList *dl;
        mball_count(&process, scene, ob);
  
        if (process.totelem == 0) return;
 -      if ((G.is_rendering == FALSE) && (mb->flag == MB_UPDATE_NEVER)) return;
 +      if ((for_render == FALSE) && (mb->flag == MB_UPDATE_NEVER)) return;
-       if ((G.moving & (G_TRANSFORM_OBJ|G_TRANSFORM_EDIT)) && mb->flag == MB_UPDATE_FAST) return;
+       if ((G.moving & (G_TRANSFORM_OBJ | G_TRANSFORM_EDIT)) && mb->flag == MB_UPDATE_FAST) return;
  
        process.thresh = mb->thresh;
  
        }
  
        /* width is size per polygonize cube */
 -      if (G.is_rendering) {
 +      if (for_render) {
                width = mb->rendersize;
        }
        else {
                width = mb->wiresize;
-               if ((G.moving & (G_TRANSFORM_OBJ|G_TRANSFORM_EDIT)) && mb->flag == MB_UPDATE_HALFRES) width *= 2;
+               if ((G.moving & (G_TRANSFORM_OBJ | G_TRANSFORM_EDIT)) && mb->flag == MB_UPDATE_HALFRES) {
+                       width *= 2;
+               }
        }
        /* nr_cubes is just for safety, minimum is totsize */
        nr_cubes = (int)(0.5f + totsize / width);
index d6bc6b91841dba2e9d872b7f01d66b038fd294fd,673cd3f7b2630d661b73dc99a9a473698a568576..917b1e5d054eff0749418c863421ad1f99978f5f
@@@ -5514,7 -5514,6 +5514,7 @@@ static void direct_link_windowmanager(F
        wm->winactive = NULL;
        wm->initialized = 0;
        wm->op_undo_depth = 0;
 +      wm->is_interface_locked = 0;
  }
  
  static void lib_link_windowmanager(FileData *fd, Main *main)
@@@ -9332,7 -9331,7 +9332,7 @@@ static void do_versions(FileData *fd, L
        }
  
        if (main->versionfile < 267) {
-               //if(!DNA_struct_elem_find(fd->filesdna, "Brush", "int", "stencil_pos")) {
+               //if (!DNA_struct_elem_find(fd->filesdna, "Brush", "int", "stencil_pos")) {
                Brush *brush;
  
                for (brush = main->brush.first; brush; brush = brush->id.next) {
index ec68d2e193db8b716cef0954275dc7bb394817a5,09138a5523aeeaf0a767d02bbfb2f88dca80b231..563f416ead0bc84799d2e4988caa7cc5dda529c5
@@@ -273,7 -273,6 +273,7 @@@ typedef struct RenderJob 
        short *do_update;
        float *progress;
        ReportList *reports;
 +      bool interface_locked;
  } RenderJob;
  
  static void render_freejob(void *rjv)
@@@ -300,7 -299,7 +300,7 @@@ static void make_renderinfo_string(Rend
        megs_peak_memory = (peak_memory) / (1024.0 * 1024.0);
  
        /* local view */
-       if(rs->localview)
+       if (rs->localview)
                spos += sprintf(spos, "%s | ", IFACE_("Local View"));
  
        /* frame number */
  
        /* statistics */
        if (rs->statstr) {
-               if(rs->statstr[0])
+               if (rs->statstr[0]) {
                        spos += sprintf(spos, "| %s ", rs->statstr);
+               }
        }
        else {
                if (rs->totvert || rs->totface || rs->tothalo || rs->totstrand || rs->totlamp)
@@@ -469,7 -469,7 +470,7 @@@ static void render_endjob(void *rjv
  
        /* XXX render stability hack */
        G.is_rendering = FALSE;
-       WM_main_add_notifier(NC_SCENE|ND_RENDER_RESULT, NULL);
+       WM_main_add_notifier(NC_SCENE | ND_RENDER_RESULT, NULL);
  
        /* Partial render result will always update display buffer
         * for first render layer only. This is nice because you'll
  
                BKE_image_release_ibuf(ima, ibuf, lock);
        }
 +
 +      /* Finally unlock the user interface (if it was locked). */
 +      if (rj->interface_locked) {
 +              /* Interface was locked, so window manager couldn't have been changed
 +               * and using one from Global will unlock exactly the same manager as
 +               * was locked before running the job.
 +               */
 +              WM_set_locked_interface(G.main->wm.first, false);
 +      }
  }
  
  /* called by render, check job 'stop' value or the global */
@@@ -532,14 -523,10 +533,14 @@@ static int render_break(void *UNUSED(rj
  
  /* runs in thread, no cursor setting here works. careful with notifiers too (malloc conflicts) */
  /* maybe need a way to get job send notifer? */
 -static void render_drawlock(void *UNUSED(rjv), int lock)
 +static void render_drawlock(void *rjv, int lock)
  {
 -      BKE_spacedata_draw_locks(lock);
 -      
 +      RenderJob *rj = rjv;
 +
 +      /* If interface is locked, renderer callback shall do nothing. */
 +      if (!rj->interface_locked) {
 +              BKE_spacedata_draw_locks(lock);
 +      }
  }
  
  /* catch esc */
@@@ -662,23 -649,6 +663,23 @@@ static int screen_render_invoke(bContex
                        rj->lay |= v3d->localvd->lay;
        }
  
 +      /* Lock the user interface depending on render settings. */
 +      if (scene->r.use_lock_interface) {
 +              WM_set_locked_interface(CTX_wm_manager(C), true);
 +
 +              /* Set flag interface need to be unlocked.
 +               *
 +               * This is so because we don't have copy of render settings
 +               * accessible from render job and copy is needed in case
 +               * of non-locked rendering, so we wouldn't try to unlock
 +               * anything if option was initially unset but then was
 +               * enabled during rendering.
 +               */
 +              rj->interface_locked = true;
 +
 +              /* TODO(sergey): clean memory used by viewport? */
 +      }
 +
        /* setup job */
        if (RE_seq_render_active(scene, &scene->r)) name = "Sequence Render";
        else name = "Render";
index b171006b0b8d784218e30c4ea26a2a8383b1e256,d94cfaa5aee144ccaaf890682a2a7ffe1779a724..d91f954fca27dda48ae6c4178565aa24490f3181
@@@ -1661,7 -1661,7 +1661,7 @@@ static int wm_handler_fileselect_call(b
                                        if (win_prev == NULL)
                                                CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
  
-                                       handler->op->reports->printlevel = RPT_WARNING;
+                                       BKE_report_print_level_set(handler->op->reports, RPT_WARNING);
                                        uiPupMenuReports(C, handler->op->reports);
  
                                        /* XXX - copied from 'wm_operator_finished()' */
@@@ -2093,21 -2093,6 +2093,21 @@@ void wm_event_do_handlers(bContext *C
        wmWindowManager *wm = CTX_wm_manager(C);
        wmWindow *win;
  
 +      if (wm->is_interface_locked) {
 +              /* If we're in locked interaction mode, skip all the events
 +               * from the queue and prevent them from being accumulated.
 +               * This is so no events are applied after interface is unlocked.
 +               */
 +              for (win = wm->windows.first; win; win = win->next) {
 +                      wmEvent *event;
 +                      while ( (event = win->queue.first) ) {
 +                              BLI_remlink(&win->queue, event);
 +                              wm_event_free(event);
 +                      }
 +              }
 +              return;
 +      }
 +
        /* update key configuration before handling events */
        WM_keyconfig_update(wm);
  
@@@ -3234,24 -3219,3 +3234,24 @@@ void wm_event_add_ghostevent(wmWindowMa
        WM_event_print(&event);
  #endif
  }
 +
 +void WM_set_locked_interface(wmWindowManager *wm, bool lock)
 +{
 +      /* This will prevent events from being handled while interface is locked
 +       *
 +       * Use a "local" flag for now, because currently no other areas could
 +       * benefit of locked interface anyway (aka using G.is_interface_locked
 +       * wouldn't be useful anywhere outside of window manager, so let's not
 +       * pollute global context with such an information for now).
 +       */
 +      wm->is_interface_locked = lock ? 1 : 0;
 +
 +      /* This will prevent drawing regions which uses non-threadsafe data.
 +       * Currently it'll be just a 3D viewport.
 +       *
 +       * TODO(sergey): Make it different locked states, so different jobs
 +       *               could lock different areas of blender and allow
 +       *               interation with others?
 +       */
 +      BKE_spacedata_draw_locks(lock);
 +}