This file is indexed.

/usr/include/simgear/io/sg_binobj.hxx is in libsimgear-dev 3.0.0-1.

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
/**
 * \file sg_binobj.hxx
 * Routines to read and write the low level (binary) simgear 3d object format.
 */

// Written by Curtis Olson, started January 2000.
//
// Copyright (C) 2000  Curtis L. Olson  - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
//
// $Id$


#ifndef _SG_BINOBJ_HXX
#define _SG_BINOBJ_HXX

#include <zlib.h> // for gzFile

#include <simgear/compiler.h>
#include <simgear/constants.h>
#include <simgear/math/sg_types.hxx>
#include <simgear/math/SGMath.hxx>

#include <vector>
#include <string>

/** STL Structure used to store object information */
typedef std::vector < int_list > group_list;
typedef group_list::iterator group_list_iterator;
typedef group_list::const_iterator const_group_list_iterator;

// forward decls
class SGBucket;
class SGPath;

/**
 * A class to manipulate the simgear 3d object format.
 * This class provides functionality to both read and write the binary format.
 *
 * Here is a really quick overview of the file syntax:
 *
 * - scenery-file: magic, nobjects, object+
 *
 * - magic: "TG" + version
 *
 * - object: obj_typecode, nproperties, nelements, property+, element+
 *
 * - element: nbytes, BYTE+
 *
 * - property: prop_typecode, nbytes, BYTE+
 *
 * - obj_typecode: bounding sphere | vertices | normals | texcoords |
 *                 points | triangles | fans | strips 
 *
 * - prop_typecode: material_name | ???
 *
 * - nelements: USHORT (Gives us 65536 which ought to be enough, right?)
 *
 * - nproperties: USHORT
 *
 * - *_typecode: CHAR
 *
 * - nbytes: INTEGER (If we used short here that would mean 65536 bytes = 16384
 *                    floats = 5461 vertices which is not enough for future
 *	              growth)
 *
 * - vertex: FLOAT, FLOAT, FLOAT
*/
class SGBinObject {
private:
    unsigned short version;

    SGVec3d gbs_center;
    float gbs_radius;

    std::vector<SGVec3d> wgs84_nodes;	// vertex list
    std::vector<SGVec4f> colors;	// color list
    std::vector<SGVec3f> normals;	// normal list
    std::vector<SGVec2f> texcoords;	// texture coordinate list

    group_list pts_v;		// points vertex index
    group_list pts_n;		// points normal index
    group_list pts_c;		// points color index
    group_list pts_tc;		// points texture coordinate index
    string_list pt_materials;	// points materials

    group_list tris_v;		// triangles vertex index
    group_list tris_n;		// triangles normal index
    group_list tris_c;		// triangles color index
    group_list tris_tc;		// triangles texture coordinate index
    string_list tri_materials;	// triangles materials

    group_list strips_v;	// tristrips vertex index
    group_list strips_n;	// tristrips normal index
    group_list strips_c;	// tristrips color index
    group_list strips_tc;	// tristrips texture coordinate index
    string_list strip_materials;// tristrips materials

    group_list fans_v;		// fans vertex index
    group_list fans_n;		// fans normal index
    group_list fans_c;		// fans color index
    group_list fans_tc;		// fans texture coordinate index
    string_list fan_materials;	// fans materials

    void read_properties(gzFile fp, int nproperties);
    
    void read_object( gzFile fp,
                             int obj_type,
                             int nproperties,
                             int nelements,
                             group_list& vertices, 
                             group_list& normals,
                             group_list& colors,
                             group_list& texCoords,
                             string_list& materials);
                             
    void write_header(gzFile fp, int type, int nProps, int nElements);
    void write_objects(gzFile fp, int type, const group_list& verts,
        const group_list& normals, const group_list& colors, 
        const group_list& texCoords, const string_list& materials);
        
    unsigned int count_objects(const string_list& materials);
public:

    inline unsigned short get_version() const { return version; }

    inline const SGVec3d& get_gbs_center() const { return gbs_center; }
    inline void set_gbs_center( const SGVec3d& p ) { gbs_center = p; }

    inline float get_gbs_radius() const { return gbs_radius; }
    inline void set_gbs_radius( float r ) { gbs_radius = r; }

    inline const std::vector<SGVec3d>& get_wgs84_nodes() const
    { return wgs84_nodes; }
    inline void set_wgs84_nodes( const std::vector<SGVec3d>& n )
    { wgs84_nodes = n; }

