From 3ef71edd818b15ed2ba2f184b8a2dc4ee6198042 Mon Sep 17 00:00:00 2001 From: Paramat Date: Wed, 8 Jun 2016 07:43:27 +0100 Subject: Sky: Fix sunrisebg texture motion (#4199) Top of texture no longer shows above horizon during night and day --- src/sky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/sky.cpp') diff --git a/src/sky.cpp b/src/sky.cpp index 682ff05e3..4ee750c55 100644 --- a/src/sky.cpp +++ b/src/sky.cpp @@ -239,7 +239,7 @@ void Sky::render() float a = easeCurve(MYMAX(0, MYMIN(1, a_))); //std::cerr<<"a_="< #include "settings.h" -#include "camera.h" // CameraModes +#include "camera.h" // CameraModes + -//! constructor Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, ITextureSource *tsrc): scene::ISceneNode(parent, mgr, id), m_visible(true), - m_fallback_bg_color(255,255,255,255), + m_fallback_bg_color(255, 255, 255, 255), m_first_update(true), m_brightness(0.5), m_cloud_brightness(0.5), - m_bgcolor_bright_f(1,1,1,1), - m_skycolor_bright_f(1,1,1,1), - m_cloudcolor_bright_f(1,1,1,1) + m_bgcolor_bright_f(1, 1, 1, 1), + m_skycolor_bright_f(1, 1, 1, 1), + m_cloudcolor_bright_f(1, 1, 1, 1) { setAutomaticCulling(scene::EAC_OFF); - m_box.MaxEdge.set(0,0,0); - m_box.MinEdge.set(0,0,0); + m_box.MaxEdge.set(0, 0, 0); + m_box.MinEdge.set(0, 0, 0); - // create material + // Create material video::SMaterial mat; mat.Lighting = false; mat.ZBuffer = video::ECFN_NEVER; mat.ZWriteEnable = false; - mat.AntiAliasing=0; + mat.AntiAliasing = 0; mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; mat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE; mat.BackfaceCulling = false; @@ -59,14 +59,15 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, m_moon_tonemap = tsrc->isKnownSourceImage("moon_tonemap.png") ? tsrc->getTexture("moon_tonemap.png") : NULL; - if (m_sun_texture){ + if (m_sun_texture) { m_materials[3] = mat; m_materials[3].setTexture(0, m_sun_texture); m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; if (m_sun_tonemap) m_materials[3].Lighting = true; } - if (m_moon_texture){ + + if (m_moon_texture) { m_materials[4] = mat; m_materials[4].setTexture(0, m_moon_texture); m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; @@ -74,11 +75,11 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id, m_materials[4].Lighting = true; } - for(u32 i=0; igetBool("directional_colored_fog"); } + void Sky::OnRegisterSceneNode() { if (IsVisible) @@ -94,10 +96,10 @@ void Sky::OnRegisterSceneNode() scene::ISceneNode::OnRegisterSceneNode(); } -//! renders the node. + void Sky::render() { - if(!m_visible) + if (!m_visible) return; video::IVideoDriver* driver = SceneManager->getVideoDriver(); @@ -108,7 +110,7 @@ void Sky::render() ScopeProfiler sp(g_profiler, "Sky::render()", SPT_AVG); - // draw perspective skybox + // Draw perspective skybox core::matrix4 translate(AbsoluteTransformation); translate.setTranslation(camera->getAbsolutePosition()); @@ -120,16 +122,15 @@ void Sky::render() driver->setTransform(video::ETS_WORLD, translate * scale); - if(m_sunlight_seen) - { + if (m_sunlight_seen) { float sunsize = 0.07; video::SColorf suncolor_f(1, 1, 0, 1); suncolor_f.r = 1; - suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.7+m_time_brightness*(0.5))); - suncolor_f.b = MYMAX(0.0, m_brightness*0.95); + suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.7 + m_time_brightness * 0.5)); + suncolor_f.b = MYMAX(0.0, m_brightness * 0.95); video::SColorf suncolor2_f(1, 1, 1, 1); suncolor_f.r = 1; - suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.85+m_time_brightness*(0.5))); + suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.85 + m_time_brightness * 0.5)); suncolor_f.b = MYMAX(0.0, m_brightness); float moonsize = 0.04; @@ -139,12 +140,12 @@ void Sky::render() float nightlength = 0.415; float wn = nightlength / 2; float wicked_time_of_day = 0; - if(m_time_of_day > wn && m_time_of_day < 1.0 - wn) - wicked_time_of_day = (m_time_of_day - wn)/(1.0-wn*2)*0.5 + 0.25; - else if(m_time_of_day < 0.5) + if (m_time_of_day > wn && m_time_of_day < 1.0 - wn) + wicked_time_of_day = (m_time_of_day - wn) / (1.0 - wn * 2) * 0.5 + 0.25; + else if (m_time_of_day < 0.5) wicked_time_of_day = m_time_of_day / wn * 0.25; else - wicked_time_of_day = 1.0 - ((1.0-m_time_of_day) / wn * 0.25); + wicked_time_of_day = 1.0 - ((1.0 - m_time_of_day) / wn * 0.25); /*std::cerr<<"time_of_day="< " <<"wicked_time_of_day="<lock(); video::SColor* texel = (video::SColor *)(texels + (u32)offset * 4); - video::SColor texel_color (255,texel->getRed(),texel->getGreen(), texel->getBlue()); + video::SColor texel_color (255, texel->getRed(), + texel->getGreen(), texel->getBlue()); m_sun_tonemap->unlock(); m_materials[3].EmissiveColor = texel_color; } - if (m_moon_tonemap){ + + if (m_moon_tonemap) { u8 * texels = (u8 *)m_moon_tonemap->lock(); video::SColor* texel = (video::SColor *)(texels + (u32)offset * 4); - video::SColor texel_color (255,texel->getRed(),texel->getGreen(), texel->getBlue()); + video::SColor texel_color (255, texel->getRed(), + texel->getGreen(), texel->getBlue()); m_moon_tonemap->unlock(); m_materials[4].EmissiveColor = texel_color; } const f32 t = 1.0f; const f32 o = 0.0f; - static const u16 indices[4] = {0,1,2,3}; + static const u16 indices[4] = {0, 1, 2, 3}; video::S3DVertex vertices[4]; driver->setMaterial(m_materials[1]); - //video::SColor cloudyfogcolor(255,255,255,255); video::SColor cloudyfogcolor = m_bgcolor; - //video::SColor cloudyfogcolor = m_bgcolor.getInterpolated(m_skycolor, 0.5); - // Draw far cloudy fog thing - for(u32 j=0; j<4; j++) - { + // Draw far cloudy fog thing blended with skycolor + for (u32 j = 0; j < 4; j++) { video::SColor c = cloudyfogcolor.getInterpolated(m_skycolor, 0.45); - vertices[0] = video::S3DVertex(-1, 0.08,-1, 0,0,1, c, t, t); - vertices[1] = video::S3DVertex( 1, 0.08,-1, 0,0,1, c, o, t); - vertices[2] = video::S3DVertex( 1, 0.12,-1, 0,0,1, c, o, o); - vertices[3] = video::S3DVertex(-1, 0.12,-1, 0,0,1, c, t, o); - for(u32 i=0; i<4; i++){ - if(j==0) + vertices[0] = video::S3DVertex(-1, 0.08, -1, 0, 0, 1, c, t, t); + vertices[1] = video::S3DVertex( 1, 0.08, -1, 0, 0, 1, c, o, t); + vertices[2] = video::S3DVertex( 1, 0.12, -1, 0, 0, 1, c, o, o); + vertices[3] = video::S3DVertex(-1, 0.12, -1, 0, 0, 1, c, t, o); + for (u32 i = 0; i < 4; i++) { + if (j == 0) // Don't switch {} - else if(j==1) + else if (j == 1) // Switch from -Z (south) to +X (east) vertices[i].Pos.rotateXZBy(90); - else if(j==2) + else if (j == 2) // Switch from -Z (south) to -X (west) vertices[i].Pos.rotateXZBy(-90); else - // Switch from -Z (south) to -Z (north) + // Switch from -Z (south) to +Z (north) vertices[i].Pos.rotateXZBy(-180); } driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); } - for(u32 j=0; j<4; j++) - { + + // Draw far cloudy fog thing + for (u32 j = 0; j < 4; j++) { video::SColor c = cloudyfogcolor; - vertices[0] = video::S3DVertex(-1,-1.0,-1, 0,0,1, c, t, t); - vertices[1] = video::S3DVertex( 1,-1.0,-1, 0,0,1, c, o, t); - vertices[2] = video::S3DVertex( 1, 0.08,-1, 0,0,1, c, o, o); - vertices[3] = video::S3DVertex(-1, 0.08,-1, 0,0,1, c, t, o); - for(u32 i=0; i<4; i++){ - if(j==0) + vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t); + vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 0, 1, c, o, t); + vertices[2] = video::S3DVertex( 1, 0.08, -1, 0, 0, 1, c, o, o); + vertices[3] = video::S3DVertex(-1, 0.08, -1, 0, 0, 1, c, t, o); + for (u32 i = 0; i < 4; i++) { + if (j == 0) // Don't switch {} - else if(j==1) + else if (j == 1) // Switch from -Z (south) to +X (east) vertices[i].Pos.rotateXZBy(90); - else if(j==2) + else if (j == 2) // Switch from -Z (south) to -X (west) vertices[i].Pos.rotateXZBy(-90); else - // Switch from -Z (south) to -Z (north) + // Switch from -Z (south) to +Z (north) vertices[i].Pos.rotateXZBy(-180); } driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); @@ -232,20 +234,21 @@ void Sky::render() driver->setMaterial(m_materials[2]); + // Draw sunrise/sunset horizon glow texture (textures/base/pack/sunrisebg.png) { float mid1 = 0.25; - float mid = (wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1)); + float mid = wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1); float a_ = 1.0 - fabs(wicked_time_of_day - mid) * 35.0; float a = easeCurve(MYMAX(0, MYMIN(1, a_))); //std::cerr<<"a_="<