CAO/SAO: Nicer velocity-controlled, interpolated rotation property:
[oweals/minetest.git] / src / sky.cpp
index 3176ea936f0d0dfedcf8cd12e58bd977d65d16c9..02e882592b9ef35df75467a28b0b86eb2c0f9802 100644 (file)
@@ -8,13 +8,14 @@
 #include "profiler.h"
 #include "util/numeric.h"
 #include <cmath>
+#include "client/renderingengine.h"
 #include "settings.h"
 #include "camera.h"  // CameraModes
 
 
-Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
-               ITextureSource *tsrc):
-               scene::ISceneNode(parent, mgr, id)
+Sky::Sky(s32 id, ITextureSource *tsrc):
+               scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(),
+                       RenderingEngine::get_scene_manager(), id)
 {
        setAutomaticCulling(scene::EAC_OFF);
        m_box.MaxEdge.set(0, 0, 0);
@@ -67,13 +68,13 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
                        m_materials[4].Lighting = true;
        }
 
-       for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
-               m_stars[i] = v3f(
+       for (v3f &star : m_stars) {
+               star = v3f(
                        myrand_range(-10000, 10000),
                        myrand_range(-10000, 10000),
                        myrand_range(-10000, 10000)
                );
-               m_stars[i].normalize();
+               star.normalize();
        }
 
        m_directional_colored_fog = g_settings->getBool("directional_colored_fog");
@@ -183,19 +184,19 @@ void Sky::render()
                        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++) {
+                       for (video::S3DVertex &vertex : vertices) {
                                if (j == 0)
                                        // Don't switch
                                        {}
                                else if (j == 1)
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXZBy(90);
                                else if (j == 2)
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXZBy(-90);
                                else
                                        // Switch from -Z (south) to +Z (north)
-                                       vertices[i].Pos.rotateXZBy(-180);
+                                       vertex.Pos.rotateXZBy(-180);
                        }
                        driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                }
@@ -207,19 +208,19 @@ void Sky::render()
                        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++) {
+                       for (video::S3DVertex &vertex : vertices) {
                                if (j == 0)
                                        // Don't switch
                                        {}
                                else if (j == 1)
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXZBy(90);
                                else if (j == 2)
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXZBy(-90);
                                else
                                        // Switch from -Z (south) to +Z (north)
-                                       vertices[i].Pos.rotateXZBy(-180);
+                                       vertex.Pos.rotateXZBy(-180);
                        }
                        driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                }
@@ -232,6 +233,10 @@ void Sky::render()
                vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o);
                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
+               // If sun, moon and stars are (temporarily) disabled, abort here
+               if (!m_bodies_visible)
+                       return;
+
                driver->setMaterial(m_materials[2]);
 
                // Draw sunrise/sunset horizon glow texture (textures/base/pack/sunrisebg.png)
@@ -247,13 +252,13 @@ void Sky::render()
                        vertices[1] = video::S3DVertex( 1, -0.05 + y, -1, 0, 0, 1, c, o, t);
                        vertices[2] = video::S3DVertex( 1,   0.2 + y, -1, 0, 0, 1, c, o, o);
                        vertices[3] = video::S3DVertex(-1,   0.2 + y, -1, 0, 0, 1, c, t, o);
-                       for (u32 i = 0; i < 4; i++) {
+                       for (video::S3DVertex &vertex : vertices) {
                                if (wicked_time_of_day < 0.5)
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXZBy(90);
                                else
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXZBy(-90);
                        }
                        driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                }
@@ -269,10 +274,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
@@ -283,10 +288,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
@@ -295,10 +300,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, suncolor, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, suncolor, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, suncolor, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
@@ -307,10 +312,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, suncolor2, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, suncolor2, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, suncolor2, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                        } else {
@@ -325,10 +330,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
-                               for(u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                        }
@@ -345,10 +350,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
@@ -359,10 +364,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
@@ -371,10 +376,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, mooncolor, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, mooncolor, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, mooncolor, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
 
@@ -383,10 +388,10 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d2,-d,  -1, 0, 0, 1, mooncolor2, o, t);
                                vertices[2] = video::S3DVertex( d2, d2, -1, 0, 0, 1, mooncolor2, o, o);
                                vertices[3] = video::S3DVertex(-d,  d2, -1, 0, 0, 1, mooncolor2, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                        } else {
@@ -401,18 +406,18 @@ void Sky::render()
                                vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
                                vertices[2] = video::S3DVertex( d,  d, -1, 0, 0, 1, c, o, o);
                                vertices[3] = video::S3DVertex(-d,  d, -1, 0, 0, 1, c, t, o);
-                               for (u32 i = 0; i < 4; i++) {
+                               for (video::S3DVertex &vertex : vertices) {
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
-                                       vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
+                                       vertex.Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
                                }
                                driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                        }
                }
 
                // Draw stars
-               driver->setMaterial(m_materials[1]);
                do {
+                       driver->setMaterial(m_materials[1]);
                        float starbrightness = MYMAX(0, MYMIN(1,
                                (0.285 - fabs(wicked_time_of_day < 0.5 ?
                                wicked_time_of_day : (1.0 - wicked_time_of_day))) * 10));
@@ -455,7 +460,7 @@ void Sky::render()
                        driver->drawVertexPrimitiveList(vertices, SKY_STAR_COUNT * 4,
                                indices, SKY_STAR_COUNT, video::EVT_STANDARD,
                                scene::EPT_QUADS, video::EIT_16BIT);
-               } while(0);
+               } while(false);
 
                // Draw far cloudy fog thing below east and west horizons
                for (u32 j = 0; j < 2; j++) {
@@ -464,14 +469,14 @@ void Sky::render()
                        vertices[1] = video::S3DVertex( 1, -1.0,  -1, 0, 0, 1, c, o, t);
                        vertices[2] = video::S3DVertex( 1, -0.02, -1, 0, 0, 1, c, o, o);
                        vertices[3] = video::S3DVertex(-1, -0.02, -1, 0, 0, 1, c, t, o);
-                       for (u32 i = 0; i < 4; i++) {
+                       for (video::S3DVertex &vertex : vertices) {
                                //if (wicked_time_of_day < 0.5)
                                if (j == 0)
                                        // Switch from -Z (south) to +X (east)
-                                       vertices[i].Pos.rotateXZBy(90);
+                                       vertex.Pos.rotateXZBy(90);
                                else
                                        // Switch from -Z (south) to -X (west)
-                                       vertices[i].Pos.rotateXZBy(-90);
+                                       vertex.Pos.rotateXZBy(-90);
                        }
                        driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
                }
@@ -500,6 +505,7 @@ void Sky::update(float time_of_day, float time_brightness,
        m_time_of_day = time_of_day;
        m_time_brightness = time_brightness;
        m_sunlight_seen = sunlight_seen;
+       m_bodies_visible = true;
 
        bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.35);