Blender V4.3
gradient.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/* Gradient */
10
12{
13 float x, y, z;
14
15 x = p.x;
16 y = p.y;
17 z = p.z;
18
19 if (type == NODE_BLEND_LINEAR) {
20 return x;
21 }
22 else if (type == NODE_BLEND_QUADRATIC) {
23 float r = fmaxf(x, 0.0f);
24 return r * r;
25 }
26 else if (type == NODE_BLEND_EASING) {
27 float r = fminf(fmaxf(x, 0.0f), 1.0f);
28 float t = r * r;
29
30 return (3.0f * t - 2.0f * t * r);
31 }
32 else if (type == NODE_BLEND_DIAGONAL) {
33 return (x + y) * 0.5f;
34 }
35 else if (type == NODE_BLEND_RADIAL) {
36 return atan2f(y, x) / M_2PI_F + 0.5f;
37 }
38 else {
39 /* Bias a little bit for the case where p is a unit length vector,
40 * to get exactly zero instead of a small random value depending
41 * on float precision. */
42 float r = fmaxf(0.999999f - sqrtf(x * x + y * y + z * z), 0.0f);
43
44 if (type == NODE_BLEND_QUADRATIC_SPHERE) {
45 return r * r;
46 }
47 else if (type == NODE_BLEND_SPHERICAL) {
48 return r;
49 }
50 }
51
52 return 0.0f;
53}
54
56 ccl_private float *stack,
57 uint4 node)
58{
59 uint type, co_offset, color_offset, fac_offset;
60
61 svm_unpack_node_uchar4(node.y, &type, &co_offset, &fac_offset, &color_offset);
62
63 float3 co = stack_load_float3(stack, co_offset);
64
65 float f = svm_gradient(co, (NodeGradientType)type);
66 f = saturatef(f);
67
68 if (stack_valid(fac_offset))
69 stack_store_float(stack, fac_offset, f);
70 if (stack_valid(color_offset))
71 stack_store_float3(stack, color_offset, make_float3(f, f, f));
72}
73
unsigned int uint
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
#define ccl_device
#define ccl_private
#define ccl_device_noinline
#define CCL_NAMESPACE_END
#define saturatef(x)
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
#define atan2f(x, y)
#define fmaxf(x, y)
#define fminf(x, y)
#define sqrtf(x)
CCL_NAMESPACE_BEGIN ccl_device float svm_gradient(float3 p, NodeGradientType type)
Definition gradient.h:11
ccl_device_noinline void svm_node_tex_gradient(ccl_private ShaderData *sd, ccl_private float *stack, uint4 node)
Definition gradient.h:55
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 void stack_store_float(ccl_private float *stack, uint a, float f)
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)
ccl_device_inline bool stack_valid(uint a)
NodeGradientType
@ NODE_BLEND_QUADRATIC
@ NODE_BLEND_DIAGONAL
@ NODE_BLEND_EASING
@ NODE_BLEND_RADIAL
@ NODE_BLEND_SPHERICAL
@ NODE_BLEND_QUADRATIC_SPHERE
@ NODE_BLEND_LINEAR
ShaderData
#define M_2PI_F
Definition sky_float3.h:23
float z
Definition sky_float3.h:27
float y
Definition sky_float3.h:27
float x
Definition sky_float3.h:27