patch [#28218] During-render callback functionality
authorCampbell Barton <ideasman42@gmail.com>
Wed, 31 Aug 2011 10:43:22 +0000 (10:43 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 31 Aug 2011 10:43:22 +0000 (10:43 +0000)
from Jesse Kaukonen (gekko)

--- text from the patch.

Recently Campbell Barton added callback functionality for Python's usage, but this only includes pre- and post-render callbacks. There are no callbacks for the duration of the render. This patch adds the few lines required for executing a callback while Blender Render is working. The callback resides in the rendering pipeline stats function, so whenever statistics are printed, the callback is executed. This functionality is required if one wants to:

1) Observe what is happening while Blender is rendering via the command line
2) Add custom statistics that Blender prints while the renderer works
3) The user wants to continue executing his Python script without the code halting at bpy.ops.render.render()

Personally I'm currently using this for printing out more detailed progress reports at Renderfarm.fi (such as CPU time, time spent rendering, total progress in regards to the entire rendering process). Tested on Windows, Linux and OS X.

Example on how to use the callback:

  def statscall(context): print("Thanks for calling!")
  bpy.app.handlers.render_stats.append(statscall)
  bpy.ops.render.render(animation=False, write_still=True)

source/blender/blenlib/BLI_callbacks.h
source/blender/python/intern/bpy_app_handlers.c
source/blender/render/intern/source/pipeline.c

index 1735848e774c5bcfeadec66875f4368840daf979..f20cef9c3ea0a8d3989fe0cd0886ba8373045062 100644 (file)
@@ -42,6 +42,7 @@ struct ID;
 typedef enum {
        BLI_CB_EVT_RENDER_PRE,
        BLI_CB_EVT_RENDER_POST,
+       BLI_CB_EVT_RENDER_STATS,
        BLI_CB_EVT_LOAD_PRE,
        BLI_CB_EVT_LOAD_POST,
        BLI_CB_EVT_SAVE_PRE,
index 26d9ca76e3fa62d1381c43e2c5e8878278f7b0cc..e7e4616019935625f195cb24227554091e43686c 100644 (file)
@@ -42,9 +42,10 @@ static PyTypeObject BlenderAppCbType;
 static PyStructSequence_Field app_cb_info_fields[]= {
        {(char *)"render_pre", NULL},
        {(char *)"render_post", NULL},
-    {(char *)"load_pre", NULL},
+       {(char *)"render_stats", NULL},
+       {(char *)"load_pre", NULL},
        {(char *)"load_post", NULL},
-    {(char *)"save_pre", NULL},
+       {(char *)"save_pre", NULL},
        {(char *)"save_post", NULL},
        {NULL}
 };
index 77b637b51294d39c47f9e6eb8c7d72c18cdd674c..24c55332bff788d8fa1fa82cbb62ed1445f97e3c 100644 (file)
@@ -173,6 +173,9 @@ static void stats_background(void *UNUSED(arg), RenderStats *rs)
                else
                        fprintf(stdout, "Sce: %s Ve:%d Fa:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->totlamp);
        }
+
+       BLI_exec_cb(rs, (ID *)rs, BLI_CB_EVT_RENDER_STATS);
+
        fputc('\n', stdout);
        fflush(stdout);
 }