Cycles: svn merge -r41225:41232 ^/trunk/blender
[blender.git] / intern / cycles / kernel / osl / nodes / node_blend_texture.osl
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 #include "stdosl.h"
20 #include "node_texture.h"
21
22 /* Blend */
23
24 float blend(point p, string progression, string axis)
25 {
26         float x, y;
27
28         if(axis == "Vertical") {
29                 x= p[1];
30                 y= p[0];
31         }
32         else {
33                 x= p[0];
34                 y= p[1];
35         }
36
37         float result = 0.0;
38
39         if(progression == "Linear") {
40                 result = (1.0 + x)/2.0;
41         }
42         else if(progression == "Quadratic") {
43                 float r = max((1.0 + x)/2.0, 0.0);
44                 result = r*r;
45         }
46         else if(progression == "Easing") {
47                 float r = min(max((1.0 + x)/2.0, 0.0), 1.0);
48                 float t = r*r;
49                 
50                 result = (3.0*t - 2.0*t*r);
51         }
52         else if(progression == "Diagonal") {
53                 result = (2.0 + x + y)/4.0;
54         }
55         else if(progression == "Radial") {
56                 result = atan2(y, x)/(2*M_PI) + 0.5;
57         }
58         else {
59                 float r = max(1.0 - sqrt(x*x + y*y + p[2]*p[2]), 0.0);
60
61                 if(progression == "Quadratic Sphere")
62                         result = r*r;
63                 else if(progression == "Spherical")
64                         result = r;
65         }
66
67         return result;
68 }
69
70 shader node_blend_texture(
71         string Progression = "Linear",
72         string Axis = "Horizontal",
73         point Vector = P,
74         output float Fac = 0.0)
75 {
76         Fac = blend(Vector, Progression, Axis);
77 }
78