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