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:
Diffstat (limited to 'source/blender/compositor/operations/COM_OutputFileOperation.cpp')
-rw-r--r--source/blender/compositor/operations/COM_OutputFileOperation.cpp33
1 files changed, 31 insertions, 2 deletions
diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cpp b/source/blender/compositor/operations/COM_OutputFileOperation.cpp
index 2676ab1b9ca..216b754f676 100644
--- a/source/blender/compositor/operations/COM_OutputFileOperation.cpp
+++ b/source/blender/compositor/operations/COM_OutputFileOperation.cpp
@@ -18,12 +18,15 @@
#include "COM_OutputFileOperation.h"
+#include "COM_MetaData.h"
+
#include <cstring>
#include "BLI_listbase.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+#include "BKE_cryptomatte.hh"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
@@ -36,6 +39,8 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "RE_pipeline.h"
+
void add_exr_channels(void *exrhandle,
const char *layerName,
const DataType datatype,
@@ -299,13 +304,15 @@ OutputOpenExrLayer::OutputOpenExrLayer(const char *name_, DataType datatype_, bo
this->imageInput = nullptr;
}
-OutputOpenExrMultiLayerOperation::OutputOpenExrMultiLayerOperation(const RenderData *rd,
+OutputOpenExrMultiLayerOperation::OutputOpenExrMultiLayerOperation(const Scene *scene,
+ const RenderData *rd,
const bNodeTree *tree,
const char *path,
char exr_codec,
bool exr_half_float,
const char *viewName)
{
+ this->m_scene = scene;
this->m_rd = rd;
this->m_tree = tree;
@@ -323,6 +330,26 @@ void OutputOpenExrMultiLayerOperation::add_layer(const char *name,
this->m_layers.push_back(OutputOpenExrLayer(name, datatype, use_layer));
}
+StampData *OutputOpenExrMultiLayerOperation::createStampData() const
+{
+ /* StampData API doesn't provide functions to modify an instance without having a RenderResult.
+ */
+ RenderResult render_result;
+ StampData *stamp_data = BKE_stamp_info_from_scene_static(m_scene);
+ render_result.stamp_data = stamp_data;
+ for (int i = 0; i < this->m_layers.size(); i++) {
+ const OutputOpenExrLayer *layer = &this->m_layers[i];
+ std::unique_ptr<MetaData> meta_data = layer->imageInput->getMetaData();
+ if (meta_data) {
+ blender::StringRef layer_name = blender::BKE_cryptomatte_extract_layer_name(
+ blender::StringRef(layer->name, BLI_strnlen(layer->name, sizeof(layer->name))));
+ meta_data->replaceHashNeutralCryptomatteKeys(layer_name);
+ meta_data->addToRenderResult(&render_result);
+ }
+ }
+ return stamp_data;
+}
+
void OutputOpenExrMultiLayerOperation::initExecution()
{
for (unsigned int i = 0; i < this->m_layers.size(); i++) {
@@ -386,7 +413,8 @@ void OutputOpenExrMultiLayerOperation::deinitExecution()
}
/* when the filename has no permissions, this can fail */
- if (IMB_exr_begin_write(exrhandle, filename, width, height, this->m_exr_codec, nullptr)) {
+ StampData *stamp_data = createStampData();
+ if (IMB_exr_begin_write(exrhandle, filename, width, height, this->m_exr_codec, stamp_data)) {
IMB_exr_write_channels(exrhandle);
}
else {
@@ -404,5 +432,6 @@ void OutputOpenExrMultiLayerOperation::deinitExecution()
this->m_layers[i].imageInput = nullptr;
}
+ BKE_stamp_data_free(stamp_data);
}
}