Blender
V4.3
source
blender
compositor
operations
COM_NormalizeOperation.cc
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2012 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
5
#include "
COM_NormalizeOperation.h
"
6
7
namespace
blender::compositor
{
8
9
NormalizeOperation::NormalizeOperation
()
10
{
11
this->
add_input_socket
(
DataType::Value
);
12
this->
add_output_socket
(
DataType::Value
);
13
cached_instance_
=
nullptr
;
14
flags_
.can_be_constant =
true
;
15
}
16
17
void
NormalizeOperation::deinit_execution
()
18
{
19
delete
cached_instance_
;
20
cached_instance_
=
nullptr
;
21
}
22
23
/* The code below assumes all data is inside range +- this, and that input buffer is single channel
24
*/
25
#define BLENDER_ZMAX 10000.0f
26
27
void
NormalizeOperation::get_area_of_interest
(
const
int
/*input_idx*/
,
28
const
rcti
&
/*output_area*/
,
29
rcti
&r_input_area)
30
{
31
r_input_area =
get_input_operation
(0)->
get_canvas
();
32
}
33
34
void
NormalizeOperation::update_memory_buffer_started
(
MemoryBuffer
*
/*output*/
,
35
const
rcti
&
/*area*/
,
36
Span<MemoryBuffer *>
inputs
)
37
{
38
if
(
cached_instance_
==
nullptr
) {
39
MemoryBuffer
*input =
inputs
[0];
40
41
/* Using generic two floats struct to store `x: min`, `y: multiply`. */
42
NodeTwoFloats
*minmult =
new
NodeTwoFloats
();
43
44
float
minv = 1.0f +
BLENDER_ZMAX
;
45
float
maxv = -1.0f -
BLENDER_ZMAX
;
46
for
(
const
float
*elem : input->
as_range
()) {
47
const
float
value = *elem;
48
if
((value > maxv) && (value <=
BLENDER_ZMAX
)) {
49
maxv = value;
50
}
51
if
((value < minv) && (value >= -
BLENDER_ZMAX
)) {
52
minv = value;
53
}
54
}
55
56
minmult->
x
= minv;
57
/* The case of a flat buffer would cause a divide by 0. */
58
minmult->
y
= ((maxv != minv) ? 1.0f / (maxv - minv) : 0.0f);
59
60
cached_instance_
= minmult;
61
}
62
}
63
64
void
NormalizeOperation::update_memory_buffer_partial
(
MemoryBuffer
*
output
,
65
const
rcti
&area,
66
Span<MemoryBuffer *>
inputs
)
67
{
68
NodeTwoFloats
*minmult =
cached_instance_
;
69
for
(
BuffersIterator<float>
it =
output
->iterate_with(
inputs
, area); !it.is_end(); ++it) {
70
const
float
input_value = *it.in(0);
71
72
*it.out = (input_value - minmult->
x
) * minmult->
y
;
73
74
/* Clamp infinities. */
75
CLAMP
(*it.out, 0.0f, 1.0f);
76
}
77
}
78
79
}
// namespace blender::compositor
CLAMP
#define CLAMP(a, b, c)
Definition
BLI_utildefines.h:211
BLENDER_ZMAX
#define BLENDER_ZMAX
Definition
COM_MapRangeOperation.cc:23
COM_NormalizeOperation.h
NodeTwoFloats
struct NodeTwoFloats NodeTwoFloats
output
#define output
blender::Span
Definition
BLI_span.hh:75
blender::compositor::MemoryBuffer
a MemoryBuffer contains access to the data
Definition
COM_MemoryBuffer.h:35
blender::compositor::MemoryBuffer::as_range
BufferRange< float > as_range()
Definition
COM_MemoryBuffer.h:340
blender::compositor::NodeOperation::add_output_socket
void add_output_socket(DataType datatype)
Definition
COM_NodeOperation.cc:102
blender::compositor::NodeOperation::flags_
NodeOperationFlags flags_
Definition
COM_NodeOperation.h:295
blender::compositor::NodeOperation::get_canvas
const rcti & get_canvas() const
Definition
COM_NodeOperation.cc:169
blender::compositor::NodeOperation::get_input_operation
NodeOperation * get_input_operation(int index)
Definition
COM_NodeOperation.cc:185
blender::compositor::NodeOperation::add_input_socket
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
Definition
COM_NodeOperation.cc:97
blender::compositor::NormalizeOperation::NormalizeOperation
NormalizeOperation()
Definition
COM_NormalizeOperation.cc:9
blender::compositor::NormalizeOperation::get_area_of_interest
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
Definition
COM_NormalizeOperation.cc:27
blender::compositor::NormalizeOperation::update_memory_buffer_started
void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
Definition
COM_NormalizeOperation.cc:34
blender::compositor::NormalizeOperation::update_memory_buffer_partial
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
Definition
COM_NormalizeOperation.cc:64
blender::compositor::NormalizeOperation::deinit_execution
void deinit_execution() override
Definition
COM_NormalizeOperation.cc:17
blender::compositor::NormalizeOperation::cached_instance_
NodeTwoFloats * cached_instance_
temporarily cache of the execution storage it stores x->min and y->multiply.
Definition
COM_NormalizeOperation.h:22
blender::compositor::DataType::Value
@ Value
Value data type.
Definition
COM_defines.h:23
blender::compositor
Definition
COM_JumpFloodingAlgorithm.cc:20
blender::compositor::BuffersIterator
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
Definition
COM_BuffersIterator.h:179
inputs
static blender::bke::bNodeSocketTemplate inputs[]
Definition
node_texture_at.cc:11
NodeTwoFloats
Definition
DNA_node_types.h:1184
NodeTwoFloats::x
float x
Definition
DNA_node_types.h:1185
NodeTwoFloats::y
float y
Definition
DNA_node_types.h:1185
rcti
Definition
DNA_vec_types.h:68
Generated on Sat Oct 4 2025 05:32:23 for Blender by
doxygen
1.14.0