89 # define MATH_PI 3.141592653589793
92 #ifndef MATH_DEG_TO_RAD
93 # define MATH_DEG_TO_RAD (MATH_PI / 180.0)
97 # define DEGREES *MATH_DEG_TO_RAD
100 #ifndef TERRESTRIAL_SOLAR_RADIUS
101 # define TERRESTRIAL_SOLAR_RADIUS ((0.51 DEGREES) / 2.0)
105 # define ALLOC(_struct) ((_struct *)malloc(sizeof(_struct)))
119 double solar_elevation)
121 const double *elev_matrix;
123 int int_turbidity = (int)turbidity;
124 double turbidity_rem = turbidity - (
double)int_turbidity;
126 solar_elevation =
pow(solar_elevation / (
MATH_PI / 2.0), (1.0 / 3.0));
130 elev_matrix = dataset + (9 * 6 * (int_turbidity - 1));
132 for (
unsigned int i = 0; i < 9; ++i) {
135 (1.0 - albedo) * (1.0 - turbidity_rem) *
136 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
137 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
138 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
139 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
140 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
141 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
145 elev_matrix = dataset + (9 * 6 * 10 + 9 * 6 * (int_turbidity - 1));
146 for (
unsigned int i = 0; i < 9; ++i) {
149 (albedo) * (1.0 - turbidity_rem) *
150 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
151 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
152 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
153 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
154 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
155 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
158 if (int_turbidity == 10) {
163 elev_matrix = dataset + (9 * 6 * (int_turbidity));
164 for (
unsigned int i = 0; i < 9; ++i) {
167 (1.0 - albedo) * (turbidity_rem) *
168 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
169 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
170 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
171 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
172 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
173 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
177 elev_matrix = dataset + (9 * 6 * 10 + 9 * 6 * (int_turbidity));
178 for (
unsigned int i = 0; i < 9; ++i) {
181 (albedo) * (turbidity_rem) *
182 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[i] +
183 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[i + 9] +
184 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[i + 18] +
185 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[i + 27] +
186 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[i + 36] +
187 pow(solar_elevation, 5.0) * elev_matrix[i + 45]);
194 double solar_elevation)
196 const double *elev_matrix;
198 int int_turbidity = (int)turbidity;
199 double turbidity_rem = turbidity - (
double)int_turbidity;
201 solar_elevation =
pow(solar_elevation / (
MATH_PI / 2.0), (1.0 / 3.0));
204 elev_matrix = dataset + (6 * (int_turbidity - 1));
206 res = (1.0 - albedo) * (1.0 - turbidity_rem) *
207 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
208 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
209 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
210 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
211 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
212 pow(solar_elevation, 5.0) * elev_matrix[5]);
215 elev_matrix = dataset + (6 * 10 + 6 * (int_turbidity - 1));
217 res += (albedo) * (1.0 - turbidity_rem) *
218 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
219 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
220 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
221 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
222 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
223 pow(solar_elevation, 5.0) * elev_matrix[5]);
224 if (int_turbidity == 10) {
229 elev_matrix = dataset + (6 * (int_turbidity));
231 res += (1.0 - albedo) * (turbidity_rem) *
232 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
233 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
234 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
235 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
236 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
237 pow(solar_elevation, 5.0) * elev_matrix[5]);
240 elev_matrix = dataset + (6 * 10 + 6 * (int_turbidity));
242 res += (albedo) * (turbidity_rem) *
243 (
pow(1.0 - solar_elevation, 5.0) * elev_matrix[0] +
244 5.0 *
pow(1.0 - solar_elevation, 4.0) * solar_elevation * elev_matrix[1] +
245 10.0 *
pow(1.0 - solar_elevation, 3.0) *
pow(solar_elevation, 2.0) * elev_matrix[2] +
246 10.0 *
pow(1.0 - solar_elevation, 2.0) *
pow(solar_elevation, 3.0) * elev_matrix[3] +
247 5.0 * (1.0 - solar_elevation) *
pow(solar_elevation, 4.0) * elev_matrix[4] +
248 pow(solar_elevation, 5.0) * elev_matrix[5]);
255 const double expM =
exp(configuration[4] * gamma);
256 const double rayM =
cos(gamma) *
cos(gamma);
258 (1.0 +
cos(gamma) *
cos(gamma)) /
259 pow((1.0 + configuration[8] * configuration[8] - 2.0 * configuration[8] *
cos(gamma)), 1.5);
260 const double zenith =
sqrt(
cos(theta));
262 return (1.0 + configuration[0] *
exp(configuration[1] / (
cos(theta) + 0.01))) *
263 (configuration[2] + configuration[3] * expM + configuration[5] * rayM +
264 configuration[6] * mieM + configuration[7] * zenith);
277 int low_wl = (int)((wavelength - 320.0) / 40.0);
279 if (low_wl < 0 || low_wl >= 11) {
283 double interp = fmod((wavelength - 320.0) / 40.0, 1.0);
286 state->radiances[low_wl] *
state->emission_correction_factor_sky[low_wl];
294 if (low_wl + 1 < 11) {
297 state->radiances[low_wl + 1] *
state->emission_correction_factor_sky[low_wl + 1];
307 const double elevation)
312 state->turbidity = turbidity;
313 state->albedo = albedo;
314 state->elevation = elevation;
316 for (
unsigned int channel = 0; channel < 3; ++channel) {
318 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
ccl_device_inline float2 interp(const float2 &a, const float2 &b, float t)
ccl_device_inline float3 exp(float3 v)
ccl_device_inline float3 pow(float3 v, float e)
INLINE Rall1d< T, V, S > cos(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[]