Blender V4.3
COM_ZCombineOperation.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
7namespace blender::compositor {
8
19
21 const rcti &area,
23{
24 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
25 const float depth1 = *it.in(1);
26 const float depth2 = *it.in(3);
27 const float *color = (depth1 < depth2) ? it.in(0) : it.in(2);
28 copy_v4_v4(it.out, color);
29 }
30}
31
32void ZCombineAlphaOperation::update_memory_buffer_partial(MemoryBuffer *output,
33 const rcti &area,
35{
36 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
37 const float depth1 = *it.in(1);
38 const float depth2 = *it.in(3);
39 const float *color1;
40 const float *color2;
41 if (depth1 < depth2) {
42 color1 = it.in(0);
43 color2 = it.in(2);
44 }
45 else {
46 color1 = it.in(2);
47 color2 = it.in(0);
48 }
49 const float fac = color1[3];
50 const float ifac = 1.0f - fac;
51 it.out[0] = fac * color1[0] + ifac * color2[0];
52 it.out[1] = fac * color1[1] + ifac * color2[1];
53 it.out[2] = fac * color1[2] + ifac * color2[2];
54 it.out[3] = std::max(color1[3], color2[3]);
55 }
56}
57
58// MASK combine
66
68 const rcti &area,
70{
71 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
72 const float mask = *it.in(0);
73 const float *color1 = it.in(1);
74 const float *color2 = it.in(2);
75 interp_v4_v4v4(it.out, color1, color2, 1.0f - mask);
76 }
77}
78
79void ZCombineMaskAlphaOperation::update_memory_buffer_partial(MemoryBuffer *output,
80 const rcti &area,
82{
83 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
84 const float mask = *it.in(0);
85 const float *color1 = it.in(1);
86 const float *color2 = it.in(2);
87 const float fac = (1.0f - mask) * (1.0f - color1[3]) + mask * color2[3];
88 const float mfac = 1.0f - fac;
89
90 it.out[0] = color1[0] * mfac + color2[0] * fac;
91 it.out[1] = color1[1] * mfac + color2[1] * fac;
92 it.out[2] = color1[2] * mfac + color2[2] * fac;
93 it.out[3] = std::max(color1[3], color2[3]);
94 }
95}
96
97} // namespace blender::compositor
MINLINE void copy_v4_v4(float r[4], const float a[4])
void interp_v4_v4v4(float r[4], const float a[4], const float b[4], float t)
Definition math_vector.c:45
a MemoryBuffer contains access to the data
void add_output_socket(DataType datatype)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
ccl_device_inline float4 mask(const int4 mask, const float4 a)
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator