]> git.mxchange.org Git - simgear.git/blob - simgear/io/decode_binobj.cxx
Mac OS X fixes from Markus Morawitz
[simgear.git] / simgear / io / decode_binobj.cxx
1 #include <simgear/compiler.h>
2
3 #include <unistd.h>
4 #include STL_IOSTREAM
5
6 #include "sg_binobj.hxx"
7
8 SG_USING_STD(cout);
9 SG_USING_STD(endl);
10
11
12 int main( int argc, char **argv ) {
13     int i, j;
14
15     // check usage
16     if ( argc != 2 ) {
17         cout << "Usage: " << argv[0] << " binary_obj_file" << endl;
18     }
19
20     SGBinObject obj;
21     bool result = obj.read_bin( argv[1] );
22     if ( !result ) {
23         cout << "error loading: " << argv[1] << endl;
24         exit(-1);
25     }
26
27     cout << "# FGFS Scenery" << endl;
28     cout << "# Version " << obj.get_version() << endl;
29     cout << endl;
30
31     printf("# gbs %.5f %.5f %.5f %.2f\n", obj.get_gbs_center().x(), 
32            obj.get_gbs_center().y(), obj.get_gbs_center().z(),
33            obj.get_gbs_radius());
34     cout << endl;
35
36     point_list nodes = obj.get_wgs84_nodes();
37     cout << "# vertex list" << endl;
38     for ( i = 0; i < (int)nodes.size(); ++i ) {
39         printf("v %.5f %.5f %.5f\n", nodes[i].x(), nodes[i].y(), nodes[i].z() );
40     }
41     cout << endl;
42
43     point_list normals = obj.get_normals();
44     cout << "# vertex normal list" << endl;
45     for ( i = 0; i < (int)normals.size(); ++i ) {
46         printf("vn %.5f %.5f %.5f\n",
47                normals[i].x(), normals[i].y(), normals[i].z() );
48     }
49     cout << endl;
50
51     point_list texcoords = obj.get_texcoords();
52     cout << "# texture coordinate list" << endl;
53     for ( i = 0; i < (int)texcoords.size(); ++i ) {
54         printf("vt %.5f %.5f\n",
55                texcoords[i].x(), texcoords[i].y() );
56     }
57     cout << endl;
58
59     cout << "# geometry groups" << endl;
60     cout << endl;
61
62     string material;
63     int_list vertex_index;
64     int_list normal_index;
65     int_list tex_index;
66
67     // generate points
68     string_list pt_materials = obj.get_pt_materials();
69     group_list pts_v = obj.get_pts_v();
70     group_list pts_n = obj.get_pts_n();
71     for ( i = 0; i < (int)pts_v.size(); ++i ) {
72         material = pt_materials[i];
73         vertex_index = pts_v[i];
74         normal_index = pts_n[i];
75         cout << "# usemtl " << material << endl;
76         cout << "pt ";
77         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
78             cout << vertex_index[j] << "/" << normal_index[j] << " ";
79         }
80         cout << endl;
81     }
82
83     // generate triangles
84     string_list tri_materials = obj.get_tri_materials();
85     group_list tris_v = obj.get_tris_v();
86     group_list tris_n = obj.get_tris_n();
87     group_list tris_tc = obj.get_tris_tc();
88     for ( i = 0; i < (int)tris_v.size(); ++i ) {
89         material = tri_materials[i];
90         vertex_index = tris_v[i];
91         normal_index = tris_n[i];
92         tex_index = tris_tc[i];
93         cout << "# usemtl " << material << endl;
94         cout << "f ";
95         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
96             cout << vertex_index[j];
97             if ( normal_index.size() ) {
98                 cout << "/" << normal_index[j];
99             }
100             cout << "/" << tex_index[j];
101             cout << " ";
102         }
103         cout << endl;
104     }
105
106     // generate strips
107     string_list strip_materials = obj.get_strip_materials();
108     group_list strips_v = obj.get_strips_v();
109     group_list strips_n = obj.get_strips_n();
110     group_list strips_tc = obj.get_strips_tc();
111     for ( i = 0; i < (int)strips_v.size(); ++i ) {
112         material = strip_materials[i];
113         vertex_index = strips_v[i];
114         normal_index = strips_n[i];
115         tex_index = strips_tc[i];
116         cout << "# usemtl " << material << endl;
117         cout << "ts ";
118         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
119             cout << vertex_index[j];
120             if ( normal_index.size() ) {
121                 cout << "/" << normal_index[j];
122             }
123             cout << "/" << tex_index[j] << " ";
124         }
125         cout << endl;
126     }
127
128     // generate fans
129     string_list fan_materials = obj.get_fan_materials();
130     group_list fans_v = obj.get_fans_v();
131     group_list fans_n = obj.get_fans_n();
132     group_list fans_tc = obj.get_fans_tc();
133     for ( i = 0; i < (int)fans_v.size(); ++i ) {
134         material = fan_materials[i];
135         vertex_index = fans_v[i];
136         normal_index = fans_n[i];
137         tex_index = fans_tc[i];
138         cout << "# usemtl " << material << endl;
139         cout << "tf ";
140         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
141             cout << vertex_index[j];
142             if ( normal_index.size() ) {
143                 cout << "/" << normal_index[j];
144             }
145             cout << "/" << tex_index[j] << " ";
146         }
147         cout << endl;
148     }
149 }