void Sky::update(float time_of_day, float time_brightness, float direct_brightness, bool sunlight_seen) { // Stabilize initial brightness and color values by flooding updates if(m_first_update){ /*dstream<<"First update with time_of_day="<<time_of_day <<" time_brightness="<<time_brightness <<" direct_brightness="<<direct_brightness <<" sunlight_seen="<<sunlight_seen<<std::endl;*/ m_first_update = false; for(u32 i=0; i<100; i++){ update(time_of_day, time_brightness, direct_brightness, sunlight_seen); } return; } m_time_of_day = time_of_day; m_time_brightness = time_brightness; m_sunlight_seen = sunlight_seen; bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.35); //video::SColorf bgcolor_bright_normal_f(170./255,200./255,230./255, 1.0); video::SColorf bgcolor_bright_normal_f(155./255,193./255,240./255, 1.0); video::SColorf bgcolor_bright_indoor_f(100./255,100./255,100./255, 1.0); //video::SColorf bgcolor_bright_dawn_f(0.666,200./255*0.7,230./255*0.5,1.0); //video::SColorf bgcolor_bright_dawn_f(0.666,0.549,0.220,1.0); //video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.0, 1.0); //video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.2,1.0); video::SColorf bgcolor_bright_dawn_f (155./255*1.2,193./255,240./255, 1.0); video::SColorf skycolor_bright_normal_f = video::SColor(255, 140, 186, 250); video::SColorf skycolor_bright_dawn_f = video::SColor(255, 180, 186, 250); video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 240,240,255); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5); video::SColorf cloudcolor_bright_dawn_f(1.0, 0.875, 0.75); float cloud_color_change_fraction = 0.95; if(sunlight_seen){ if(fabs(time_brightness - m_brightness) < 0.2){ m_brightness = m_brightness * 0.95 + time_brightness * 0.05; } else { m_brightness = m_brightness * 0.80 + time_brightness * 0.20; cloud_color_change_fraction = 0.0; } } else{ if(direct_brightness < m_brightness) m_brightness = m_brightness * 0.95 + direct_brightness * 0.05; else m_brightness = m_brightness * 0.98 + direct_brightness * 0.02; } m_clouds_visible = true; float color_change_fraction = 0.98; if(sunlight_seen){ if(is_dawn){ m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_dawn_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( skycolor_bright_dawn_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_dawn_f, color_change_fraction); } else { m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_normal_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( skycolor_bright_normal_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_normal_f, color_change_fraction); } } else { m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_indoor_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( bgcolor_bright_indoor_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_normal_f, color_change_fraction); m_clouds_visible = false; } // Horizon coloring based on sun and moon direction during sunset and sunrise video::SColor pointcolor = video::SColor(255, 255, 255, m_bgcolor.getAlpha()); if (m_directional_colored_fog) { if (m_horizon_blend() != 0) { // calculate hemisphere value from yaw f32 pointcolor_blend = wrapDegrees_0_360(m_player->getYaw() + 90); if (pointcolor_blend > 180) pointcolor_blend = 360 - pointcolor_blend; pointcolor_blend /= 180; // bound view angle to determine where transition starts and ends pointcolor_blend = rangelim(1 - pointcolor_blend * 1.375, 0, 1 / 1.375) * 1.375; // combine the colors when looking up or down, otherwise turning looks weird pointcolor_blend += (0.5 - pointcolor_blend) * (1 - MYMIN((90 - std::abs(m_player->getPitch())) / 90 * 1.5, 1)); // invert direction to match where the sun and moon are rising if (m_time_of_day > 0.5) pointcolor_blend = 1 - pointcolor_blend; // horizon colors of sun and moon f32 pointcolor_light = rangelim(m_time_brightness * 3, 0.2, 1); video::SColorf pointcolor_sun_f(1, 1, 1, 1); pointcolor_sun_f.r = pointcolor_light * 1; pointcolor_sun_f.b = pointcolor_light * (0.25 + (rangelim(m_time_brightness, 0.25, 0.75) - 0.25) * 2 * 0.75); pointcolor_sun_f.g = pointcolor_light * (pointcolor_sun_f.b * 0.375 + (rangelim(m_time_brightness, 0.05, 0.15) - 0.05) * 10 * 0.625); video::SColorf pointcolor_moon_f(0.5 * pointcolor_light, 0.6 * pointcolor_light, 0.8 * pointcolor_light, 1); video::SColor pointcolor_sun = pointcolor_sun_f.toSColor(); video::SColor pointcolor_moon = pointcolor_moon_f.toSColor(); // calculate the blend color pointcolor = m_mix_scolor(pointcolor_moon, pointcolor_sun, pointcolor_blend); } } video::SColor bgcolor_bright = m_bgcolor_bright_f.toSColor(); m_bgcolor = video::SColor( 255, bgcolor_bright.getRed() * m_brightness, bgcolor_bright.getGreen() * m_brightness, bgcolor_bright.getBlue() * m_brightness); if (m_directional_colored_fog) { m_bgcolor = m_mix_scolor(m_bgcolor, pointcolor, m_horizon_blend() * 0.5); } video::SColor skycolor_bright = m_skycolor_bright_f.toSColor(); m_skycolor = video::SColor( 255, skycolor_bright.getRed() * m_brightness, skycolor_bright.getGreen() * m_brightness, skycolor_bright.getBlue() * m_brightness); if (m_directional_colored_fog) { m_skycolor = m_mix_scolor(m_skycolor, pointcolor, m_horizon_blend() * 0.25); } float cloud_direct_brightness = 0; if(sunlight_seen) { if (!m_directional_colored_fog) { cloud_direct_brightness = time_brightness; if(time_brightness >= 0.2 && time_brightness < 0.7) cloud_direct_brightness *= 1.3; } else { cloud_direct_brightness = MYMIN(m_horizon_blend() * 0.15 + m_time_brightness, 1); } } else { cloud_direct_brightness = direct_brightness; } m_cloud_brightness = m_cloud_brightness * cloud_color_change_fraction + cloud_direct_brightness * (1.0 - cloud_color_change_fraction); m_cloudcolor_f = video::SColorf( m_cloudcolor_bright_f.r * m_cloud_brightness, m_cloudcolor_bright_f.g * m_cloud_brightness, m_cloudcolor_bright_f.b * m_cloud_brightness, 1.0); if (m_directional_colored_fog) { m_cloudcolor_f = m_mix_scolorf(m_cloudcolor_f, video::SColorf(pointcolor), m_horizon_blend() * 0.25); } }
void Sky::update(float time_of_day, float time_brightness, float direct_brightness, bool sunlight_seen) { // Stabilize initial brightness and color values by flooding updates if(m_first_update){ /*dstream<<"First update with time_of_day="<<time_of_day <<" time_brightness="<<time_brightness <<" direct_brightness="<<direct_brightness <<" sunlight_seen="<<sunlight_seen<<std::endl;*/ m_first_update = false; for(u32 i=0; i<100; i++){ update(time_of_day, time_brightness, direct_brightness, sunlight_seen); } return; } m_time_of_day = time_of_day; m_time_brightness = time_brightness; m_sunlight_seen = sunlight_seen; bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.50); video::SColorf bgcolor_bright_normal_f(170./255,200./255,230./255, 1.0); video::SColorf bgcolor_bright_indoor_f(100./255,100./255,100./255, 1.0); //video::SColorf bgcolor_bright_dawn_f(0.666,200./255*0.7,230./255*0.5,1.0); //video::SColorf bgcolor_bright_dawn_f(0.666,0.549,0.220,1.0); //video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.0, 1.0); video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.2,1.0); video::SColorf skycolor_bright_normal_f = video::SColor(255, 140, 186, 250); video::SColorf skycolor_bright_dawn_f = video::SColor(255, 180, 186, 250); video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 240,240,255); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44); video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5); if(sunlight_seen){ //m_brightness = m_brightness * 0.95 + direct_brightness * 0.05; m_brightness = m_brightness * 0.95 + time_brightness * 0.05; } else{ if(direct_brightness < m_brightness) m_brightness = m_brightness * 0.95 + direct_brightness * 0.05; else m_brightness = m_brightness * 0.98 + direct_brightness * 0.02; } m_clouds_visible = true; float color_change_fraction = 0.98; if(sunlight_seen){ if(is_dawn){ m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_dawn_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( skycolor_bright_dawn_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_dawn_f, color_change_fraction); } else { m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_normal_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( skycolor_bright_normal_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_normal_f, color_change_fraction); } } else { m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_indoor_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_normal_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( bgcolor_bright_indoor_f, color_change_fraction); m_clouds_visible = false; } video::SColor bgcolor_bright = m_bgcolor_bright_f.toSColor(); m_bgcolor = video::SColor( 255, bgcolor_bright.getRed() * m_brightness, bgcolor_bright.getGreen() * m_brightness, bgcolor_bright.getBlue() * m_brightness); video::SColor skycolor_bright = m_skycolor_bright_f.toSColor(); m_skycolor = video::SColor( 255, skycolor_bright.getRed() * m_brightness, skycolor_bright.getGreen() * m_brightness, skycolor_bright.getBlue() * m_brightness); float cloud_direct_brightness = 0; if(sunlight_seen){ cloud_direct_brightness = time_brightness; if(time_brightness >= 0.2 && time_brightness < 0.7) cloud_direct_brightness *= 1.3; } else { cloud_direct_brightness = direct_brightness; } m_cloud_brightness = m_cloud_brightness * 0.95 + cloud_direct_brightness * (1.0 - 0.95); m_cloudcolor_f = video::SColorf( m_cloudcolor_bright_f.getRed() * m_cloud_brightness, m_cloudcolor_bright_f.getGreen() * m_cloud_brightness, m_cloudcolor_bright_f.getBlue() * m_cloud_brightness, 1.0); }
void Sky::update(float time_of_day, float time_brightness, float direct_brightness, bool sunlight_seen, CameraMode cam_mode, float yaw, float pitch) { // Stabilize initial brightness and color values by flooding updates if(m_first_update){ /*dstream<<"First update with time_of_day="<<time_of_day <<" time_brightness="<<time_brightness <<" direct_brightness="<<direct_brightness <<" sunlight_seen="<<sunlight_seen<<std::endl;*/ m_first_update = false; for(u32 i=0; i<100; i++){ update(time_of_day, time_brightness, direct_brightness, sunlight_seen, cam_mode, yaw, pitch); } return; } scene::ICameraSceneNode* camera = SceneManager->getActiveCamera(); v3POS player_position = floatToInt(camera->getPosition(), BS)+camera_offset; float shift1 = (float)player_position.Y / MAP_GENERATION_LIMIT; float height_color = 1; if (shift1 > 0) height_color -= shift1*0.8; m_time_of_day = time_of_day; m_time_brightness = time_brightness; m_sunlight_seen = sunlight_seen; bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.35); //video::SColorf bgcolor_bright_normal_f(170./255,200./255,230./255, 1.0); video::SColorf bgcolor_bright_normal_f(155./255,193./255,240./255, 1.0); video::SColorf bgcolor_bright_indoor_f(100./255,100./255,100./255, 1.0); //video::SColorf bgcolor_bright_dawn_f(0.666,200./255*0.7,230./255*0.5,1.0); //video::SColorf bgcolor_bright_dawn_f(0.666,0.549,0.220,1.0); //video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.0, 1.0); //video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.2,1.0); video::SColorf bgcolor_bright_dawn_f (155./255*1.2,193./255,240./255, 1.0); video::SColorf skycolor_bright_normal_f = video::SColor(255, 140, 186, 250); video::SColorf skycolor_bright_dawn_f = video::SColor(255, 180, 186, 250); video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 240,240,255); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44); //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5); video::SColorf cloudcolor_bright_dawn_f(1.0, 0.875, 0.75); float cloud_color_change_fraction = 0.95; if(sunlight_seen){ if(fabs(time_brightness - m_brightness) < 0.2){ m_brightness = m_brightness * 0.95 + time_brightness * 0.05; } else { m_brightness = m_brightness * 0.80 + time_brightness * 0.20; cloud_color_change_fraction = 0.0; } } else{ if(direct_brightness < m_brightness) m_brightness = m_brightness * 0.95 + direct_brightness * 0.05; else m_brightness = m_brightness * 0.98 + direct_brightness * 0.02; } m_clouds_visible = true; float color_change_fraction = 0.98; if(sunlight_seen){ if(is_dawn){ m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_dawn_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( skycolor_bright_dawn_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_dawn_f, color_change_fraction); } else { m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_normal_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( skycolor_bright_normal_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_normal_f, color_change_fraction); } } else { m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated( bgcolor_bright_indoor_f, color_change_fraction); m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated( bgcolor_bright_indoor_f, color_change_fraction); m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated( cloudcolor_bright_normal_f, color_change_fraction); m_clouds_visible = false; } video::SColor bgcolor_bright = m_bgcolor_bright_f.toSColor(); m_bgcolor = video::SColor( 255, bgcolor_bright.getRed() * m_brightness* height_color, bgcolor_bright.getGreen() * m_brightness* height_color, bgcolor_bright.getBlue() * m_brightness* height_color); video::SColor skycolor_bright = m_skycolor_bright_f.toSColor(); m_skycolor = video::SColor( 255, skycolor_bright.getRed() * m_brightness * height_color, skycolor_bright.getGreen() * m_brightness * height_color, skycolor_bright.getBlue() * m_brightness * height_color); // Horizon coloring based on sun and moon direction during sunset and sunrise video::SColor pointcolor = video::SColor(255, 255, 255, m_bgcolor.getAlpha()); if (m_directional_colored_fog) { if (m_horizon_blend() != 0) { // calculate hemisphere value from yaw, (inverted in third person front view) s8 dir_factor = 1; if (cam_mode > CAMERA_MODE_THIRD) dir_factor = -1; f32 pointcolor_blend = wrapDegrees_0_360( yaw*dir_factor + 90); if (pointcolor_blend > 180) pointcolor_blend = 360 - pointcolor_blend; pointcolor_blend /= 180; // bound view angle to determine where transition starts and ends pointcolor_blend = rangelim(1 - pointcolor_blend * 1.375, 0, 1 / 1.375) * 1.375; // combine the colors when looking up or down, otherwise turning looks weird pointcolor_blend += (0.5 - pointcolor_blend) * (1 - MYMIN((90 - std::abs(pitch)) / 90 * 1.5, 1)); // invert direction to match where the sun and moon are rising if (m_time_of_day > 0.5) pointcolor_blend = 1 - pointcolor_blend; // horizon colors of sun and moon f32 pointcolor_light = rangelim(m_time_brightness * 3, 0.2, 1); video::SColorf pointcolor_sun_f(1, 1, 1, 1); if (m_sun_tonemap) { pointcolor_sun_f.r = pointcolor_light * (float)m_materials[3].EmissiveColor.getRed() / 255; pointcolor_sun_f.b = pointcolor_light * (float)m_materials[3].EmissiveColor.getBlue() / 255; pointcolor_sun_f.g = pointcolor_light * (float)m_materials[3].EmissiveColor.getGreen() / 255; } else { pointcolor_sun_f.r = pointcolor_light * 1; pointcolor_sun_f.b = pointcolor_light * (0.25 + (rangelim(m_time_brightness, 0.25, 0.75) - 0.25) * 2 * 0.75); pointcolor_sun_f.g = pointcolor_light * (pointcolor_sun_f.b * 0.375 + (rangelim(m_time_brightness, 0.05, 0.15) - 0.05) * 10 * 0.625); } video::SColorf pointcolor_moon_f(0.5 * pointcolor_light, 0.6 * pointcolor_light, 0.8 * pointcolor_light, 1); if (m_moon_tonemap) { pointcolor_moon_f.r = pointcolor_light * (float)m_materials[4].EmissiveColor.getRed() / 255; pointcolor_moon_f.b = pointcolor_light * (float)m_materials[4].EmissiveColor.getBlue() / 255; pointcolor_moon_f.g = pointcolor_light * (float)m_materials[4].EmissiveColor.getGreen() / 255; } video::SColor pointcolor_sun = pointcolor_sun_f.toSColor(); video::SColor pointcolor_moon = pointcolor_moon_f.toSColor(); // calculate the blend color pointcolor = m_mix_scolor(pointcolor_moon, pointcolor_sun, pointcolor_blend); } m_bgcolor = m_mix_scolor(m_bgcolor, pointcolor, m_horizon_blend() * 0.5); m_skycolor = m_mix_scolor(m_skycolor, pointcolor, m_horizon_blend() * 0.25); } float cloud_direct_brightness = 0; if(sunlight_seen) { if (!m_directional_colored_fog) { cloud_direct_brightness = time_brightness; if(time_brightness >= 0.2 && time_brightness < 0.7) cloud_direct_brightness *= 1.3; } else { cloud_direct_brightness = MYMIN(m_horizon_blend() * 0.15 + m_time_brightness, 1); } } else { cloud_direct_brightness = direct_brightness; } m_cloud_brightness = m_cloud_brightness * cloud_color_change_fraction + cloud_direct_brightness * (1.0 - cloud_color_change_fraction); m_cloudcolor_f = video::SColorf( m_cloudcolor_bright_f.r * m_cloud_brightness, m_cloudcolor_bright_f.g * m_cloud_brightness, m_cloudcolor_bright_f.b * m_cloud_brightness, 1.0); if (m_directional_colored_fog) { m_cloudcolor_f = m_mix_scolorf(m_cloudcolor_f, video::SColorf(pointcolor), m_horizon_blend() * 0.25); } }