Blender V5.0
types_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/types_float2.h"
8#include "util/types_float3.h"
9#include "util/types_float4.h"
10
12
13template<class T> struct dual {
14 T val = T(), dx = T(), dy = T();
15 dual() = default;
16 ccl_device_inline_method explicit dual(const T val) : val(val) {}
17 ccl_device_inline_method dual(const T val, const T dx, const T dy) : val(val), dx(dx), dy(dy) {}
18};
19
20template<> struct dual<float2> {
24 dual() = default;
27 : val(val), dx(dx), dy(dy)
28 {
29 }
30};
31
32template<> struct dual<float3> {
36 dual() = default;
39 : val(val), dx(dx), dy(dy)
40 {
41 }
42};
43
44template<> struct dual<float4> {
48 dual() = default;
51 : val(val), dx(dx), dy(dy)
52 {
53 }
54};
55
60
62{
63 return {make_float3(a.val), make_float3(a.dx), make_float3(a.dy)};
64}
65
67{
68 return {make_float3(a.val, b.val, c.val),
69 make_float3(a.dx, b.dx, c.dx),
70 make_float3(a.dy, b.dy, c.dy)};
71}
72
74{
75 return {make_float4(a.val), make_float4(a.dx, 0.0f), make_float4(a.dy, 0.0f)};
76}
77
79{
80 return {make_float4(a.val, 1.0f), make_float4(a.dx, 0.0f), make_float4(a.dy, 0.0f)};
81}
82
83ccl_device_inline void print_dual1(const ccl_private char *label, const dual1 a)
84{
85#ifdef __KERNEL_PRINTF__
86 printf("%s: {\nval = %.8f\n dx = %.8f\n dy = %.8f\n}\n",
87 label,
88 (double)a.val,
89 (double)a.dx,
90 (double)a.dy);
91#else
92 (void)label;
93 (void)a;
94#endif
95}
96
97ccl_device_inline void print_dual2(const ccl_private char *label, const dual2 a)
98{
99#ifdef __KERNEL_PRINTF__
100 printf("%s: {\nval = %.8f %.8f\n dx = %.8f %.8f\n dy = %.8f %.8f\n}\n",
101 label,
102 (double)a.val.x,
103 (double)a.val.y,
104 (double)a.dx.x,
105 (double)a.dx.y,
106 (double)a.dy.x,
107 (double)a.dy.y);
108#else
109 (void)label;
110 (void)a;
111#endif
112}
113
114ccl_device_inline void print_dual3(const ccl_private char *label, const dual3 a)
115{
116#ifdef __KERNEL_PRINTF__
117 printf("%s: {\nval = %.8f %.8f %.8f\n dx = %.8f %.8f %.8f\n dy = %.8f %.8f %.8f\n}\n",
118 label,
119 (double)a.val.x,
120 (double)a.val.y,
121 (double)a.val.z,
122 (double)a.dx.x,
123 (double)a.dx.y,
124 (double)a.dx.z,
125 (double)a.dy.x,
126 (double)a.dy.y,
127 (double)a.dy.z);
128#else
129 (void)label;
130 (void)a;
131#endif
132}
133
#define ccl_private
#define ccl_device_inline
#define ccl_device_inline_method
#define CCL_NAMESPACE_END
#define printf(...)
#define T
#define make_float2
#define make_float4
ccl_device_inline_method dual(const float2 val)
Definition types_dual.h:25
ccl_device_inline_method dual(const float2 val, const float2 dx, const float2 dy)
Definition types_dual.h:26
dual()=default
dual()=default
ccl_device_inline_method dual(const float3 val)
Definition types_dual.h:37
ccl_device_inline_method dual(const float3 val, const float3 dx, const float3 dy)
Definition types_dual.h:38
ccl_device_inline_method dual(const float4 val)
Definition types_dual.h:49
dual()=default
ccl_device_inline_method dual(const float4 val, const float4 dx, const float4 dy)
Definition types_dual.h:50
dual()=default
ccl_device_inline_method dual(const T val, const T dx, const T dy)
Definition types_dual.h:17
ccl_device_inline_method dual(const T val)
Definition types_dual.h:16
float x
float y
float z
Definition sky_math.h:136
float y
Definition sky_math.h:136
float x
Definition sky_math.h:136
ccl_device_inline dual3 make_float3(const ccl_private dual< T > &a)
Definition types_dual.h:61
dual< float4 > dual4
Definition types_dual.h:59
ccl_device_inline void print_dual2(const ccl_private char *label, const dual2 a)
Definition types_dual.h:97
ccl_device_inline void print_dual1(const ccl_private char *label, const dual1 a)
Definition types_dual.h:83
ccl_device_inline void print_dual3(const ccl_private char *label, const dual3 a)
Definition types_dual.h:114
dual< float3 > dual3
Definition types_dual.h:58
dual< float2 > dual2
Definition types_dual.h:57
ccl_device_inline dual4 make_homogeneous(const dual3 a)
Definition types_dual.h:78
dual< float > dual1
Definition types_dual.h:56