Blender V4.3
mix.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
8
9/* Node */
10
13 ccl_private float *stack,
14 uint fac_offset,
15 uint c1_offset,
16 uint c2_offset,
17 int offset)
18{
19 /* read extra data */
20 uint4 node1 = read_node(kg, &offset);
21
22 float fac = stack_load_float(stack, fac_offset);
23 float3 c1 = stack_load_float3(stack, c1_offset);
24 float3 c2 = stack_load_float3(stack, c2_offset);
25 float3 result = svm_mix_clamped_factor((NodeMix)node1.y, fac, c1, c2);
26
27 stack_store_float3(stack, node1.z, result);
28 return offset;
29}
30
32 ccl_private float *stack,
34 uint input_offset,
35 uint result_offset)
36{
37 uint use_clamp, blend_type, use_clamp_result;
38 uint fac_in_stack_offset, a_in_stack_offset, b_in_stack_offset;
39 svm_unpack_node_uchar3(options, &use_clamp, &blend_type, &use_clamp_result);
41 input_offset, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
42
43 float t = stack_load_float(stack, fac_in_stack_offset);
44 if (use_clamp > 0) {
45 t = saturatef(t);
46 }
47 float3 a = stack_load_float3(stack, a_in_stack_offset);
48 float3 b = stack_load_float3(stack, b_in_stack_offset);
49 float3 result = svm_mix((NodeMix)blend_type, t, a, b);
50 if (use_clamp_result) {
51 result = saturate(result);
52 }
53 stack_store_float3(stack, result_offset, result);
54}
55
57 ccl_private float *stack,
58 uint use_clamp,
59 uint input_offset,
60 uint result_offset)
61{
62 uint fac_in_stack_offset, a_in_stack_offset, b_in_stack_offset;
64 input_offset, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
65
66 float t = stack_load_float(stack, fac_in_stack_offset);
67 if (use_clamp > 0) {
68 t = saturatef(t);
69 }
70 float a = stack_load_float(stack, a_in_stack_offset);
71 float b = stack_load_float(stack, b_in_stack_offset);
72 float result = a * (1 - t) + b * t;
73
74 stack_store_float(stack, result_offset, result);
75}
76
78 ccl_private float *stack,
79 uint input_offset,
80 uint result_offset)
81{
82 uint use_clamp, fac_in_stack_offset, a_in_stack_offset, b_in_stack_offset;
84 input_offset, &use_clamp, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
85
86 float t = stack_load_float(stack, fac_in_stack_offset);
87 if (use_clamp > 0) {
88 t = saturatef(t);
89 }
90 float3 a = stack_load_float3(stack, a_in_stack_offset);
91 float3 b = stack_load_float3(stack, b_in_stack_offset);
92 float3 result = a * (one_float3() - t) + b * t;
93 stack_store_float3(stack, result_offset, result);
94}
95
97 ccl_private float *stack,
98 uint input_offset,
99 uint result_offset)
100{
101 uint use_clamp, fac_in_stack_offset, a_in_stack_offset, b_in_stack_offset;
103 input_offset, &use_clamp, &fac_in_stack_offset, &a_in_stack_offset, &b_in_stack_offset);
104
105 float3 t = stack_load_float3(stack, fac_in_stack_offset);
106 if (use_clamp > 0) {
107 t = saturate(t);
108 }
109 float3 a = stack_load_float3(stack, a_in_stack_offset);
110 float3 b = stack_load_float3(stack, b_in_stack_offset);
111 float3 result = a * (one_float3() - t) + b * t;
112 stack_store_float3(stack, result_offset, result);
113}
114
unsigned int uint
#define saturate(a)
ccl_device_noinline_cpu float3 svm_mix(NodeMix type, float t, float3 c1, float3 c2)
Definition color_util.h:256
ccl_device_noinline_cpu float3 svm_mix_clamped_factor(NodeMix type, float t, float3 c1, float3 c2)
Definition color_util.h:304
local_group_size(16, 16) .push_constant(Type b
CCL_NAMESPACE_BEGIN struct Options options
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define ccl_private
#define ccl_device_noinline
#define CCL_NAMESPACE_END
#define saturatef(x)
ccl_device_inline void stack_store_float3(ccl_private float *stack, uint a, float3 f)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(ccl_private float *stack, uint a)
ccl_device_inline uint4 read_node(KernelGlobals kg, ccl_private int *offset)
ccl_device_forceinline void svm_unpack_node_uchar3(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
ccl_device_inline void stack_store_float(ccl_private float *stack, uint a, float f)
ccl_device_inline float stack_load_float(ccl_private float *stack, uint a)
ccl_device_forceinline void svm_unpack_node_uchar4(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z, ccl_private uint *w)
ShaderData
ccl_device_inline float3 one_float3()
Definition math_float3.h:24
ccl_device_noinline void svm_node_mix_vector(ccl_private ShaderData *sd, ccl_private float *stack, uint input_offset, uint result_offset)
Definition mix.h:77
ccl_device_noinline void svm_node_mix_color(ccl_private ShaderData *sd, ccl_private float *stack, uint options, uint input_offset, uint result_offset)
Definition mix.h:31
ccl_device_noinline void svm_node_mix_vector_non_uniform(ccl_private ShaderData *sd, ccl_private float *stack, uint input_offset, uint result_offset)
Definition mix.h:96
CCL_NAMESPACE_BEGIN ccl_device_noinline int svm_node_mix(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint fac_offset, uint c1_offset, uint c2_offset, int offset)
Definition mix.h:11
ccl_device_noinline void svm_node_mix_float(ccl_private ShaderData *sd, ccl_private float *stack, uint use_clamp, uint input_offset, uint result_offset)
Definition mix.h:56
uint y
Definition types_uint4.h:15
uint z
Definition types_uint4.h:15