Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht>2021-09-30 17:51:03 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-09-30 21:53:27 +0300
commit1a134c4c30a643ada1b9a7a037040b5f5c173a28 (patch)
treeb4216998527ff24fb3fc9e9351ced05cd7b7eb08 /intern/cycles/app/oiio_output_driver.cpp
parenta754e35198d852ea34e2b82cd2b126538e6f5a3b (diff)
Cycles: refactor API for render output
* Add OutputDriver, replacing function callbacks in Session. * Add PathTraceTile, replacing tile access methods in Session. * Add more detailed comments about how this driver should be implemented. * Add OIIOOutputDriver for Cycles standalone to output an image. Differential Revision: https://developer.blender.org/D12627
Diffstat (limited to 'intern/cycles/app/oiio_output_driver.cpp')
-rw-r--r--intern/cycles/app/oiio_output_driver.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/intern/cycles/app/oiio_output_driver.cpp b/intern/cycles/app/oiio_output_driver.cpp
new file mode 100644
index 00000000000..d791c89772f
--- /dev/null
+++ b/intern/cycles/app/oiio_output_driver.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2021 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "app/oiio_output_driver.h"
+
+CCL_NAMESPACE_BEGIN
+
+OIIOOutputDriver::OIIOOutputDriver(const string_view filepath,
+ const string_view pass,
+ LogFunction log)
+ : filepath_(filepath), pass_(pass), log_(log)
+{
+}
+
+OIIOOutputDriver::~OIIOOutputDriver()
+{
+}
+
+void OIIOOutputDriver::write_render_tile(const Tile &tile)
+{
+ /* Only write the full buffer, no intermediate tiles. */
+ if (!(tile.size == tile.full_size)) {
+ return;
+ }
+
+ log_(string_printf("Writing image %s", filepath_.c_str()));
+
+ unique_ptr<ImageOutput> image_output(ImageOutput::create(filepath_));
+ if (image_output == nullptr) {
+ log_("Failed to create image file");
+ return;
+ }
+
+ const int width = tile.size.x;
+ const int height = tile.size.y;
+
+ ImageSpec spec(width, height, 4, TypeDesc::FLOAT);
+ if (!image_output->open(filepath_, spec)) {
+ log_("Failed to create image file");
+ return;
+ }
+
+ vector<float> pixels(width * height * 4);
+ if (!tile.get_pass_pixels(pass_, 4, pixels.data())) {
+ log_("Failed to read render pass pixels");
+ return;
+ }
+
+ /* Manipulate offset and stride to convert from bottom-up to top-down convention. */
+ image_output->write_image(TypeDesc::FLOAT,
+ pixels.data() + (height - 1) * width * 4,
+ AutoStride,
+ -width * 4 * sizeof(float),
+ AutoStride);
+ image_output->close();
+}
+
+CCL_NAMESPACE_END