Blender V5.0
math_dual.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
7#include "util/math_base.h"
8#include "util/types_dual.h"
9
11
16
21
23{
24 return dual3();
25}
26
28{
29 return dual4();
30}
31
32/* Multiplication of dual by scalar. */
33template<class T1, class T2> ccl_device_inline dual<T1> operator*(const dual<T1> a, T2 b)
34{
35 return {a.val * b, a.dx * b, a.dy * b};
36}
37
38/* Negation. */
40{
41 return {-a.val, -a.dx, -a.dy};
42}
43
44template<class T> ccl_device_inline dual1 average(const dual<T> a)
45{
46 return {average(a.val), average(a.dx), average(a.dy)};
47}
48
49template<class T> ccl_device_inline dual1 reduce_add(const dual<T> a)
50{
51 return {reduce_add(a.val), reduce_add(a.dx), reduce_add(a.dy)};
52}
53
54template<class T1, class T2> ccl_device_inline dual1 dot(const dual<T1> a, const T2 b)
55{
56 return reduce_add(a * b);
57}
58
#define ccl_private
#define ccl_device_inline
#define ccl_device_template_spec
#define CCL_NAMESPACE_END
ccl_device_inline dual1 average(const dual< T > a)
Definition math_dual.h:44
ccl_device_inline dual< T > operator-(const ccl_private dual< T > &a)
Definition math_dual.h:39
ccl_device_inline dual1 dot(const dual< T1 > a, const T2 b)
Definition math_dual.h:54
CCL_NAMESPACE_BEGIN ccl_device_template_spec dual1 make_zero()
Definition math_dual.h:12
ccl_device_inline dual1 reduce_add(const dual< T > a)
Definition math_dual.h:49
ccl_device_inline dual< T1 > operator*(const dual< T1 > a, T2 b)
Definition math_dual.h:33
#define T2
Definition md5.cpp:21
T val
Definition types_dual.h:14
dual< float4 > dual4
Definition types_dual.h:59
dual< float3 > dual3
Definition types_dual.h:58
dual< float2 > dual2
Definition types_dual.h:57
dual< float > dual1
Definition types_dual.h:56