112 # define MATH_PI 3.141592653589793
115 #ifndef MATH_DEG_TO_RAD
116 # define MATH_DEG_TO_RAD (MATH_PI / 180.0)
120 # define DEGREES *MATH_DEG_TO_RAD
123 #ifndef TERRESTRIAL_SOLAR_RADIUS
124 # define TERRESTRIAL_SOLAR_RADIUS ((0.51 DEGREES) / 2.0)
128 # define ALLOC(_struct) ((_struct *)malloc(sizeof(_struct)))
142 double solar_elevation)
144 const double *elev_matrix;
146 int int_turbidity = (int)turbidity;
147 double turbidity_rem = turbidity - (
double)int_turbidity;
149 solar_elevation =
pow(solar_elevation / (
MATH_PI / 2.0), (1.0 / 3.0));
153 elev_matrix = dataset + (9 * 6 * (int_turbidity - 1));
155 for (
unsigned int i = 0; i < 9; ++i) {
158 (1.0 - albedo) * (1.0 - turbidity_rem) *
159 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
160 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
161 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
162 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
163 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
164 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
168 elev_matrix = dataset + (9 * 6 * 10 + 9 * 6 * (int_turbidity - 1));
169 for (
unsigned int i = 0; i < 9; ++i) {
172 (albedo) * (1.0 - turbidity_rem) *
173 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
174 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
175 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
176 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
177 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
178 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
181 if (int_turbidity == 10) {
186 elev_matrix = dataset + (9 * 6 * (int_turbidity));
187 for (
unsigned int i = 0; i < 9; ++i) {
190 (1.0 - albedo) * (turbidity_rem) *
191 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
192 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
193 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
194 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
195 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
196 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
200 elev_matrix = dataset + (9 * 6 * 10 + 9 * 6 * (int_turbidity));
201 for (
unsigned int i = 0; i < 9; ++i) {
204 (albedo) * (turbidity_rem) *
205 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
206 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
207 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
208 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
209 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
210 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
217 double solar_elevation)
219 const double *elev_matrix;
221 int int_turbidity = (int)turbidity;
222 double turbidity_rem = turbidity - (
double)int_turbidity;
224 solar_elevation =
pow(solar_elevation / (
MATH_PI / 2.0), (1.0 / 3.0));
227 elev_matrix = dataset + (6 * (int_turbidity - 1));
229 res = (1.0 - albedo) * (1.0 - turbidity_rem) *
230 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
231 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
232 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
233 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
234 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
235 pow(solar_elevation, 5.0) * elev_matrix[5]);
238 elev_matrix = dataset + (6 * 10 + 6 * (int_turbidity - 1));
240 res += (albedo) * (1.0 - turbidity_rem) *
241 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
242 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
243 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
244 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
245 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
246 pow(solar_elevation, 5.0) * elev_matrix[5]);
247 if (int_turbidity == 10) {
252 elev_matrix = dataset + (6 * (int_turbidity));
254 res += (1.0 - albedo) * (turbidity_rem) *
255 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
256 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
257 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
258 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
259 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
260 pow(solar_elevation, 5.0) * elev_matrix[5]);
263 elev_matrix = dataset + (6 * 10 + 6 * (int_turbidity));
265 res += (albedo) * (turbidity_rem) *
266 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
267 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
268 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
269 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
270 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
271 pow(solar_elevation, 5.0) * elev_matrix[5]);
278 const double expM =
exp(configuration[4] * gamma);
279 const double rayM =
cos(gamma) *
cos(gamma);
281 (1.0 +
cos(gamma) *
cos(gamma)) /
282 pow((1.0 + configuration[8] * configuration[8] - 2.0 * configuration[8] *
cos(gamma)), 1.5);
283 const double zenith =
sqrt(
cos(theta));
285 return (1.0 + configuration[0] *
exp(configuration[1] / (
cos(theta) + 0.01))) *
286 (configuration[2] + configuration[3] * expM + configuration[5] * rayM +
287 configuration[6] * mieM + configuration[7] * zenith);
300 int low_wl = (int)((wavelength - 320.0) / 40.0);
302 if (low_wl < 0 || low_wl >= 11) {
306 double interp = fmod((wavelength - 320.0) / 40.0, 1.0);
309 state->radiances[low_wl] *
state->emission_correction_factor_sky[low_wl];
317 if (low_wl + 1 < 11) {
320 state->radiances[low_wl + 1] *
state->emission_correction_factor_sky[low_wl + 1];
330 const double elevation)
335 state->turbidity = turbidity;
336 state->albedo = albedo;
337 state->elevation = elevation;
339 for (
unsigned int channel = 0; channel < 3; ++channel) {
341 datasetsXYZ[channel],
state->configs[channel], turbidity, albedo, elevation);
void BLI_kdtree_nd_() free(KDTree *tree)
typedef double(DMatrix)[4][4]
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
INLINE Rall1d< T, V, S > exp(const Rall1d< T, V, S > &arg)
const double * ArHosekSkyModel_Dataset
static void ArHosekSkyModel_CookConfiguration(ArHosekSkyModel_Dataset dataset, SKY_ArHosekSkyModelConfiguration config, double turbidity, double albedo, double solar_elevation)
void SKY_arhosekskymodelstate_free(SKY_ArHosekSkyModelState *state)
#define TERRESTRIAL_SOLAR_RADIUS
static double ArHosekSkyModel_CookRadianceConfiguration(ArHosekSkyModel_Radiance_Dataset dataset, double turbidity, double albedo, double solar_elevation)
double SKY_arhosekskymodel_radiance(SKY_ArHosekSkyModelState *state, double theta, double gamma, double wavelength)
const double * ArHosekSkyModel_Radiance_Dataset
static double ArHosekSkyModel_GetRadianceInternal(const SKY_ArHosekSkyModelConfiguration configuration, const double theta, const double gamma)
SKY_ArHosekSkyModelState * SKY_arhosek_xyz_skymodelstate_alloc_init(const double turbidity, const double albedo, const double elevation)
double SKY_ArHosekSkyModelConfiguration[9]
static const double * datasetsXYZ[]
static const double * datasetsXYZRad[]
ccl_device_inline float2 interp(const float2 &a, const float2 &b, float t)