]> git.mxchange.org Git - flightgear.git/blobdiff - src/Instrumentation/wxradar.cxx
Refactor morse and beacon as singleton
[flightgear.git] / src / Instrumentation / wxradar.cxx
index d88d0cde98b77b13a349a0ed90d6dabd178c5dc6..acbd1b6cfebf0c11afe378d1ed2aafd758df262f 100644 (file)
@@ -38,7 +38,6 @@
 
 #include <simgear/constants.h>
 #include <simgear/misc/sg_path.hxx>
-#include <simgear/environment/visual_enviro.hxx>
 #include <simgear/scene/model/model.hxx>
 #include <simgear/structure/exception.hxx>
 #include <simgear/misc/sg_path.hxx>
@@ -137,7 +136,7 @@ wxRadarBg::init ()
     SGPath tpath = globals->resolve_aircraft_path(path);
 
     // no mipmap or else alpha will mix with pixels on the border of shapes, ruining the effect
-    _wxEcho = SGLoadTexture2D(tpath, false, false);
+    _wxEcho = SGLoadTexture2D(tpath, NULL, false, false);
 
 
     _Instrument->setFloatValue("trk", 0.0);
@@ -379,90 +378,99 @@ wxRadarBg::update (double delta_time_sec)
         _texCoords->clear();
         _textGeode->removeDrawables(0, _textGeode->getNumDrawables());
 
+#if 0
+        //TODO FIXME Mask below (only used for ARC mode) isn't properly aligned, i.e.
+        // it assumes the a/c position at the center of the display - though it's somewhere at
+        // bottom part for ARC mode.
+        // The mask hadn't worked at all for a while (probably since the OSG port) due to
+        // another bug (which is fixed now). Now, the mask is disabled completely until s.o.
+        // adapted the coordinates below. And the mask is only really useful to limit displayed
+        // weather blobs (not support yet).
+        // Aircraft echos are already limited properly through wxradar's "limit-deg" property.
+        {
+            osg::DrawArrays *maskPSet
+                = static_cast<osg::DrawArrays*>(_geom->getPrimitiveSet(1));
+            osg::DrawArrays *trimaskPSet
+                = static_cast<osg::DrawArrays*>(_geom->getPrimitiveSet(2));
+
+            if (_display_mode == ARC) {
+                // erase what is out of sight of antenna
+                /*
+                |\     /|
+                | \   / |
+                |  \ /  |
+                ---------
+                |       |
+                |       |
+                ---------
+                */
+                float xOffset = 256.0f;
+                float yOffset = 200.0f;
+
+                int firstQuadVert = _vertices->size();
+                _texCoords->push_back(osg::Vec2f(0.5f, 0.25f));
+                _vertices->push_back(osg::Vec2f(-xOffset, 0.0 + yOffset));
+                _texCoords->push_back(osg::Vec2f(1.0f, 0.25f));
+                _vertices->push_back(osg::Vec2f(xOffset, 0.0 + yOffset));
+                _texCoords->push_back(osg::Vec2f(1.0f, 0.5f));
+                _vertices->push_back(osg::Vec2f(xOffset, 256.0 + yOffset));
+                _texCoords->push_back(osg::Vec2f(0.5f, 0.5f));
+                _vertices->push_back(osg::Vec2f(-xOffset, 256.0 + yOffset));
+                maskPSet->set(osg::PrimitiveSet::QUADS, firstQuadVert, 4);
+                firstQuadVert += 4;
+
+                // The triangles aren't supposed to be textured, but there's
+                // no need to set up a different Geometry, switch modes,
+                // etc. I happen to know that there's a white pixel in the
+                // texture at 1.0, 0.0 :)
+                float centerY = tan(30 * SG_DEGREES_TO_RADIANS);
+                _vertices->push_back(osg::Vec2f(0.0, 0.0));
+                _vertices->push_back(osg::Vec2f(-256.0, 0.0));
+                _vertices->push_back(osg::Vec2f(-256.0, 256.0 * centerY));
+
+                _vertices->push_back(osg::Vec2f(0.0, 0.0));
+                _vertices->push_back(osg::Vec2f(256.0, 0.0));
+                _vertices->push_back(osg::Vec2f(256.0, 256.0 * centerY));
+
+                _vertices->push_back(osg::Vec2f(-256, 0.0));
+                _vertices->push_back(osg::Vec2f(256.0, 0.0));
+                _vertices->push_back(osg::Vec2f(-256.0, -256.0));
+
+                _vertices->push_back(osg::Vec2f(256, 0.0));
+                _vertices->push_back(osg::Vec2f(256.0, -256.0));
+                _vertices->push_back(osg::Vec2f(-256.0, -256.0));
+
+                const osg::Vec2f whiteSpot(1.0f, 0.0f);
+                for (int i = 0; i < 3 * 4; i++)
+                    _texCoords->push_back(whiteSpot);
+
+                trimaskPSet->set(osg::PrimitiveSet::TRIANGLES, firstQuadVert, 3 * 4);
+
+            } else
+            {
+                maskPSet->set(osg::PrimitiveSet::QUADS, 0, 0);
+                trimaskPSet->set(osg::PrimitiveSet::TRIANGLES, 0, 0);
+            }
 
-        update_weather();
+            maskPSet->dirty();
+            trimaskPSet->dirty();
+        }
+#endif
 
