Merging fluidcontrol to trunk from rev16649 fluidcontrol branch. Code provided by...
[blender-staging.git] / source / blender / render / intern / include / sunsky.h
1  /**
2  * ***** BEGIN GPL LICENSE BLOCK *****
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17  *
18  * Contributor(s): zaghaghi
19  * 
20  * ***** END GPL LICENSE BLOCK *****
21  */
22 /**
23  * This feature comes from Preetham paper on "A Practical Analytic Model for Daylight" 
24  * and example code from Brian Smits, another author of that paper in 
25  * http://www.cs.utah.edu/vissim/papers/sunsky/code/
26  * */
27 #ifndef SUNSKY_H_
28 #define SUNSKY_H_
29
30 #define SPECTRUM_MAX_COMPONENTS     100
31 #define SPECTRUM_START              350.0
32 #define SPECTRUM_END                800.0
33
34 typedef struct SunSky
35 {
36     short effect_type, skyblendtype;
37     float turbidity;
38     float theta, phi;
39     
40     float toSun[3];
41
42     /*float sunSpectralRaddata[SPECTRUM_MAX_COMPONENTS];*/
43     float sunSolidAngle;
44
45     float zenith_Y, zenith_x, zenith_y;
46     
47     float perez_Y[5], perez_x[5], perez_y[5];
48
49     /* suggested by glome in 
50      * http://projects.blender.org/tracker/?func=detail&atid=127&aid=8063&group_id=9*/
51     float horizon_brightness;
52     float spread;
53     float sun_brightness;
54     float sun_size;
55     float backscattered_light;
56     float skyblendfac;
57         
58     float atm_HGg;
59
60     float atm_SunIntensity;
61     float atm_InscatteringMultiplier;
62     float atm_ExtinctionMultiplier;
63     float atm_BetaRayMultiplier;
64     float atm_BetaMieMultiplier;
65     float atm_DistanceMultiplier;
66
67     float atm_BetaRay[3];
68     float atm_BetaDashRay[3];
69     float atm_BetaMie[3];
70     float atm_BetaDashMie[3];
71     float atm_BetaRM[3];
72 }SunSky;
73
74 /**
75  * InitSunSky:
76  * this function compute some sun,sky parameters according to input parameters and also initiate some other sun, sky parameters
77  * parameters:
78  * sunSky, is a structure that contains informtion about sun, sky and atmosphere, in this function, most of its values initiated
79  * turb, is atmosphere turbidity
80  * toSun, contains sun direction
81  * horizon_brighness, controls the brightness of the horizon colors
82  * spread, controls colors spreed at horizon
83  * sun_brightness, controls sun's brightness
84  * sun_size, controls sun's size
85  * back_scatter, controls back scatter light
86  * */
87 void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_brightness, 
88                                 float spread,float sun_brightness, float sun_size, float back_scatter,
89                                 float skyblendfac, short skyblendtype);
90
91 /**
92  * GetSkyXYZRadiance:
93  * this function compute sky radiance according to a view parameters `theta' and `phi'and sunSky values
94  * parameters:
95  * sunSky, sontains sun and sky parameters
96  * theta, is sun's theta
97  * phi, is sun's phi
98  * color_out, is computed color that shows sky radiance in XYZ color format
99  * */
100 void GetSkyXYZRadiance(struct SunSky* sunsky, float theta, float phi, float color_out[3]);
101
102 /**
103  * GetSkyXYZRadiancef:
104  * this function compute sky radiance according to a view direction `varg' and sunSky values
105  * parameters:
106  * sunSky, sontains sun and sky parameters
107  * varg, shows direction
108  * color_out, is computed color that shows sky radiance in XYZ color format
109  * */
110 void GetSkyXYZRadiancef(struct SunSky* sunsky, const float varg[3], float color_out[3]);
111
112 /**
113  * InitAtmosphere:
114  * this function intiate sunSky structure with user input parameters.
115  * parameters:
116  * sunSky, contains information about sun, and in this function some atmosphere parameters will initiated
117  * sun_intens, shows sun intensity value
118  * mief, Mie scattering factor this factor currently call with 1.0 
119  * rayf, Rayleigh scattering factor, this factor currently call with 1.0
120  * inscattf, inscatter light factor that range from 0.0 to 1.0, 0.0 means no inscatter light and 1.0 means full inscatter light
121  * extincf, extinction light factor that range from 0.0 to 1.0, 0.0 means no extinction and 1.0 means full extinction
122  * disf, is distance factor, multiplyed to pixle's z value to compute each pixle's distance to camera, 
123  * */
124 void InitAtmosphere(struct SunSky *sunSky, float sun_intens, float mief, float rayf, float inscattf, float extincf, float disf);
125
126 /**
127  * AtmospherePixleShader:
128  * this function apply atmosphere effect on a pixle color `rgb' at distance `s'
129  * parameters:
130  * sunSky, contains information about sun parameters and user values
131  * view, is camera view vector
132  * s, is distance 
133  * rgb, contains rendered color value for a pixle
134  * */
135 void AtmospherePixleShader( struct SunSky* sunSky, float view[3], float s, float rgb[3]);
136
137 /**
138  * ClipColor:
139  * clip a color to range [0,1];
140  * */
141 void ClipColor(float c[3]);
142
143 #endif /*SUNSKY_H_*/