Blender V4.3
COM_CompositorOperation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7#include "BLI_string.h"
8
9#include "BKE_global.hh"
10#include "BKE_image.hh"
11#include "BKE_scene.hh"
12
13#include "IMB_imbuf.hh"
14
15#include "RE_pipeline.h"
16
17namespace blender::compositor {
18
20{
23
24 this->set_render_data(nullptr);
25 output_buffer_ = nullptr;
26
27 use_alpha_input_ = false;
28 active_ = false;
29
30 scene_ = nullptr;
31 scene_name_[0] = '\0';
32 view_name_ = nullptr;
33
35}
36
38{
39 if (!active_) {
40 return;
41 }
42
43 /* When initializing the tree during initial load the width and height can be zero. */
44 if (this->get_width() * this->get_height() != 0) {
45 output_buffer_ = (float *)MEM_callocN(
46 sizeof(float[4]) * this->get_width() * this->get_height(), "CompositorOperation");
47 }
48}
49
51{
52 if (!active_) {
53 return;
54 }
55
56 if (!is_braked()) {
57 Render *re = RE_GetSceneRender(scene_);
59
60 if (rr) {
61 RenderView *rv = RE_RenderViewGetByName(rr, view_name_);
62 ImBuf *ibuf = RE_RenderViewEnsureImBuf(rr, rv);
63
64 IMB_assign_float_buffer(ibuf, output_buffer_, IB_TAKE_OWNERSHIP);
65
66 rr->have_combined = true;
67 }
68 else {
69 if (output_buffer_) {
70 MEM_freeN(output_buffer_);
71 }
72 }
73
74 if (re) {
76 re = nullptr;
77 }
78
79 Image *image = BKE_image_ensure_viewer(G.main, IMA_TYPE_R_RESULT, "Render Result");
82 BKE_image_signal(G.main, image, nullptr, IMA_SIGNAL_FREE);
84 }
85 else {
86 if (output_buffer_) {
87 MEM_freeN(output_buffer_);
88 }
89 }
90
91 output_buffer_ = nullptr;
92}
93
94void CompositorOperation::set_scene_name(const char *scene_name)
95{
96 STRNCPY(scene_name_, scene_name);
97}
98
100 const rcti &area,
102{
103 if (!output_buffer_) {
104 return;
105 }
106 MemoryBuffer output_buf(output_buffer_, COM_DATA_TYPE_COLOR_CHANNELS, get_width(), get_height());
107 output_buf.copy_from(inputs[0], area);
108 if (use_alpha_input_) {
109 output_buf.copy_from(inputs[1], area, 0, COM_DATA_TYPE_VALUE_CHANNELS, 3);
110 }
111}
112
113void CompositorOperation::determine_canvas(const rcti & /*preferred_area*/, rcti &r_area)
114{
115 int width, height;
116 BKE_render_resolution(rd_, false, &width, &height);
117
118 /* Check actual render resolution with cropping it may differ with cropped border.rendering
119 * Fix for #31777 Border Crop gives black (easy). */
120 Render *re = RE_GetSceneRender(scene_);
121 if (re) {
123 if (rr) {
124 width = rr->rectx;
125 height = rr->recty;
126 }
128 }
129
130 rcti local_preferred;
131 BLI_rcti_init(&local_preferred, 0, width, 0, height);
132
133 set_determined_canvas_modifier([&](rcti &canvas) { canvas = local_preferred; });
134 NodeOperation::determine_canvas(local_preferred, r_area);
135}
136
137} // namespace blender::compositor
Image * BKE_image_ensure_viewer(Main *bmain, int type, const char *name)
#define IMA_SIGNAL_FREE
Definition BKE_image.hh:138
void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
void BKE_render_resolution(const RenderData *r, const bool use_crop, int *r_width, int *r_height)
Definition scene.cc:2877
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
Definition rct.c:418
#define STRNCPY(dst, src)
Definition BLI_string.h:593
void BLI_thread_unlock(int type)
Definition threads.cc:333
void BLI_thread_lock(int type)
Definition threads.cc:328
@ LOCK_DRAW_IMAGE
Definition BLI_threads.h:68
@ IMA_TYPE_R_RESULT
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
@ IB_TAKE_OWNERSHIP
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
a MemoryBuffer contains access to the data
void copy_from(const MemoryBuffer *src, const rcti &area)
void set_determined_canvas_modifier(std::function< void(rcti &canvas)> fn)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
virtual void determine_canvas(const rcti &preferred_area, rcti &r_area)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
#define G(x, y, z)
constexpr int COM_DATA_TYPE_VALUE_CHANNELS
Definition COM_defines.h:55
constexpr int COM_DATA_TYPE_COLOR_CHANNELS
Definition COM_defines.h:58
RenderView * RE_RenderViewGetByName(RenderResult *rr, const char *viewname)
ImBuf * RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view)
RenderResult * RE_AcquireResultWrite(Render *re)
RenderResult * RE_AcquireResultRead(Render *re)
void RE_ReleaseResult(Render *re)
Render * RE_GetSceneRender(const Scene *scene)