+        // remember index of next vertex
+        int vIndex = _vertices->size();
+
+        update_weather();
 
         osg::DrawArrays *quadPSet
             = static_cast<osg::DrawArrays*>(_geom->getPrimitiveSet(0));
-        quadPSet->set(osg::PrimitiveSet::QUADS, 0, _vertices->size());
-        quadPSet->dirty();
-
-        // erase what is out of sight of antenna
-        /*
-        |\     /|
-        | \   / |
-        |  \ /  |
-        ---------
-        |       |
-        |       |
-        ---------
-        */
-
-        osg::DrawArrays *maskPSet
-            = static_cast<osg::DrawArrays*>(_geom->getPrimitiveSet(1));
-        osg::DrawArrays *trimaskPSet
-            = static_cast<osg::DrawArrays*>(_geom->getPrimitiveSet(2));
-
-        if (_display_mode == ARC) {
-            float xOffset = 256.0f;
-            float yOffset = 200.0f;
-
-            int firstQuadVert = _vertices->size();
-            _texCoords->push_back(osg::Vec2f(0.5f, 0.25f));
-            _vertices->push_back(osg::Vec2f(-xOffset, 0.0 + yOffset));
-            _texCoords->push_back(osg::Vec2f(1.0f, 0.25f));
-            _vertices->push_back(osg::Vec2f(xOffset, 0.0 + yOffset));
-            _texCoords->push_back(osg::Vec2f(1.0f, 0.5f));
-            _vertices->push_back(osg::Vec2f(xOffset, 256.0 + yOffset));
-            _texCoords->push_back(osg::Vec2f(0.5f, 0.5f));
-            _vertices->push_back(osg::Vec2f(-xOffset, 256.0 + yOffset));
-            maskPSet->set(osg::PrimitiveSet::QUADS, firstQuadVert, 4);
-
-            // The triangles aren't supposed to be textured, but there's
-            // no need to set up a different Geometry, switch modes,
-            // etc. I happen to know that there's a white pixel in the
-            // texture at 1.0, 0.0 :)
-            float centerY = tan(30 * SG_DEGREES_TO_RADIANS);
-            _vertices->push_back(osg::Vec2f(0.0, 0.0));
-            _vertices->push_back(osg::Vec2f(-256.0, 0.0));
-            _vertices->push_back(osg::Vec2f(-256.0, 256.0 * centerY));
-
-            _vertices->push_back(osg::Vec2f(0.0, 0.0));
-            _vertices->push_back(osg::Vec2f(256.0, 0.0));
-            _vertices->push_back(osg::Vec2f(256.0, 256.0 * centerY));
-
-            _vertices->push_back(osg::Vec2f(-256, 0.0));
-            _vertices->push_back(osg::Vec2f(256.0, 0.0));
-            _vertices->push_back(osg::Vec2f(-256.0, -256.0));
-
-            _vertices->push_back(osg::Vec2f(256, 0.0));
-            _vertices->push_back(osg::Vec2f(256.0, -256.0));
-            _vertices->push_back(osg::Vec2f(-256.0, -256.0));
-
-            const osg::Vec2f whiteSpot(1.0f, 0.0f);
-            for (int i = 0; i < 3 * 4; i++)
-                _texCoords->push_back(whiteSpot);
-
-            trimaskPSet->set(osg::PrimitiveSet::TRIANGLES, firstQuadVert + 4, 3 * 4);
-
-        } else {
-            maskPSet->set(osg::PrimitiveSet::QUADS, 0, 0);
-            trimaskPSet->set(osg::PrimitiveSet::TRIANGLES, 0, 0);
-        }
-
-        maskPSet->dirty();
-        trimaskPSet->dirty();
-
-        // draw without mask
-        _vertices->clear();
-        _texCoords->clear();
 
         update_aircraft();
         update_tacan();
         update_heading_marker();
 
-        quadPSet->set(osg::PrimitiveSet::QUADS, 0, _vertices->size());
+        // draw all new vertices are quads
+        quadPSet->set(osg::PrimitiveSet::QUADS, vIndex, _vertices->size()-vIndex);
         quadPSet->dirty();
     }
 }
@@ -472,13 +480,16 @@ void
 wxRadarBg::update_weather()
 {
     string modeButton = _Instrument->getStringValue("mode", "WX");
-    _radarEchoBuffer = *sgEnviro.get_radar_echo();
+// FIXME: implementation of radar echoes missing
+//    _radarEchoBuffer = *sgEnviro.get_radar_echo();
 
     // pretend we have a scan angle bigger then the FOV
     // TODO:check real fov, enlarge if < nn, and do clipping if > mm
 //    const float fovFactor = 1.45f;
     _Instrument->setStringValue("status", modeButton.c_str());
 
+// FIXME: implementation of radar echoes missing
+#if 0
     list_of_SGWxRadarEcho *radarEcho = &_radarEchoBuffer;
     list_of_SGWxRadarEcho::iterator iradarEcho, end = radarEcho->end();
     const float LWClevel[] = { 0.1f, 0.5f, 2.1f };
@@ -558,6 +569,7 @@ wxRadarBg::update_weather()
             addQuad(_vertices, _texCoords, m, texBase);
         }
     }
+#endif
 }