Blender V4.3
COM_MathBaseOperation.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_math_rotation.h"
8
9namespace blender::compositor {
10
12{
13 /* TODO(manzanilla): after removing tiled implementation, template this class to only add needed
14 * number of inputs. */
19 use_clamp_ = false;
21}
22
23void MathBaseOperation::determine_canvas(const rcti &preferred_area, rcti &r_area)
24{
25 NodeOperationInput *socket;
26 rcti temp_area = COM_AREA_NONE;
27 socket = this->get_input_socket(0);
28 const bool determined = socket->determine_canvas(COM_AREA_NONE, temp_area);
29 if (determined) {
31 }
32 else {
34 }
35 NodeOperation::determine_canvas(preferred_area, r_area);
36}
37
39 const rcti &area,
41{
42 BuffersIterator<float> it = output->iterate_with(inputs, area);
44}
45
47{
48 for (; !it.is_end(); ++it) {
49 const float divisor = *it.in(1);
50 *it.out = clamp_when_enabled((divisor == 0) ? 0 : *it.in(0) / divisor);
51 }
52}
53
55{
56 for (; !it.is_end(); ++it) {
57 *it.out = sin(*it.in(0));
58 clamp_when_enabled(it.out);
59 }
60}
61
63{
64 for (; !it.is_end(); ++it) {
65 *it.out = cos(*it.in(0));
66 clamp_when_enabled(it.out);
67 }
68}
69
71{
72 for (; !it.is_end(); ++it) {
73 *it.out = tan(*it.in(0));
74 clamp_when_enabled(it.out);
75 }
76}
77
79{
80 for (; !it.is_end(); ++it) {
81 *it.out = sinh(*it.in(0));
82 clamp_when_enabled(it.out);
83 }
84}
85
87{
88 for (; !it.is_end(); ++it) {
89 *it.out = cosh(*it.in(0));
90 clamp_when_enabled(it.out);
91 }
92}
93
95{
96 for (; !it.is_end(); ++it) {
97 *it.out = tanh(*it.in(0));
98 clamp_when_enabled(it.out);
99 }
100}
101
103{
104 for (; !it.is_end(); ++it) {
105 float value1 = *it.in(0);
106 *it.out = clamp_when_enabled((value1 <= 1 && value1 >= -1) ? asin(value1) : 0.0f);
107 }
108}
109
111{
112 for (; !it.is_end(); ++it) {
113 float value1 = *it.in(0);
114 *it.out = clamp_when_enabled((value1 <= 1 && value1 >= -1) ? acos(value1) : 0.0f);
115 }
116}
117
119{
120 for (; !it.is_end(); ++it) {
121 *it.out = atan(*it.in(0));
122 clamp_when_enabled(it.out);
123 }
124}
125
127{
128 for (; !it.is_end(); ++it) {
129 const float value1 = *it.in(0);
130 const float value2 = *it.in(1);
131 if (value1 >= 0) {
132 *it.out = pow(value1, value2);
133 }
134 else {
135 const float y_mod_1 = fmod(value2, 1);
136 /* If input value is not nearly an integer, fall back to zero, nicer than straight rounding.
137 */
138 if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) {
139 *it.out = pow(value1, floorf(value2 + 0.5f));
140 }
141 else {
142 *it.out = 0.0f;
143 }
144 }
145 clamp_when_enabled(it.out);
146 }
147}
148
150{
151 for (; !it.is_end(); ++it) {
152 const float value1 = *it.in(0);
153 const float value2 = *it.in(1);
154 if (value1 > 0 && value2 > 0) {
155 *it.out = log(value1) / log(value2);
156 }
157 else {
158 *it.out = 0.0;
159 }
160 clamp_when_enabled(it.out);
161 }
162}
163
165{
166 for (; !it.is_end(); ++it) {
167 *it.out = std::min(*it.in(0), *it.in(1));
168 clamp_when_enabled(it.out);
169 }
170}
171
173{
174 for (; !it.is_end(); ++it) {
175 *it.out = std::max(*it.in(0), *it.in(1));
176 clamp_when_enabled(it.out);
177 }
178}
179
181{
182 for (; !it.is_end(); ++it) {
183 *it.out = round(*it.in(0));
184 clamp_when_enabled(it.out);
185 }
186}
187
189{
190 for (; !it.is_end(); ++it) {
191 const float value2 = *it.in(1);
192 *it.out = (value2 == 0) ? 0 : fmod(*it.in(0), value2);
193 clamp_when_enabled(it.out);
194 }
195}
196
198{
199 for (; !it.is_end(); ++it) {
200 const float value2 = *it.in(1);
201 *it.out = (value2 == 0) ? 0 : *it.in(0) - floorf(*it.in(0) / value2) * value2;
202 clamp_when_enabled(it.out);
203 }
204}
205
207{
208 for (; !it.is_end(); ++it) {
209 *it.out = fabs(*it.in(0));
210 clamp_when_enabled(it.out);
211 }
212}
213
215{
216 for (; !it.is_end(); ++it) {
217 *it.out = DEG2RADF(*it.in(0));
218 clamp_when_enabled(it.out);
219 }
220}
221
223{
224 for (; !it.is_end(); ++it) {
225 *it.out = RAD2DEGF(*it.in(0));
226 clamp_when_enabled(it.out);
227 }
228}
229
231{
232 for (; !it.is_end(); ++it) {
233 *it.out = atan2(*it.in(0), *it.in(1));
234 clamp_when_enabled(it.out);
235 }
236}
237
239{
240 for (; !it.is_end(); ++it) {
241 *it.out = floor(*it.in(0));
242 clamp_when_enabled(it.out);
243 }
244}
245
247{
248 for (; !it.is_end(); ++it) {
249 *it.out = ceil(*it.in(0));
250 clamp_when_enabled(it.out);
251 }
252}
253
255{
256 for (; !it.is_end(); ++it) {
257 const float value = *it.in(0);
258 *it.out = clamp_when_enabled(value - floor(value));
259 }
260}
261
263{
264 for (; !it.is_end(); ++it) {
265 const float value = *it.in(0);
266 *it.out = clamp_when_enabled(value > 0 ? sqrt(value) : 0.0f);
267 }
268}
269
271{
272 for (; !it.is_end(); ++it) {
273 const float value = *it.in(0);
274 *it.out = clamp_when_enabled(value > 0 ? 1.0f / sqrt(value) : 0.0f);
275 }
276}
277
279{
280 for (; !it.is_end(); ++it) {
281 *it.out = compatible_signf(*it.in(0));
282 clamp_when_enabled(it.out);
283 }
284}
285
287{
288 for (; !it.is_end(); ++it) {
289 *it.out = expf(*it.in(0));
290 clamp_when_enabled(it.out);
291 }
292}
293
295{
296 for (; !it.is_end(); ++it) {
297 const float value = *it.in(0);
298 *it.out = (value >= 0.0f) ? floor(value) : ceil(value);
299 clamp_when_enabled(it.out);
300 }
301}
302
304{
305 for (; !it.is_end(); ++it) {
306 const float value1 = *it.in(0);
307 const float value2 = *it.in(1);
308 if (value1 == 0 || value2 == 0) { /* Avoid dividing by zero. */
309 *it.out = 0.0f;
310 }
311 else {
312 *it.out = floorf(value1 / value2) * value2;
313 }
314 clamp_when_enabled(it.out);
315 }
316}
317
319{
320 for (; !it.is_end(); ++it) {
321 *it.out = wrapf(*it.in(0), *it.in(1), *it.in(2));
322 clamp_when_enabled(it.out);
323 }
324}
325
327{
328 for (; !it.is_end(); ++it) {
329 *it.out = pingpongf(*it.in(0), *it.in(1));
330 clamp_when_enabled(it.out);
331 }
332}
333
335{
336 for (; !it.is_end(); ++it) {
337 *it.out = (fabsf(*it.in(0) - *it.in(1)) <= std::max(*it.in(2), 1e-5f)) ? 1.0f : 0.0f;
338 clamp_when_enabled(it.out);
339 }
340}
341
343{
344 for (; !it.is_end(); ++it) {
345 *it.out = it.in(0)[0] * it.in(1)[0] + it.in(2)[0];
346 clamp_when_enabled(it.out);
347 }
348}
349
351{
352 for (; !it.is_end(); ++it) {
353 *it.out = smoothminf(*it.in(0), *it.in(1), *it.in(2));
354 clamp_when_enabled(it.out);
355 }
356}
357
359{
360 for (; !it.is_end(); ++it) {
361 *it.out = -smoothminf(-it.in(0)[0], -it.in(1)[0], it.in(2)[0]);
362 clamp_when_enabled(it.out);
363 }
364}
365
366} // namespace blender::compositor
sqrt(x)+1/max(0
#define DEG2RADF(_deg)
#define RAD2DEGF(_rad)
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) final
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
a MemoryBuffer contains access to the data
bool determine_canvas(const rcti &preferred_area, rcti &r_area)
void add_output_socket(DataType datatype)
NodeOperationInput * get_input_socket(unsigned int index)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
void set_canvas_input_index(unsigned int index)
set the index of the input socket that will determine the canvas of this operation
virtual void determine_canvas(const rcti &preferred_area, rcti &r_area)
pow(value.r - subtrahend, 2.0)") .do_static_compilation(true)
#define expf(x)
#define floorf(x)
#define fabsf(x)
MINLINE float smoothminf(float a, float b, float c)
MINLINE float pingpongf(float value, float scale)
MINLINE float compatible_signf(float f)
MINLINE float wrapf(float value, float max, float min)
ccl_device_inline float2 fmod(const float2 a, const float b)
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline float3 ceil(const float3 a)
ccl_device_inline float3 cos(float3 v)
ccl_device_inline float3 log(float3 v)
constexpr rcti COM_AREA_NONE
Definition COM_defines.h:89
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator