float calendar::sunlight() const { const time_duration now = time_past_midnight( *this ); const time_duration sunrise = time_past_midnight( this->sunrise() ); const time_duration sunset = time_past_midnight( this->sunset() ); double daylight_level = current_daylight_level(); int current_phase = int(moon()); if ( current_phase > int(MOON_PHASE_MAX)/2 ) { current_phase = int(MOON_PHASE_MAX) - current_phase; } int moonlight = 1 + int(current_phase * MOONLIGHT_PER_QUARTER); if( now > sunset + twilight_duration || now < sunrise ) { // Night return moonlight; } else if( now >= sunrise && now <= sunrise + twilight_duration ) { const double percent = ( now - sunrise ) / twilight_duration; return double(moonlight) * (1. - percent) + daylight_level * percent; } else if( now >= sunset && now <= sunset + twilight_duration ) { const double percent = ( now - sunset ) / twilight_duration; return daylight_level * (1. - percent) + double(moonlight) * percent; } else { return daylight_level; } }
float calendar::sunlight() const { int seconds = seconds_past_midnight(); int sunrise_seconds = sunrise().seconds_past_midnight(); int sunset_seconds = sunset().seconds_past_midnight(); double daylight_level = current_daylight_level(); int current_phase = int(moon()); if ( current_phase > int(MOON_PHASE_MAX)/2 ) { current_phase = int(MOON_PHASE_MAX) - current_phase; } int moonlight = 1 + int(current_phase * MOONLIGHT_PER_QUARTER); if( seconds > sunset_seconds + TWILIGHT_SECONDS || seconds < sunrise_seconds ) { // Night return moonlight; } else if( seconds >= sunrise_seconds && seconds <= sunrise_seconds + TWILIGHT_SECONDS ) { double percent = double(seconds - sunrise_seconds) / TWILIGHT_SECONDS; return double(moonlight) * (1. - percent) + daylight_level * percent; } else if( seconds >= sunset_seconds && seconds <= sunset_seconds + TWILIGHT_SECONDS ) { double percent = double(seconds - sunset_seconds) / TWILIGHT_SECONDS; return daylight_level * (1. - percent) + double(moonlight) * percent; } else { return daylight_level; } }