skylight(yaw_pitch sun_position, float turbidity = 6.0f) : sun_pos_ (from_spherical(sun_position)) , turbidity_ (turbidity) { thetas_ = std::acos(dot_prod(sun_pos_, vector(0, 0, 1))); compute_zenith_color(); compute_distribution_coefficients(); compute_term(); }
void sun_lightmap::add(sun_lightmap::rays& r, float raylen, yaw_pitch dir2) const { const vector half(0.5, 0.5, 0.5); for (int d(0); d < 6; ++d) { vector normal(dir_vector[d]); vector origin(half + normal * 0.6f); vector dir(from_spherical(dir2.x, dir2.y)); float weight(dot_prod(dir, normal)); if (weight > 0) r[d].add(voxel_raycast(origin, origin + dir * raylen), weight); } }
const vector3<t> from_spherical(const vector3<t>& sph) { return from_spherical(sph.x, sph.y, sph.z); }
const vector3<t> from_spherical(const vector2<t>& yaw_pitch) { return from_spherical(yaw_pitch.x, yaw_pitch.y); }
const vector3<t> from_spherical(t phi, t theta, t distance) { return from_spherical(phi, theta) * distance; }