Merged 15170:15635 from trunk (no conflicts or even merges)
[blender.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;
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     
57     float atm_HGg;
58
59     float atm_SunIntensity;
60     float atm_InscatteringMultiplier;
61     float atm_ExtinctionMultiplier;
62     float atm_BetaRayMultiplier;
63     float atm_BetaMieMultiplier;
64     float atm_DistanceMultiplier;
65
66     float atm_BetaRay[3];
67     float atm_BetaDashRay[3];
68     float atm_BetaMie[3];
69     float atm_BetaDashMie[3];
70     float atm_BetaRM[3];
71 }SunSky;
72
73 /**
74  * InitSunSky:
75  * this function compute some sun,sky parameters according to input parameters and also initiate some other sun, sky parameters
76  * parameters:
77  * sunSky, is a structure that contains informtion about sun, sky and atmosphere, in this function, most of its values initiated
78  * turb, is atmosphere turbidity
79  * toSun, contains sun direction
80  * horizon_brighness, controls the brightness of the horizon colors
81  * spread, controls colors spreed at horizon
82  * sun_brightness, controls sun's brightness
83  * sun_size, controls sun's size
84  * back_scatter, controls back scatter light
85  * */
86 void InitSunSky(struct SunSky *sunsky, float turb, float *toSun, float horizon_brightness, 
87                                 float spread,float sun_brightness, float sun_size, float back_scatter);
88
89 /**
90  * GetSkyXYZRadiance:
91  * this function compute sky radiance according to a view parameters `theta' and `phi'and sunSky values
92  * parameters:
93  * sunSky, sontains sun and sky parameters
94  * theta, is sun's theta
95  * phi, is sun's phi
96  * color_out, is computed color that shows sky radiance in XYZ color format
97  * */
98 void GetSkyXYZRadiance(struct SunSky* sunsky, float theta, float phi, float color_out[3]);
99
100 /**
101  * GetSkyXYZRadiancef:
102  * this function compute sky radiance according to a view direction `varg' and sunSky values
103  * parameters:
104  * sunSky, sontains sun and sky parameters
105  * varg, shows direction
106  * color_out, is computed color that shows sky radiance in XYZ color format
107  * */
108 void GetSkyXYZRadiancef(struct SunSky* sunsky, const float varg[3], float color_out[3]);
109
110 /**
111  * InitAtmosphere:
112  * this function intiate sunSky structure with user input parameters.
113  * parameters:
114  * sunSky, contains information about sun, and in this function some atmosphere parameters will initiated
115  * sun_intens, shows sun intensity value
116  * mief, Mie scattering factor this factor currently call with 1.0 
117  * rayf, Rayleigh scattering factor, this factor currently call with 1.0
118  * 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
119  * extincf, extinction light factor that range from 0.0 to 1.0, 0.0 means no extinction and 1.0 means full extinction
120  * disf, is distance factor, multiplyed to pixle's z value to compute each pixle's distance to camera, 
121  * */
122 void InitAtmosphere(struct SunSky *sunSky, float sun_intens, float mief, float rayf, float inscattf, float extincf, float disf);
123
124 /**
125  * AtmospherePixleShader:
126  * this function apply atmosphere effect on a pixle color `rgb' at distance `s'
127  * parameters:
128  * sunSky, contains information about sun parameters and user values
129  * view, is camera view vector
130  * s, is distance 
131  * rgb, contains rendered color value for a pixle
132  * */
133 void AtmospherePixleShader( struct SunSky* sunSky, float view[3], float s, float rgb[3]);
134
135 /**
136  * ClipColor:
137  * clip a color to range [0,1];
138  * */
139 void ClipColor(float c[3]);
140
141 #endif /*SUNSKY_H_*/