Blender
V4.3
source
blender
compositor
operations
COM_EllipseMaskOperation.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
5
#include "
COM_EllipseMaskOperation.h
"
6
7
namespace
blender::compositor
{
8
9
EllipseMaskOperation::EllipseMaskOperation
()
10
{
11
this->
add_input_socket
(
DataType::Value
);
12
this->
add_input_socket
(
DataType::Value
);
13
this->
add_output_socket
(
DataType::Value
);
14
cosine_ = 0.0f;
15
sine_ = 0.0f;
16
}
17
void
EllipseMaskOperation::init_execution
()
18
{
19
const
double
rad =
double
(data_->rotation);
20
cosine_ =
cos
(rad);
21
sine_ = sin(rad);
22
aspect_ratio_ =
float
(this->
get_width
()) / this->
get_height
();
23
}
24
25
void
EllipseMaskOperation::update_memory_buffer_partial
(
MemoryBuffer
*
output
,
26
const
rcti
&area,
27
Span<MemoryBuffer *>
inputs
)
28
{
29
MaskFunc mask_func;
30
switch
(mask_type_) {
31
case
CMP_NODE_MASKTYPE_ADD
:
32
mask_func = [](
const
bool
is_inside
,
const
float
*
mask
,
const
float
*value) {
33
return
is_inside
? std::max(
mask
[0], value[0]) :
mask
[0];
34
};
35
break
;
36
case
CMP_NODE_MASKTYPE_SUBTRACT
:
37
mask_func = [](
const
bool
is_inside
,
const
float
*
mask
,
const
float
*value) {
38
return
is_inside
? std::clamp(
mask
[0] - value[0], 0.0f, 1.0f) :
mask
[0];
39
};
40
break
;
41
case
CMP_NODE_MASKTYPE_MULTIPLY
:
42
mask_func = [](
const
bool
is_inside
,
const
float
*
mask
,
const
float
*value) {
43
return
is_inside
?
mask
[0] * value[0] : 0;
44
};
45
break
;
46
case
CMP_NODE_MASKTYPE_NOT
:
47
mask_func = [](
const
bool
is_inside
,
const
float
*
mask
,
const
float
*value) {
48
if
(
is_inside
) {
49
return
mask
[0] > 0.0f ? 0.0f : value[0];
50
}
51
return
mask
[0];
52
};
53
break
;
54
}
55
apply_mask(
output
, area,
inputs
, mask_func);
56
}
57
58
void
EllipseMaskOperation::apply_mask(
MemoryBuffer
*
output
,
59
const
rcti
&area,
60
Span<MemoryBuffer *>
inputs
,
61
MaskFunc mask_func)
62
{
63
const
MemoryBuffer
*input_mask =
inputs
[0];
64
const
MemoryBuffer
*input_value =
inputs
[1];
65
const
float
op_last_x = std::max(this->
get_width
() - 1.0f, FLT_EPSILON);
66
const
float
op_last_y = std::max(this->
get_height
() - 1.0f, FLT_EPSILON);
67
const
float
half_w = data_->
width
/ 2.0f;
68
const
float
half_h = data_->
height
/ 2.0f;
69
const
float
tx = half_w * half_w;
70
const
float
ty = half_h * half_h;
71
for
(
int
y
= area.
ymin
;
y
< area.
ymax
;
y
++) {
72
const
float
op_ry =
y
/ op_last_y;
73
const
float
dy = (op_ry - data_->
y
) / aspect_ratio_;
74
float
*out =
output
->get_elem(area.
xmin
,
y
);
75
const
float
*
mask
= input_mask->
get_elem
(area.
xmin
,
y
);
76
const
float
*value = input_value->
get_elem
(area.
xmin
,
y
);
77
for
(
int
x
= area.
xmin
;
x
< area.
xmax
;
x
++) {
78
const
float
op_rx =
x
/ op_last_x;
79
const
float
dx = op_rx - data_->
x
;
80
const
float
rx = data_->
x
+ (cosine_ * dx + sine_ * dy);
81
const
float
ry = data_->
y
+ (-sine_ * dx + cosine_ * dy);
82
float
sx = rx - data_->
x
;
83
sx *= sx;
84
float
sy = ry - data_->
y
;
85
sy *= sy;
86
const
bool
inside = ((sx / tx) + (sy / ty)) <= (1.0f + FLT_EPSILON);
87
out[0] = mask_func(inside,
mask
, value);
88
89
mask
+= input_mask->
elem_stride
;
90
value += input_value->
elem_stride
;
91
out +=
output
->elem_stride;
92
}
93
}
94
}
95
96
}
// namespace blender::compositor
x
x
Definition
BLI_expr_pylike_eval_test.cc:345
double
typedef double(DMatrix)[4][4]
COM_EllipseMaskOperation.h
CMP_NODE_MASKTYPE_NOT
@ CMP_NODE_MASKTYPE_NOT
Definition
DNA_node_types.h:987
CMP_NODE_MASKTYPE_SUBTRACT
@ CMP_NODE_MASKTYPE_SUBTRACT
Definition
DNA_node_types.h:985
CMP_NODE_MASKTYPE_MULTIPLY
@ CMP_NODE_MASKTYPE_MULTIPLY
Definition
DNA_node_types.h:986
CMP_NODE_MASKTYPE_ADD
@ CMP_NODE_MASKTYPE_ADD
Definition
DNA_node_types.h:984
output
#define output
blender::Span
Definition
BLI_span.hh:75
blender::compositor::EllipseMaskOperation::init_execution
void init_execution() override
Definition
COM_EllipseMaskOperation.cc:17
blender::compositor::EllipseMaskOperation::EllipseMaskOperation
EllipseMaskOperation()
Definition
COM_EllipseMaskOperation.cc:9
blender::compositor::EllipseMaskOperation::update_memory_buffer_partial
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
Definition
COM_EllipseMaskOperation.cc:25
blender::compositor::MemoryBuffer
a MemoryBuffer contains access to the data
Definition
COM_MemoryBuffer.h:35
blender::compositor::MemoryBuffer::get_elem
float * get_elem(int x, int y)
Definition
COM_MemoryBuffer.h:161
blender::compositor::MemoryBuffer::elem_stride
int elem_stride
Definition
COM_MemoryBuffer.h:44
blender::compositor::NodeOperation::get_height
unsigned int get_height() const
Definition
COM_NodeOperation.h:465
blender::compositor::NodeOperation::add_output_socket
void add_output_socket(DataType datatype)
Definition
COM_NodeOperation.cc:102
blender::compositor::NodeOperation::get_width
unsigned int get_width() const
Definition
COM_NodeOperation.h:460
blender::compositor::NodeOperation::add_input_socket
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
Definition
COM_NodeOperation.cc:97
y
y
Definition
compositor_morphological_blur_info.hh:15
float
draw_view in_light_buf[] float
Definition
eevee_light_culling_info.hh:42
is_inside
static bool is_inside(int x, int y, int cols, int rows)
Definition
filesel.cc:768
blender::compositor::DataType::Value
@ Value
Value data type.
Definition
COM_defines.h:23
cos
ccl_device_inline float3 cos(float3 v)
Definition
math_float3.h:375
mask
ccl_device_inline float4 mask(const int4 mask, const float4 a)
Definition
math_float4.h:559
blender::compositor
Definition
COM_JumpFloodingAlgorithm.cc:20
inputs
static blender::bke::bNodeSocketTemplate inputs[]
Definition
node_texture_at.cc:11
NodeEllipseMask::width
float width
Definition
DNA_node_types.h:1077
NodeEllipseMask::y
float y
Definition
DNA_node_types.h:1074
NodeEllipseMask::x
float x
Definition
DNA_node_types.h:1073
NodeEllipseMask::height
float height
Definition
DNA_node_types.h:1076
rcti
Definition
DNA_vec_types.h:68
rcti::ymin
int ymin
Definition
DNA_vec_types.h:70
rcti::ymax
int ymax
Definition
DNA_vec_types.h:70
rcti::xmin
int xmin
Definition
DNA_vec_types.h:69
rcti::xmax
int xmax
Definition
DNA_vec_types.h:69
Generated on Sat Oct 4 2025 05:32:23 for Blender by
doxygen
1.14.0