    inline const std::vector<SGVec4f>& get_colors() const { return colors; }
    inline void set_colors( const std::vector<SGVec4f>& c ) { colors = c; }
    
    inline const std::vector<SGVec3f>& get_normals() const { return normals; }
    inline void set_normals( const std::vector<SGVec3f>& n ) { normals = n; }
    
    inline const std::vector<SGVec2f>& get_texcoords() const { return texcoords; }
    inline void set_texcoords( const std::vector<SGVec2f>& t ) { texcoords = t; }
    
    inline const group_list& get_pts_v() const { return pts_v; }
    inline void set_pts_v( const group_list& g ) { pts_v = g; }
    inline const group_list& get_pts_n() const { return pts_n; }
    inline void set_pts_n( const group_list& g ) { pts_n = g; }
    inline const group_list& get_pts_c() const { return pts_c; }
    inline void set_pts_c( const group_list& g ) { pts_c = g; }
    inline const group_list& get_pts_tc() const { return pts_tc; }
    inline void set_pts_tc( const group_list& g ) { pts_tc = g; }
    inline const string_list& get_pt_materials() const { return pt_materials; }
    inline void set_pt_materials( const string_list& s ) { pt_materials = s; }

    inline const group_list& get_tris_v() const { return tris_v; }
    inline void set_tris_v( const group_list& g ) { tris_v = g; }
    inline const group_list& get_tris_n() const { return tris_n; }
    inline void set_tris_n( const group_list& g ) { tris_n = g; }
    inline const group_list& get_tris_c() const { return tris_c; }
    inline void set_tris_c( const group_list& g ) { tris_c = g; }
    inline const group_list& get_tris_tc() const { return tris_tc; }
    inline void set_tris_tc( const group_list& g ) { tris_tc = g; }
    inline const string_list& get_tri_materials() const { return tri_materials; }
    inline void set_tri_materials( const string_list& s ) { tri_materials = s; }
    
    inline const group_list& get_strips_v() const { return strips_v; }
    inline void set_strips_v( const group_list& g ) { strips_v = g; }
    inline const group_list& get_strips_n() const { return strips_n; }
    inline void set_strips_n( const group_list& g ) { strips_n = g; }
    inline const group_list& get_strips_c() const { return strips_c; }
    inline void set_strips_c( const group_list& g ) { strips_c = g; }

    inline const group_list& get_strips_tc() const { return strips_tc; }
    inline void set_strips_tc( const group_list& g ) { strips_tc = g; }
    inline const string_list& get_strip_materials() const { return strip_materials; }
    inline void set_strip_materials( const string_list& s ) { strip_materials = s; }
    
    inline const group_list& get_fans_v() const { return fans_v; }
    inline void set_fans_v( const group_list& g ) { fans_v = g; }
    inline const group_list& get_fans_n() const { return fans_n; }
    inline void set_fans_n( const group_list& g ) { fans_n = g; }
    inline const group_list& get_fans_c() const { return fans_c; }
    inline void set_fans_c( const group_list& g ) { fans_c = g; }

    inline const group_list& get_fans_tc() const { return fans_tc; }
    inline void set_fans_tc( const group_list& g ) { fans_tc = g; }
    inline const string_list& get_fan_materials() const { return fan_materials; }
    inline void set_fan_materials( const string_list& s ) { fan_materials = s; }

    /**
     * Read a binary file object and populate the provided structures.
     * @param file input file name
     * @return result of read
     */
    bool read_bin( const std::string& file );

    /** 
     * Write out the structures to a binary file.  We assume that the
     * groups come to us sorted by material property.  If not, things
     * don't break, but the result won't be as optimal.
     * @param base name of output path
     * @param name name of output file
     * @param b bucket for object location
     * @return result of write
     */
    bool write_bin( const std::string& base, const std::string& name, const SGBucket& b );


    bool write_bin_file(const SGPath& file);

    /**
     * Write out the structures to an ASCII file.  We assume that the
     * groups come to us sorted by material property.  If not, things
     * don't break, but the result won't be as optimal.
     * @param base name of output path
     * @param name name of output file
     * @param b bucket for object location
     * @return result of write
     */
    bool write_ascii( const std::string& base, const std::string& name,
		      const SGBucket& b );
};

#endif // _SG_BINOBJ_HXX