This file is indexed.

/usr/include/osgEarthUtil/LinearLineOfSight is in libosgearth-dev 2.4.0+dfsg-6.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
/* -*-c++-*- */
/* osgEarth - Dynamic map generation toolkit for OpenSceneGraph
* Copyright 2008-2013 Pelican Mapping
* http://osgearth.org
*
* osgEarth is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>
*/
#ifndef OSGEARTHUTIL_LINEAR_LINE_OF_SIGHT
#define OSGEARTHUTIL_LINEAR_LINE_OF_SIGHT

#include <osgEarthUtil/LineOfSight>
#include <osgEarth/MapNode>
#include <osgEarth/MapNodeObserver>
#include <osgEarth/Terrain>
#include <osgEarth/GeoData>
#include <osgEarth/Draggers>

namespace osgEarth { namespace Util
{
    /**
     * A Node that can be used to display point to point line of sight calculations
     */
    class OSGEARTHUTIL_EXPORT LinearLineOfSightNode: public LineOfSightNode, public MapNodeObserver
    {
    public:
        /**
         *Constructs and new LinearLineOfSightNode
         *@param mapNode
         *       The MapNode that this LinearLineOfSightNode will be operating on
         */
        LinearLineOfSightNode( osgEarth::MapNode* mapNode );

        virtual ~LinearLineOfSightNode();

        /**
         *Constructs and new LinearLineOfSightNode
         *@param mapNode
         *       The MapNode that this LinearLineOfSightNode will be operating on
         *@param start
         *       The start point
         *@param end
         *       The end point
         */
        LinearLineOfSightNode( 
            osgEarth::MapNode* mapNode, 
            const GeoPoint&    start,
            const GeoPoint&    end );

        /**
         * Get the start point
         */
        //const osg::Vec3d& getStart() const;
        const GeoPoint& getStart() const;

        /**
         * Gets the start point in world coordinates
         */
        const osg::Vec3d& getStartWorld() const;

        /**
         * Set the start point.  The point should be in the Map's coordinate system.  So if you're dealing with a geocentric map
         * the location should be in the form lon, lat, elevation
         */
        void setStart(const GeoPoint& start);

        /**
         * Get the end point
         */
        const GeoPoint& getEnd() const;

        /**
         * Gets the end point in world coordinates
         */
        const osg::Vec3d& getEndWorld() const;

        /**
         * Set the end point.  The point should be in the Map's coordinate system.  So if you're dealing with a geocentric map
         * the location should be in the form lon, lat, elevation
         */
        void setEnd(const GeoPoint& end);

        /**
         * Gets the hit point.  Only valid is getHasLOS is false.
         */
        const GeoPoint& getHit() const;

        /**
         * Gets the hit point in world coordinates
         */
        const osg::Vec3d& getHitWorld() const;

        /**
         * Gets whether not this calculation has line of sight.
         */
        bool getHasLOS() const;

        /**
         * Set the good color
         */
        void setGoodColor( const osg::Vec4f &color );

        /**
         * Gets the good color
         */
        const osg::Vec4f& getGoodColor() const;

        /**
         * Sets the bad color
         */
        void setBadColor( const osg::Vec4f &color );

        /**
         * Gets the bad color
         */
        const osg::Vec4f& getBadColor() const;

        /**
         * Gets the display mode
         */
        LineOfSight::DisplayMode getDisplayMode() const;

        /**
         * Sets the display mode
         */
        void setDisplayMode( LineOfSight::DisplayMode displayMode );

        /**
         * Called when the underlying terrain has changed.
         */
        void terrainChanged( const osgEarth::TileKey& tileKey, osg::Node* terrain );

        void addChangedCallback( LOSChangedCallback* callback );
        void removeChangedCallback( LOSChangedCallback* callback );

        virtual void traverse(osg::NodeVisitor& nv);

        bool getTerrainOnly() const;

        void setTerrainOnly( bool terrainOnly );

        /**
         * Utility method to compute LOS with a MapNode
         * @param mapNode
         *        The MapNode to intersect
         * @param start
         *        The start point in map coordinates
         * @param end
         *        The end point in map coordinates
         * @param hit
         *        The hit point, in map coordinates.
         * @returns
         *        Whether or not there is line of sight from start to end.  hit is only valid if this function return false.
         */
        //static bool computeLOS( osgEarth::MapNode* mapNode, const osg::Vec3d& start, const osg::Vec3d& end, AltitudeMode altitudeMode, osg::Vec3d& hit );


    public: // MapNodeObserver
        
        /**
         * Gets the MapNode that this LineOfSightNode is operating on.
         */
        virtual osgEarth::MapNode* getMapNode() { return _mapNode.get(); }

        virtual void setMapNode( osgEarth::MapNode* mapNode );


    private:
        osg::Node* getNode();
        void compute(osg::Node* node, bool backgroundThread = false);
        void draw(bool backgroundThread = false);
        void subscribeToTerrain();
        osg::observer_ptr< osgEarth::MapNode > _mapNode;
        bool _hasLOS;

        LineOfSight::DisplayMode _displayMode;    
        osg::Vec4 _goodColor;
        osg::Vec4 _badColor;

        GeoPoint _hit;
        GeoPoint _start;
        GeoPoint _end;

        osg::Vec3d _startWorld;
        osg::Vec3d _endWorld;
        osg::Vec3d _hitWorld;

        LOSChangedCallbackList _changedCallbacks;

        osg::ref_ptr < osgEarth::TerrainCallback > _terrainChangedCallback;

        osg::ref_ptr< osg::Node > _pendingNode;
        bool _clearNeeded;
        bool _terrainOnly;
    };


    /**********************************************************************/


    /**
     * An update callback that allows you to attach a LineOfSightNode to two moving nodes.
     * The update callback will update the start and end points of the LineOfSight calcuation to
     * follow the nodes.
     *
     * Example:
     * LineOfSightNode* los = new LineOfSightNode(myMapNode);
     * los->setUpdateCallback( new LineOfSightTether( startNode, endNode ) );
     */
    class OSGEARTHUTIL_EXPORT LineOfSightTether : public osg::NodeCallback
    {
    public:
        LineOfSightTether(osg::Node* startNode, osg::Node* endNode);

        /** dtor */
        virtual ~LineOfSightTether() { }

        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);  

        osg::Node* startNode() { return _startNode.get(); }
        osg::Node* endNode() { return _endNode.get(); }

    private:
        osg::ref_ptr< osg::Node > _startNode;
        osg::ref_ptr< osg::Node > _endNode;
    };

    /**********************************************************************/

    /**
     * An editor node that allows you to move the start and end points
     * of the LineOfSightNode
     */
    class OSGEARTHUTIL_EXPORT LinearLineOfSightEditor : public osg::Group
    {
    public:
        /**
         * Create a new LineOfSightEditor
         * @param los
         *        The LineOfSightNode to edit
         */
        LinearLineOfSightEditor(LinearLineOfSightNode* los);    
        
        virtual ~LinearLineOfSightEditor();    

        /**
         *Updates the position of the draggers to represent the actual location of the LineOfSightNode.
         *This should be called if the los is changed outside of the editor and would probably benefit
         *from the LineOfSightNode having a callback that notifies listeners that the start/end points have changed.
         */
        void updateDraggers();
    private:
        osg::ref_ptr< LinearLineOfSightNode > _los;
        Dragger* _startDragger;
        Dragger* _endDragger;
        osg::ref_ptr< LOSChangedCallback > _callback;
    };

} } // namespace osgEarth::Util

#endif // OSGEARTHUTIL_LINEAR_LINE_OF_SIGHT