Code refactor: move OIIO image buffer writing outside session, into callback.
authorGuillaume Chereau <guillaumec>
Thu, 15 Mar 2018 21:07:37 +0000 (22:07 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 15 Mar 2018 22:05:16 +0000 (23:05 +0100)
Original patch by Guillaume, modifications by Brecht.

Differential Revision: https://developer.blender.org/D3102

intern/cycles/app/cycles_standalone.cpp
intern/cycles/render/buffers.cpp
intern/cycles/render/buffers.h
intern/cycles/render/session.cpp
intern/cycles/render/session.h

index 2d4b0d3..c682744 100644 (file)
@@ -51,6 +51,7 @@ struct Options {
        SessionParams session_params;
        bool quiet;
        bool show_help, interactive, pause;
+       string output_path;
 } options;
 
 static void session_print(const string& str)
@@ -86,6 +87,34 @@ static void session_print_status()
        session_print(status);
 }
 
+static bool write_render(const uchar *pixels, int w, int h, int channels)
+{
+       string msg = string_printf("Writing image %s", options.output_path.c_str());
+       session_print(msg);
+
+       ImageOutput *out = ImageOutput::create(options.output_path);
+       if(!out) {
+               return false;
+       }
+
+       ImageSpec spec(w, h, channels, TypeDesc::UINT8);
+       if(!out->open(options.output_path, spec)) {
+               return false;
+       }
+
+       /* conversion for different top/bottom convention */
+       out->write_image(TypeDesc::UINT8,
+               pixels + (h - 1) * w * channels,
+               AutoStride,
+               -w * channels,
+               AutoStride);
+
+       out->close();
+       delete out;
+
+       return true;
+}
+
 static BufferParams& session_buffer_params()
 {
        static BufferParams buffer_params;
@@ -120,6 +149,7 @@ static void scene_init()
 
 static void session_init()
 {
+       options.session_params.write_render_cb = write_render;
        options.session = new Session(options.session_params);
 
        if(options.session_params.background && !options.quiet)
@@ -364,7 +394,7 @@ static void options_parse(int argc, const char **argv)
                "--background", &options.session_params.background, "Render in background, without user interface",
                "--quiet", &options.quiet, "In background mode, don't print progress messages",
                "--samples %d", &options.session_params.samples, "Number of samples to render",
-               "--output %s", &options.session_params.output_path, "File path to write output image",
+               "--output %s", &options.output_path, "File path to write output image",
                "--threads %d", &options.session_params.threads, "CPU Rendering Threads",
                "--width  %d", &options.width, "Window width in pixel",
                "--height %d", &options.height, "Window height in pixel",
index 84d10cc..6f56038 100644 (file)
@@ -21,7 +21,6 @@
 
 #include "util/util_foreach.h"
 #include "util/util_hash.h"
-#include "util/util_image.h"
 #include "util/util_math.h"
 #include "util/util_opengl.h"
 #include "util/util_time.h"
@@ -448,37 +447,5 @@ bool DisplayBuffer::draw_ready()
        return (draw_width != 0 && draw_height != 0);
 }
 
-void DisplayBuffer::write(const string& filename)
-{
-       int w = draw_width;
-       int h = draw_height;
-
-       if(w == 0 || h == 0)
-               return;
-       
-       if(half_float)
-               return;
-
-       /* read buffer from device */
-       uchar4 *pixels = rgba_byte.copy_from_device(0, w, h);
-
-       /* write image */
-       ImageOutput *out = ImageOutput::create(filename);
-       ImageSpec spec(w, h, 4, TypeDesc::UINT8);
-
-       out->open(filename, spec);
-
-       /* conversion for different top/bottom convention */
-       out->write_image(TypeDesc::UINT8,
-               (uchar*)(pixels + (h-1)*w),
-               AutoStride,
-               -w*sizeof(uchar4),
-               AutoStride);
-
-       out->close();
-
-       delete out;
-}
-
 CCL_NAMESPACE_END
 
index 028bfb8..dfc98fe 100644 (file)
@@ -113,7 +113,6 @@ public:
        ~DisplayBuffer();
 
        void reset(BufferParams& params);
-       void write(const string& filename);
 
        void draw_set(int width, int height);
        void draw(Device *device, const DeviceDrawParams& draw_params);
index 4115603..bb636dd 100644 (file)
@@ -55,7 +55,7 @@ Session::Session(const SessionParams& params_)
 
        device = Device::create(params.device, stats, params.background);
 
-       if(params.background && params.output_path.empty()) {
+       if(params.background && !params.write_render_cb) {
                buffers = NULL;
                display = NULL;
        }
@@ -101,7 +101,7 @@ Session::~Session()
                wait();
        }
 
-       if(!params.output_path.empty()) {
+       if(params.write_render_cb) {
                /* tonemap and write out image if requested */
                delete display;
 
@@ -109,8 +109,10 @@ Session::~Session()
                display->reset(buffers->params);
                tonemap(params.samples);
 
-               progress.set_status("Writing Image", params.output_path);
-               display->write(params.output_path);
+               int w = display->draw_width;
+               int h = display->draw_height;
+               uchar4 *pixels = display->rgba_byte.copy_from_device(0, w, h);
+               params.write_render_cb((uchar*)pixels, w, h, 4);
        }
 
        /* clean up */
index 8495d95..e63cad0 100644 (file)
@@ -45,7 +45,6 @@ public:
        DeviceInfo device;
        bool background;
        bool progressive_refine;
-       string output_path;
 
        bool progressive;
        bool experimental;
@@ -71,11 +70,15 @@ public:
 
        ShadingSystem shadingsystem;
 
+       function<bool(const uchar *pixels,
+                     int width,
+                     int height,
+                     int channels)> write_render_cb;
+
        SessionParams()
        {
                background = false;
                progressive_refine = false;
-               output_path = "";
 
                progressive = false;
                experimental = false;
@@ -106,7 +109,6 @@ public:
        { return !(device == params.device
                && background == params.background
                && progressive_refine == params.progressive_refine
-               && output_path == params.output_path
                /* && samples == params.samples */
                && progressive == params.progressive
                && experimental == params.experimental