Integer socket support in Cycles. Int values are already supported natively in OSL...
[blender.git] / intern / cycles / kernel / svm / svm_gradient.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 CCL_NAMESPACE_BEGIN
20
21 /* Gradient */
22
23 __device float svm_gradient(float3 p, NodeGradientType type)
24 {
25         float x, y, z;
26
27         x = p.x;
28         y = p.y;
29         z = p.z;
30
31         if(type == NODE_BLEND_LINEAR) {
32                 return x;
33         }
34         else if(type == NODE_BLEND_QUADRATIC) {
35                 float r = fmaxf(x, 0.0f);
36                 return r*r;
37         }
38         else if(type == NODE_BLEND_EASING) {
39                 float r = fminf(fmaxf(x, 0.0f), 1.0f);
40                 float t = r*r;
41                 
42                 return (3.0f*t - 2.0f*t*r);
43         }
44         else if(type == NODE_BLEND_DIAGONAL) {
45                 return (x + y)/2.0f;
46         }
47         else if(type == NODE_BLEND_RADIAL) {
48                 return atan2f(y, x) / (2.0f * M_PI_F) + 0.5f;
49         }
50         else {
51                 float r = fmaxf(1.0f - sqrtf(x*x + y*y + z*z), 0.0f);
52
53                 if(type == NODE_BLEND_QUADRATIC_SPHERE)
54                         return r*r;
55                 else if(type == NODE_BLEND_SPHERICAL)
56                         return r;
57         }
58
59         return 0.0f;
60 }
61
62 __device void svm_node_tex_gradient(ShaderData *sd, float *stack, uint4 node)
63 {
64         uint type, co_offset, color_offset, fac_offset;
65
66         decode_node_uchar4(node.y, &type, &co_offset, &fac_offset, &color_offset);
67
68         float3 co = stack_load_float3(stack, co_offset);
69
70         float f = svm_gradient(co, (NodeGradientType)type);
71         f = clamp(f, 0.0f, 1.0f);
72
73         if(stack_valid(fac_offset))
74                 stack_store_float(stack, fac_offset, f);
75         if(stack_valid(color_offset))
76                 stack_store_float3(stack, color_offset, make_float3(f, f, f));
77 }
78
79 CCL_NAMESPACE_END
80